@@ -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; | ||||
} | } | ||||