| @@ -35,13 +35,25 @@ namespace Tensorflow | |||||
| public static Tensor reduce_sum(Tensor input, int[] axis = null) | public static Tensor reduce_sum(Tensor input, int[] axis = null) | ||||
| { | { | ||||
| Tensor rank; | Tensor rank; | ||||
| string name; | |||||
| using (var namescop = new ops.name_scope<Tensor>("", "Rank", new List<Tensor> { input })) | using (var namescop = new ops.name_scope<Tensor>("", "Rank", new List<Tensor> { input })) | ||||
| { | { | ||||
| string name = namescop; | |||||
| rank = gen_array_ops.rank(input, name); | |||||
| name = namescop; | |||||
| rank = gen_array_ops.rank(input, namescop); | |||||
| } | } | ||||
| using (var namescope = new ops.name_scope<Tensor>("range", "Range", new List<Tensor> { 0D, input, 1D })) | |||||
| { | |||||
| name = namescope; | |||||
| var start = ops.convert_to_tensor(0D); | |||||
| var limit = ops.convert_to_tensor(input); | |||||
| var delta = ops.convert_to_tensor(1D); | |||||
| var t = gen_math_ops.range(start, limit, delta, name); | |||||
| } | |||||
| var s = gen_math_ops.sum(input, rank); | var s = gen_math_ops.sum(input, rank); | ||||
| return gen_math_ops.range(0, s); | |||||
| return s; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -57,6 +57,8 @@ namespace Tensorflow | |||||
| // cluster ops for compilation. | // cluster ops for compilation. | ||||
| var gradient_uid = ops.get_default_graph().unique_name("uid"); | var gradient_uid = ops.get_default_graph().unique_name("uid"); | ||||
| // Initialize the pending count for ops in the connected subgraph from ys | |||||
| // to the xs. | |||||
| var to_ops = ys1.Select(x => x.op).ToList(); | var to_ops = ys1.Select(x => x.op).ToList(); | ||||
| var from_ops = xs1.Select(x => x.op).ToList(); | var from_ops = xs1.Select(x => x.op).ToList(); | ||||
| var stop_gradient_ops = stop_gradients1.Select(x => x.op).ToList(); | var stop_gradient_ops = stop_gradients1.Select(x => x.op).ToList(); | ||||
| @@ -163,7 +163,7 @@ namespace Tensorflow | |||||
| public override string ToString() | public override string ToString() | ||||
| { | { | ||||
| return $"'{Name}' type={OpType}"; | |||||
| return _handle == IntPtr.Zero ? "Undefined" : $"'{Name}' type={OpType}"; | |||||
| } | } | ||||
| public static implicit operator Operation(IntPtr handle) => new Operation(handle); | public static implicit operator Operation(IntPtr handle) => new Operation(handle); | ||||
| @@ -98,23 +98,16 @@ namespace Tensorflow | |||||
| /// <param name="delta"></param> | /// <param name="delta"></param> | ||||
| /// <param name="name"></param> | /// <param name="name"></param> | ||||
| /// <returns></returns> | /// <returns></returns> | ||||
| public static Tensor range(int start, Tensor limit, int delta = 1) | |||||
| public static Tensor range(Tensor start, Tensor limit, Tensor delta, string name = "") | |||||
| { | { | ||||
| using (var namescope = new ops.name_scope<Tensor>("", "Range", new List<Tensor> { start, limit, delta })) | |||||
| { | |||||
| var start1 = ops.convert_to_tensor(start, "start"); | |||||
| var limit1 = ops.convert_to_tensor(limit, "limit"); | |||||
| var delta1 = ops.convert_to_tensor(delta, "delta"); | |||||
| var keywords = new Dictionary<string, object>(); | |||||
| keywords.Add("start", start1); | |||||
| keywords.Add("limit", limit1); | |||||
| keywords.Add("delta", delta1); | |||||
| var keywords = new Dictionary<string, object>(); | |||||
| keywords.Add("start", start); | |||||
| keywords.Add("limit", limit); | |||||
| keywords.Add("delta", delta); | |||||
| var _op = _op_def_lib._apply_op_helper("Range", namescope, keywords); | |||||
| var _op = _op_def_lib._apply_op_helper("Range", name, keywords); | |||||
| return _op.outputs[0]; | |||||
| } | |||||
| return _op.outputs[0]; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -91,9 +91,6 @@ namespace Tensorflow | |||||
| _snapshot = gen_array_ops.identity(_variable, name = "read"); | _snapshot = gen_array_ops.identity(_variable, name = "read"); | ||||
| } | } | ||||
| // clear g._name_stack | |||||
| ops.get_default_graph().old_stack = ""; | |||||
| ops.add_to_collections(collections, this); | ops.add_to_collections(collections, this); | ||||
| } | } | ||||
| } | } | ||||
| @@ -46,6 +46,8 @@ namespace Tensorflow | |||||
| { | { | ||||
| var g = get_default_graph(); | var g = get_default_graph(); | ||||
| g._name_stack = g.old_stack; | g._name_stack = g.old_stack; | ||||
| // clear g._name_stack | |||||
| g.old_stack = ""; | |||||
| } | } | ||||
| /// <summary> | /// <summary> | ||||
| @@ -54,7 +56,10 @@ namespace Tensorflow | |||||
| /// <param name="ns"></param> | /// <param name="ns"></param> | ||||
| public static implicit operator string(name_scope<T> ns) | public static implicit operator string(name_scope<T> ns) | ||||
| { | { | ||||
| return ns.__enter__(); | |||||
| if (string.IsNullOrEmpty(ns._name_scope)) | |||||
| return ns.__enter__(); | |||||
| else | |||||
| return ns._name_scope; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -47,8 +47,14 @@ namespace Tensorflow | |||||
| public static Tensor convert_to_tensor(object value, string name = "") | public static Tensor convert_to_tensor(object value, string name = "") | ||||
| { | { | ||||
| var nd = tensor_util.convert_to_numpy_ndarray(value); | |||||
| return tf.constant(nd, name); | |||||
| switch (value) | |||||
| { | |||||
| case Tensor val: | |||||
| return val; | |||||
| default: | |||||
| var nd = tensor_util.convert_to_numpy_ndarray(value); | |||||
| return tf.constant(nd, name); | |||||
| } | |||||
| } | } | ||||
| public static unsafe IntPtr _create_c_op(Graph graph, NodeDef node_def, List<Tensor> inputs) | public static unsafe IntPtr _create_c_op(Graph graph, NodeDef node_def, List<Tensor> inputs) | ||||
| @@ -90,7 +96,7 @@ namespace Tensorflow | |||||
| var c_op = c_api.TF_FinishOperation(op_desc, status); | var c_op = c_api.TF_FinishOperation(op_desc, status); | ||||
| if (status.Code != TF_Code.TF_OK) throw new Exception(status.Message); | |||||
| status.Check(true); | |||||
| return c_op; | return c_op; | ||||
| } | } | ||||