| @@ -95,9 +95,9 @@ namespace Tensorflow | |||||
| { | { | ||||
| // 'ready' handles the case where one output gradient relies on | // 'ready' handles the case where one output gradient relies on | ||||
| // another output's gradient. | // another output's gradient. | ||||
| if (!pending_count.ContainsKey(op.Name)) | |||||
| pending_count[op.Name] = 0; | |||||
| bool ready = pending_count[op.Name] == 0; | |||||
| if (!pending_count.ContainsKey(op.name)) | |||||
| pending_count[op.name] = 0; | |||||
| bool ready = pending_count[op.name] == 0; | |||||
| if(ready && !to_ops_set.Contains(op) && reachable_to_ops.Contains(op)) | if(ready && !to_ops_set.Contains(op) && reachable_to_ops.Contains(op)) | ||||
| { | { | ||||
| to_ops_set.Add(op); | to_ops_set.Add(op); | ||||
| @@ -131,7 +131,7 @@ namespace Tensorflow | |||||
| // for ops that do not have gradients. | // for ops that do not have gradients. | ||||
| var grad_fn = ops.get_gradient_function(op); | var grad_fn = ops.get_gradient_function(op); | ||||
| Python.with<ops.name_scope>(new ops.name_scope(op.Name + "_grad"), scope1 => | |||||
| Python.with<ops.name_scope>(new ops.name_scope(op.name + "_grad"), scope1 => | |||||
| { | { | ||||
| string name1 = scope1; | string name1 = scope1; | ||||
| if (grad_fn != null) | if (grad_fn != null) | ||||
| @@ -193,12 +193,12 @@ namespace Tensorflow | |||||
| { | { | ||||
| foreach(var x in _NonEagerInputs(op, xs)) | foreach(var x in _NonEagerInputs(op, xs)) | ||||
| { | { | ||||
| if (!pending_count.ContainsKey(x.op.Name)) | |||||
| pending_count[x.op.Name] = 0; | |||||
| if (!pending_count.ContainsKey(x.op.name)) | |||||
| pending_count[x.op.name] = 0; | |||||
| pending_count[x.op.Name] -= 1; | |||||
| pending_count[x.op.name] -= 1; | |||||
| var ready = pending_count[x.op.Name] == 0; | |||||
| var ready = pending_count[x.op.name] == 0; | |||||
| if(loop_state != null && !ready) | if(loop_state != null && !ready) | ||||
| { | { | ||||
| @@ -281,10 +281,10 @@ namespace Tensorflow | |||||
| bool is_stop_op = true; | bool is_stop_op = true; | ||||
| foreach(var inp in _NonEagerInputs(op, xs)) | foreach(var inp in _NonEagerInputs(op, xs)) | ||||
| { | { | ||||
| if (!pending_count.ContainsKey(inp.op.Name)) | |||||
| pending_count[inp.op.Name] = 0; | |||||
| if (!pending_count.ContainsKey(inp.op.name)) | |||||
| pending_count[inp.op.name] = 0; | |||||
| if (pending_count[inp.op.Name] > 0) | |||||
| if (pending_count[inp.op.name] > 0) | |||||
| { | { | ||||
| is_stop_op = false; | is_stop_op = false; | ||||
| break; | break; | ||||
| @@ -300,17 +300,17 @@ namespace Tensorflow | |||||
| private static Tensor _GetGrad(Dictionary<string, Tensor[][]> grads, Tensor t) | private static Tensor _GetGrad(Dictionary<string, Tensor[][]> grads, Tensor t) | ||||
| { | { | ||||
| var op = t.op; | var op = t.op; | ||||
| if (!grads.ContainsKey(op.Name)) | |||||
| if (!grads.ContainsKey(op.name)) | |||||
| return null; | return null; | ||||
| Tensor[][] op_grads = grads[op.Name]; | |||||
| Tensor[][] op_grads = grads[op.name]; | |||||
| var t_grad = op_grads[t.value_index]; | var t_grad = op_grads[t.value_index]; | ||||
| return t_grad[0]; | return t_grad[0]; | ||||
| } | } | ||||
| private static Tensor[][] _GetGrads(Dictionary<string, Tensor[][]> grads, Operation op) | private static Tensor[][] _GetGrads(Dictionary<string, Tensor[][]> grads, Operation op) | ||||
| { | { | ||||
| if (grads.ContainsKey(op.Name)) | |||||
| return grads[op.Name]; | |||||
| if (grads.ContainsKey(op.name)) | |||||
| return grads[op.name]; | |||||
| else | else | ||||
| return op.outputs.Select(x => new Tensor[0]).ToArray(); | return op.outputs.Select(x => new Tensor[0]).ToArray(); | ||||
| } | } | ||||
| @@ -324,11 +324,11 @@ namespace Tensorflow | |||||
| private static void _SetGrad(Dictionary<string, Tensor[][]> grads, Tensor t, Tensor grad) | private static void _SetGrad(Dictionary<string, Tensor[][]> grads, Tensor t, Tensor grad) | ||||
| { | { | ||||
| var op = t.op; | var op = t.op; | ||||
| Tensor[][] op_grads = grads.ContainsKey(op.Name) ? grads[op.Name] : null; | |||||
| Tensor[][] op_grads = grads.ContainsKey(op.name) ? grads[op.name] : null; | |||||
| if (op_grads == null) | if (op_grads == null) | ||||
| { | { | ||||
| op_grads = op.outputs.Select(x => new Tensor[1]).ToArray(); | op_grads = op.outputs.Select(x => new Tensor[1]).ToArray(); | ||||
| grads[op.Name] = op_grads; | |||||
| grads[op.name] = op_grads; | |||||
| } | } | ||||
| var t_grads = op_grads[t.value_index]; | var t_grads = op_grads[t.value_index]; | ||||
| t_grads[0] = grad; | t_grads[0] = grad; | ||||
| @@ -421,10 +421,10 @@ namespace Tensorflow | |||||
| { | { | ||||
| if (between_ops.Contains(x.op)) | if (between_ops.Contains(x.op)) | ||||
| { | { | ||||
| if (!pending_count.ContainsKey(x.op.Name)) | |||||
| pending_count[x.op.Name] = 0; | |||||
| if (!pending_count.ContainsKey(x.op.name)) | |||||
| pending_count[x.op.name] = 0; | |||||
| pending_count[x.op.Name] += 1; | |||||
| pending_count[x.op.name] += 1; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -150,8 +150,9 @@ namespace Tensorflow | |||||
| _create_op_helper(op, true); | _create_op_helper(op, true); | ||||
| Console.Write($"create_op: {op_type} '{node_def.Name}'"); | Console.Write($"create_op: {op_type} '{node_def.Name}'"); | ||||
| Console.Write($", inputs: {(inputs.Length == 0 ? "empty" : String.Join(",", inputs.Select(x => x.name)))}"); | |||||
| Console.Write($", outputs: {(op.outputs.Length == 0 ? "empty" : String.Join(",", op.outputs.Select(x => x.name)))}"); | |||||
| Console.Write($", inputs: {(inputs.Length == 0 ? "empty" : String.Join(", ", inputs.Select(x => x.name)))}"); | |||||
| Console.Write($", control_inputs: {(control_inputs.Length == 0 ? "empty" : String.Join(", ", control_inputs.Select(x => x.name)))}"); | |||||
| Console.Write($", outputs: {(op.outputs.Length == 0 ? "empty" : String.Join(", ", op.outputs.Select(x => x.name)))}"); | |||||
| Console.WriteLine(); | Console.WriteLine(); | ||||
| return op; | return op; | ||||
| @@ -182,7 +183,7 @@ namespace Tensorflow | |||||
| } | } | ||||
| else if (tensor_or_op is Operation) | else if (tensor_or_op is Operation) | ||||
| { | { | ||||
| return !_unfetchable_ops.Contains((tensor_or_op as Operation).Name); | |||||
| return !_unfetchable_ops.Contains((tensor_or_op as Operation).name); | |||||
| } | } | ||||
| return false; | return false; | ||||
| @@ -12,5 +12,6 @@ namespace Tensorflow | |||||
| { | { | ||||
| string Device { get; } | string Device { get; } | ||||
| Operation op { get; } | Operation op { get; } | ||||
| string name { get; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -20,7 +20,7 @@ namespace Tensorflow | |||||
| private Status status = new Status(); | private Status status = new Status(); | ||||
| public string Name => c_api.StringPiece(c_api.TF_OperationName(_handle)); | |||||
| public string name => c_api.StringPiece(c_api.TF_OperationName(_handle)); | |||||
| public string OpType => c_api.StringPiece(c_api.TF_OperationOpType(_handle)); | public string OpType => c_api.StringPiece(c_api.TF_OperationOpType(_handle)); | ||||
| public string Device => c_api.StringPiece(c_api.TF_OperationDevice(_handle)); | public string Device => c_api.StringPiece(c_api.TF_OperationDevice(_handle)); | ||||
| @@ -210,7 +210,7 @@ namespace Tensorflow | |||||
| public override string ToString() | public override string ToString() | ||||
| { | { | ||||
| return _handle == IntPtr.Zero ? "tf.Operation Undefined" : $"tf.Operation '{Name}' type={OpType}"; | |||||
| return _handle == IntPtr.Zero ? "tf.Operation Undefined" : $"tf.Operation '{name}' type={OpType}"; | |||||
| } | } | ||||
| public static implicit operator Operation(IntPtr handle) => new Operation(handle); | public static implicit operator Operation(IntPtr handle) => new Operation(handle); | ||||
| @@ -73,7 +73,7 @@ namespace Tensorflow | |||||
| { | { | ||||
| if (!graph.is_fetchable(op)) | if (!graph.is_fetchable(op)) | ||||
| { | { | ||||
| throw new Exception($"Operation {op.Name} has been marked as not fetchable."); | |||||
| throw new Exception($"Operation {op.name} has been marked as not fetchable."); | |||||
| } | } | ||||
| } | } | ||||
| @@ -25,7 +25,7 @@ namespace Tensorflow | |||||
| /// <summary> | /// <summary> | ||||
| /// The string name of this tensor. | /// The string name of this tensor. | ||||
| /// </summary> | /// </summary> | ||||
| public string name => $"{(op == null ? "Operation was not named" : $"{op.Name}:{value_index}")}"; | |||||
| public string name => $"{(op == null ? "Operation was not named" : $"{op.name}:{value_index}")}"; | |||||
| public int value_index { get; } | public int value_index { get; } | ||||
| @@ -97,7 +97,7 @@ namespace Tensorflow | |||||
| if (grad == null) | if (grad == null) | ||||
| continue; | continue; | ||||
| var scope_name = var.op.Name; | |||||
| var scope_name = var.op.name; | |||||
| Python.with<ops.name_scope>(new ops.name_scope("update_" + scope_name), scope2 => | Python.with<ops.name_scope>(new ops.name_scope("update_" + scope_name), scope2 => | ||||
| { | { | ||||
| update_ops.Add(processor.update_op(this, grad)); | update_ops.Add(processor.update_op(this, grad)); | ||||
| @@ -116,7 +116,7 @@ namespace Tensorflow | |||||
| { | { | ||||
| FilenameTensorName = filename_tensor.name, | FilenameTensorName = filename_tensor.name, | ||||
| SaveTensorName = save_tensor.name, | SaveTensorName = save_tensor.name, | ||||
| RestoreOpName = restore_op.Name, | |||||
| RestoreOpName = restore_op.name, | |||||
| MaxToKeep = max_to_keep, | MaxToKeep = max_to_keep, | ||||
| Sharded = sharded, | Sharded = sharded, | ||||
| KeepCheckpointEveryNHours = keep_checkpoint_every_n_hours, | KeepCheckpointEveryNHours = keep_checkpoint_every_n_hours, | ||||
| @@ -84,9 +84,9 @@ namespace Tensorflow | |||||
| } | } | ||||
| if (var.op.type == "ReadVariableOp") | if (var.op.type == "ReadVariableOp") | ||||
| name = var.op.inputs[0].op.Name; | |||||
| name = var.op.inputs[0].op.name; | |||||
| else | else | ||||
| name = var.op.Name; | |||||
| name = var.op.name; | |||||
| if (names_to_saveables.ContainsKey(name)) | if (names_to_saveables.ContainsKey(name)) | ||||
| throw new ValueError($"At least two variables have the same name: {name}"); | throw new ValueError($"At least two variables have the same name: {name}"); | ||||
| @@ -143,11 +143,11 @@ namespace Tensorflow | |||||
| private Tensor _safe_initial_value_from_tensor(Tensor tensor, Dictionary<string, Operation> op_cache) | private Tensor _safe_initial_value_from_tensor(Tensor tensor, Dictionary<string, Operation> op_cache) | ||||
| { | { | ||||
| var op = tensor.op; | var op = tensor.op; | ||||
| var new_op = op_cache.ContainsKey(op.Name) ? op_cache[op.Name] : null; | |||||
| var new_op = op_cache.ContainsKey(op.name) ? op_cache[op.name] : null; | |||||
| if(new_op == null) | if(new_op == null) | ||||
| { | { | ||||
| new_op = _safe_initial_value_from_op(op, op_cache); | new_op = _safe_initial_value_from_op(op, op_cache); | ||||
| op_cache[op.Name] = new_op; | |||||
| op_cache[op.name] = new_op; | |||||
| } | } | ||||
| return new_op.outputs[tensor.value_index]; | return new_op.outputs[tensor.value_index]; | ||||
| } | } | ||||
| @@ -185,7 +185,7 @@ namespace Tensorflow | |||||
| /// A `Tensor` that will hold the new value of this variable after | /// A `Tensor` that will hold the new value of this variable after | ||||
| /// the assignment has completed. | /// the assignment has completed. | ||||
| /// </returns> | /// </returns> | ||||
| public ITensorOrOperation assign(Tensor value, bool use_locking = false, string name = "", bool read_value = true) | |||||
| public ITensorOrOperation assign(object value, bool use_locking = false, string name = "", bool read_value = true) | |||||
| { | { | ||||
| var assign = gen_state_ops.assign(_variable, value, use_locking: use_locking, name: name); | var assign = gen_state_ops.assign(_variable, value, use_locking: use_locking, name: name); | ||||
| if (read_value) | if (read_value) | ||||
| @@ -47,7 +47,7 @@ namespace Tensorflow | |||||
| /// <param name="validate_shape"></param> | /// <param name="validate_shape"></param> | ||||
| /// <param name="use_locking"></param> | /// <param name="use_locking"></param> | ||||
| /// <param name="name"></param> | /// <param name="name"></param> | ||||
| public static Tensor assign(Tensor tensor, Tensor value, | |||||
| public static Tensor assign(Tensor tensor, object value, | |||||
| bool validate_shape = true, | bool validate_shape = true, | ||||
| bool use_locking = true, | bool use_locking = true, | ||||
| string name = "") | string name = "") | ||||
| @@ -46,7 +46,7 @@ namespace Tensorflow | |||||
| public void Dispose() | public void Dispose() | ||||
| { | { | ||||
| var g = get_default_graph(); | var g = get_default_graph(); | ||||
| Console.WriteLine($"name_scope: {g._name_stack} -> {old_stack}"); | |||||
| // Console.WriteLine($"name_scope: {g._name_stack} -> {old_stack}"); | |||||
| g._name_stack = old_stack; | g._name_stack = old_stack; | ||||
| } | } | ||||
| @@ -319,7 +319,7 @@ namespace Tensorflow | |||||
| return (oper, out_grads) => | return (oper, out_grads) => | ||||
| { | { | ||||
| Console.WriteLine($"get_gradient_function: {oper.type} '{oper.Name}'"); | |||||
| Console.WriteLine($"get_gradient_function: {oper.type} '{oper.name}'"); | |||||
| switch (oper.type) | switch (oper.type) | ||||
| { | { | ||||
| @@ -414,6 +414,8 @@ namespace Tensorflow | |||||
| return constant_op.constant(value as string[], name); | return constant_op.constant(value as string[], name); | ||||
| case "Int32": | case "Int32": | ||||
| return constant_op.constant(Convert.ToInt32(value), name); | return constant_op.constant(Convert.ToInt32(value), name); | ||||
| case "Single": | |||||
| return constant_op.constant(Convert.ToSingle(value), name); | |||||
| case "Double": | case "Double": | ||||
| return constant_op.constant(Convert.ToDouble(value), name); | return constant_op.constant(Convert.ToDouble(value), name); | ||||
| case "RefVariable": | case "RefVariable": | ||||
| @@ -17,6 +17,7 @@ namespace Tensorflow | |||||
| public static Context context = new Context(new ContextOptions(), new Status()); | public static Context context = new Context(new ContextOptions(), new Status()); | ||||
| public static Graph g = new Graph(); | public static Graph g = new Graph(); | ||||
| public static Session session = new Session(); | |||||
| public static RefVariable Variable<T>(T data, string name = "", TF_DataType dtype = TF_DataType.DtInvalid) | public static RefVariable Variable<T>(T data, string name = "", TF_DataType dtype = TF_DataType.DtInvalid) | ||||
| { | { | ||||
| @@ -48,7 +49,7 @@ namespace Tensorflow | |||||
| public static Session Session() | public static Session Session() | ||||
| { | { | ||||
| return new Session(); | |||||
| return session; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -23,7 +23,7 @@ namespace TensorFlowNET.UnitTest | |||||
| // Make a placeholder operation. | // Make a placeholder operation. | ||||
| var feed = c_test_util.Placeholder(graph, s); | var feed = c_test_util.Placeholder(graph, s); | ||||
| EXPECT_EQ("feed", feed.Name); | |||||
| EXPECT_EQ("feed", feed.name); | |||||
| EXPECT_EQ("Placeholder", feed.OpType); | EXPECT_EQ("Placeholder", feed.OpType); | ||||
| EXPECT_EQ("", feed.Device); | EXPECT_EQ("", feed.Device); | ||||
| EXPECT_EQ(1, feed.NumOutputs); | EXPECT_EQ(1, feed.NumOutputs); | ||||
| @@ -53,7 +53,7 @@ namespace TensorFlowNET.UnitTest | |||||
| EXPECT_EQ(TF_Code.TF_OK, s.Code); | EXPECT_EQ(TF_Code.TF_OK, s.Code); | ||||
| // Test TF_Operation*() query functions. | // Test TF_Operation*() query functions. | ||||
| EXPECT_EQ("add", add.Name); | |||||
| EXPECT_EQ("add", add.name); | |||||
| EXPECT_EQ("AddN", add.OpType); | EXPECT_EQ("AddN", add.OpType); | ||||
| EXPECT_EQ("", add.Device); | EXPECT_EQ("", add.Device); | ||||
| EXPECT_EQ(1, add.NumOutputs); | EXPECT_EQ(1, add.NumOutputs); | ||||
| @@ -49,8 +49,7 @@ namespace TensorFlowNET.UnitTest | |||||
| [TestMethod] | [TestMethod] | ||||
| public void Assign() | public void Assign() | ||||
| { | { | ||||
| var v1 = tf.get_variable("v1", shape: new TensorShape(3), initializer: tf.zeros_initializer); | |||||
| var v1 = tf.Variable(10.0f, name: "v1"); //tf.get_variable("v1", shape: new TensorShape(3), initializer: tf.zeros_initializer); | |||||
| var inc_v1 = v1.assign(v1 + 1.0f); | var inc_v1 = v1.assign(v1 + 1.0f); | ||||
| // Add an op to initialize the variables. | // Add an op to initialize the variables. | ||||
| @@ -73,10 +72,10 @@ namespace TensorFlowNET.UnitTest | |||||
| int result = 0; | int result = 0; | ||||
| Tensor x = tf.Variable(10, name: "x"); | Tensor x = tf.Variable(10, name: "x"); | ||||
| var model = tf.global_variables_initializer(); | |||||
| var init_op = tf.global_variables_initializer(); | |||||
| using (var session = tf.Session()) | using (var session = tf.Session()) | ||||
| { | { | ||||
| session.run(model); | |||||
| session.run(init_op); | |||||
| for(int i = 0; i < 5; i++) | for(int i = 0; i < 5; i++) | ||||
| { | { | ||||
| x = x + 1; | x = x + 1; | ||||