diff --git a/src/TensorFlowNET.Core/APIs/tf.math.cs b/src/TensorFlowNET.Core/APIs/tf.math.cs index 5d74a4df..9c283bbf 100644 --- a/src/TensorFlowNET.Core/APIs/tf.math.cs +++ b/src/TensorFlowNET.Core/APIs/tf.math.cs @@ -35,13 +35,25 @@ namespace Tensorflow public static Tensor reduce_sum(Tensor input, int[] axis = null) { Tensor rank; + string name; using (var namescop = new ops.name_scope("", "Rank", new List { 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("range", "Range", new List { 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); - return gen_math_ops.range(0, s); + return s; } } } diff --git a/src/TensorFlowNET.Core/Gradients/gradients_impl.py.cs b/src/TensorFlowNET.Core/Gradients/gradients_impl.py.cs index edcbd33f..597c4e21 100644 --- a/src/TensorFlowNET.Core/Gradients/gradients_impl.py.cs +++ b/src/TensorFlowNET.Core/Gradients/gradients_impl.py.cs @@ -57,6 +57,8 @@ namespace Tensorflow // cluster ops for compilation. 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 from_ops = xs1.Select(x => x.op).ToList(); var stop_gradient_ops = stop_gradients1.Select(x => x.op).ToList(); diff --git a/src/TensorFlowNET.Core/Operations/Operation.cs b/src/TensorFlowNET.Core/Operations/Operation.cs index aad9c555..783a8ef7 100644 --- a/src/TensorFlowNET.Core/Operations/Operation.cs +++ b/src/TensorFlowNET.Core/Operations/Operation.cs @@ -163,7 +163,7 @@ namespace Tensorflow 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); diff --git a/src/TensorFlowNET.Core/Operations/gen_math_ops.cs b/src/TensorFlowNET.Core/Operations/gen_math_ops.cs index 91e7e629..8767d5ea 100644 --- a/src/TensorFlowNET.Core/Operations/gen_math_ops.cs +++ b/src/TensorFlowNET.Core/Operations/gen_math_ops.cs @@ -98,23 +98,16 @@ namespace Tensorflow /// /// /// - 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("", "Range", new List { 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(); - keywords.Add("start", start1); - keywords.Add("limit", limit1); - keywords.Add("delta", delta1); + var keywords = new Dictionary(); + 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]; } } } diff --git a/src/TensorFlowNET.Core/Variables/RefVariable.cs b/src/TensorFlowNET.Core/Variables/RefVariable.cs index 01a354f0..aa02b5f3 100644 --- a/src/TensorFlowNET.Core/Variables/RefVariable.cs +++ b/src/TensorFlowNET.Core/Variables/RefVariable.cs @@ -91,9 +91,6 @@ namespace Tensorflow _snapshot = gen_array_ops.identity(_variable, name = "read"); } - // clear g._name_stack - ops.get_default_graph().old_stack = ""; - ops.add_to_collections(collections, this); } } diff --git a/src/TensorFlowNET.Core/ops.name_scope.cs b/src/TensorFlowNET.Core/ops.name_scope.cs index 3c7c124e..26b5e114 100644 --- a/src/TensorFlowNET.Core/ops.name_scope.cs +++ b/src/TensorFlowNET.Core/ops.name_scope.cs @@ -46,6 +46,8 @@ namespace Tensorflow { var g = get_default_graph(); g._name_stack = g.old_stack; + // clear g._name_stack + g.old_stack = ""; } /// @@ -54,7 +56,10 @@ namespace Tensorflow /// public static implicit operator string(name_scope ns) { - return ns.__enter__(); + if (string.IsNullOrEmpty(ns._name_scope)) + return ns.__enter__(); + else + return ns._name_scope; } } } diff --git a/src/TensorFlowNET.Core/ops.py.cs b/src/TensorFlowNET.Core/ops.py.cs index 3cc5d18f..feda8bb6 100644 --- a/src/TensorFlowNET.Core/ops.py.cs +++ b/src/TensorFlowNET.Core/ops.py.cs @@ -47,8 +47,14 @@ namespace Tensorflow 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 inputs) @@ -90,7 +96,7 @@ namespace Tensorflow 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; }