| @@ -1,4 +1,5 @@ | |||
| using System; | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow | |||
| { | |||
| @@ -14,18 +15,19 @@ namespace Tensorflow | |||
| int batchSize = 1000; | |||
| // 1 million float tensor 58.5M. | |||
| // 1 million float tensor 68M. | |||
| mm.Execute(10, 100 * batchSize, cases.Constant); | |||
| // 100K float variable 80.5M. | |||
| // 100K float variable 84M. | |||
| mm.Execute(10, 10 * batchSize, cases.Variable); | |||
| // 1 million math add 36.5M. | |||
| // 1 million math add 39M. | |||
| mm.Execute(10, 100 * batchSize, cases.MathAdd); | |||
| // 100K gradient 210M. | |||
| // 100K gradient 44M. | |||
| mm.Execute(10, 10 * batchSize, cases.Gradient); | |||
| // 120M | |||
| Console.WriteLine("Finished."); | |||
| Console.ReadLine(); | |||
| } | |||
| @@ -20,8 +20,10 @@ namespace Tensorflow | |||
| { | |||
| public partial class tensorflow | |||
| { | |||
| public GradientTape GradientTape() | |||
| => new GradientTape(); | |||
| public GradientTape GradientTape(bool persistent = false, | |||
| bool watch_accessed_variables = true) | |||
| => new GradientTape(persistent: persistent, | |||
| watch_accessed_variables: watch_accessed_variables); | |||
| public Tensor[] gradients(Tensor[] ys, | |||
| Tensor[] xs, | |||
| @@ -18,6 +18,9 @@ namespace Tensorflow.Eager | |||
| status.Check(true); | |||
| } | |||
| /// <summary> | |||
| /// Initialize handle and devices if not already done so. | |||
| /// </summary> | |||
| public void ensure_initialized() | |||
| { | |||
| if (_initialized) | |||
| @@ -25,14 +28,20 @@ namespace Tensorflow.Eager | |||
| _initialized = true; | |||
| } | |||
| public void start_step() | |||
| => c_api.TFE_ContextStartStep(_handle); | |||
| public void end_step() | |||
| => c_api.TFE_ContextEndStep(_handle); | |||
| /// <summary> | |||
| /// Dispose any unmanaged resources related to given <paramref name="handle"/>. | |||
| /// </summary> | |||
| protected sealed override void DisposeUnmanagedResources(IntPtr handle) | |||
| => c_api.TFE_DeleteContext(_handle); | |||
| public bool executing_eagerly() => true; | |||
| public bool executing_eagerly() | |||
| => default_execution_mode == EAGER_MODE; | |||
| public string shared_name(string name = null) | |||
| => !string.IsNullOrEmpty(name) || !executing_eagerly() ? | |||
| @@ -8,7 +8,6 @@ namespace Tensorflow.Eager | |||
| { | |||
| public class EagerOperation : Operation | |||
| { | |||
| static Dictionary<string, OpDef> op_dict; | |||
| public string Name { get; set; } | |||
| public new int NumInputs; | |||
| public IntPtr[] InputHandles { get; set; } | |||
| @@ -16,14 +15,12 @@ namespace Tensorflow.Eager | |||
| public new int NumOutputs; | |||
| public IntPtr[] OutputHandles { get; set; } | |||
| public Tensor[] Outputs { get; set; } | |||
| public BindingArray SkipInputIndicesArray { get; set; } | |||
| public unsafe int[] SkipInputIndices => SkipInputIndicesArray.Data.Select(x => *(int*) x).ToArray(); | |||
| public string[] AttrsArray { get; set; } | |||
| public long[] SkipInputIndices { get; set; } | |||
| public object[] Attrs { get; set; } | |||
| public EagerOperation() : base(IntPtr.Zero) | |||
| { | |||
| if (op_dict == null) | |||
| op_dict = op_def_registry.get_registered_ops(); | |||
| } | |||
| public override InputList inputs | |||
| @@ -72,9 +69,9 @@ namespace Tensorflow.Eager | |||
| public bool get_attr_bool(string attr_name) | |||
| { | |||
| for (int i = 0; i < AttrsArray.Length; i = i + 2) | |||
| if (AttrsArray[i] == attr_name) | |||
| return AttrsArray[i + 1] == "1"; | |||
| for (int i = 0; i < Attrs.Length; i = i + 2) | |||
| if (Attrs[i].Equals(attr_name)) | |||
| return Attrs[i + 1].Equals("1"); | |||
| throw new ValueError($"Can't find attr: {attr_name}"); | |||
| } | |||
| @@ -0,0 +1,25 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| using Tensorflow.Gradients; | |||
| namespace Tensorflow.Eager | |||
| { | |||
| public class EagerRunner : IEagerRunner | |||
| { | |||
| public Tensor[] TFE_Execute(Context ctx, string device_name, string op_name, Tensor[] inputs, object[] attrs, int num_outputs) | |||
| { | |||
| throw new NotImplementedException(); | |||
| } | |||
| public Tensor[] TFE_FastPathExecute(Context ctx, string device_name, string opName, string name, Action callbacks, params object[] args) | |||
| { | |||
| throw new NotImplementedException(); | |||
| } | |||
| public Tensor[] TFE_TapeGradient(ITape tape, Tensor[] target, Tensor[] sources, Tensor[] output_gradients) | |||
| { | |||
| throw new NotImplementedException(); | |||
| } | |||
| } | |||
| } | |||
| @@ -42,9 +42,6 @@ namespace Tensorflow.Eager | |||
| //print($"new Tensor {Id} {_handle.ToString("x16")}"); | |||
| //print($"new TensorHandle {Id} {EagerTensorHandle.ToString("x16")}"); | |||
| /*GarbageCollector.Increase(_handle, GCItemType.TensorHandle); | |||
| GarbageCollector.Increase(tfe_tensor_handle, GCItemType.LocalTensorHandle);*/ | |||
| return this; | |||
| } | |||
| @@ -53,10 +50,6 @@ namespace Tensorflow.Eager | |||
| protected override void DisposeUnmanagedResources(IntPtr handle) | |||
| { | |||
| /*GarbageCollector.Decrease(_handle); | |||
| GarbageCollector.Decrease(tfe_tensor_handle); | |||
| GarbageCollector.Decrease(EagerTensorHandle);*/ | |||
| //print($"deleting DeleteTensorHandle {Id} {_handle.ToString("x16")}"); | |||
| c_api.TF_DeleteTensor(_handle); | |||
| //print($"deleting DeleteTensorHandle {Id} {EagerTensorHandle.ToString("x16")}"); | |||
| @@ -1,6 +1,7 @@ | |||
| using System.Collections.Generic; | |||
| using System; | |||
| using System.Linq; | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow.Eager | |||
| { | |||
| @@ -27,20 +28,18 @@ namespace Tensorflow.Eager | |||
| /// <param name="ctx">The value of context.context().</param> | |||
| /// <param name="name">Customized name for the operation.</param> | |||
| /// <returns>List of output Tensor objects. The list is empty if there are no outputs</returns> | |||
| public EagerTensor[] execute(Context ctx, string op_name, int num_outputs, | |||
| EagerTensor[] inputs, object[] attrs, | |||
| public Tensor[] execute(Context ctx, string op_name, int num_outputs, | |||
| Tensor[] inputs, object[] attrs, | |||
| string name = null) | |||
| { | |||
| ctx.ensure_initialized(); | |||
| using var status = new Status(); | |||
| var results = wrap_tfe_src.TFE_Execute(ctx, | |||
| var results = tf.Runner.TFE_Execute(ctx, | |||
| ctx.device_name, | |||
| op_name, | |||
| inputs, | |||
| attrs, | |||
| num_outputs, | |||
| status); | |||
| num_outputs); | |||
| return results; | |||
| } | |||
| @@ -0,0 +1,18 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| namespace Tensorflow.Eager | |||
| { | |||
| public class FastPathOpExecInfo | |||
| { | |||
| public Context ctx { get; set; } | |||
| public string device_name { get; set; } | |||
| public string op_name { get; set; } | |||
| public string name { get; set; } | |||
| public object[] args { get; set; } | |||
| public bool run_gradient_callback { get; set; } | |||
| public bool run_post_exec_callbacks { get; set; } | |||
| public bool run_callbacks { get; set; } | |||
| } | |||
| } | |||
| @@ -0,0 +1,29 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| using Tensorflow.Gradients; | |||
| namespace Tensorflow.Eager | |||
| { | |||
| public interface IEagerRunner | |||
| { | |||
| public Tensor[] TFE_FastPathExecute(Context ctx, | |||
| string device_name, | |||
| string opName, | |||
| string name, | |||
| Action callbacks, | |||
| params object[] args); | |||
| public Tensor[] TFE_Execute(Context ctx, | |||
| string device_name, | |||
| string op_name, | |||
| Tensor[] inputs, | |||
| object[] attrs, | |||
| int num_outputs); | |||
| public Tensor[] TFE_TapeGradient(ITape tape, | |||
| Tensor[] target, | |||
| Tensor[] sources, | |||
| Tensor[] output_gradients); | |||
| } | |||
| } | |||
| @@ -116,6 +116,12 @@ namespace Tensorflow | |||
| [DllImport(TensorFlowLibName)] | |||
| public static extern TFE_Context TFE_NewContext(IntPtr opts, IntPtr status); | |||
| [DllImport(TensorFlowLibName)] | |||
| public static extern TFE_Context TFE_ContextStartStep(IntPtr ctx); | |||
| [DllImport(TensorFlowLibName)] | |||
| public static extern TFE_Context TFE_ContextEndStep(IntPtr ctx); | |||
| /// <summary> | |||
| /// | |||
| /// </summary> | |||
| @@ -1,62 +0,0 @@ | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System; | |||
| using static Tensorflow.OpDef.Types; | |||
| namespace Tensorflow.Eager | |||
| { | |||
| /// <summary> | |||
| /// python\eager\pywrap_tfe_src.cc | |||
| /// </summary> | |||
| public partial class wrap_tfe_src | |||
| { | |||
| public static EagerTensor[] TFE_Execute(Context ctx, | |||
| string device_name, | |||
| string op_name, | |||
| Tensor[] inputs, | |||
| object[] attrs, | |||
| int num_outputs, | |||
| Status status) | |||
| => TFE_ExecuteCancelable(ctx, device_name, op_name, inputs, attrs, num_outputs, status); | |||
| public static EagerTensor[] TFE_ExecuteCancelable(Context ctx, | |||
| string device_name, | |||
| string op_name, | |||
| Tensor[] inputs, | |||
| object[] attrs, | |||
| int num_outputs, | |||
| Status status) | |||
| { | |||
| var op = GetOp(ctx, op_name, status); | |||
| status.Check(true); | |||
| c_api.TFE_OpSetDevice(op, device_name, status); | |||
| if (status.ok()) | |||
| { | |||
| for (int i = 0; i < inputs.Length; ++i) | |||
| { | |||
| IntPtr tensor_handle; | |||
| switch (inputs[i]) | |||
| { | |||
| case EagerTensor et: | |||
| tensor_handle = et.EagerTensorHandle; | |||
| break; | |||
| default: | |||
| tensor_handle = c_api.TFE_NewTensorHandle(inputs[i], status); | |||
| break; | |||
| } | |||
| c_api.TFE_OpAddInput(op, tensor_handle, status); | |||
| } | |||
| } | |||
| if (status.ok()) | |||
| SetOpAttrs(op, attrs, status); | |||
| var outputs = new IntPtr[num_outputs]; | |||
| if (status.ok()) | |||
| { | |||
| c_api.TFE_Execute(op, outputs, ref num_outputs, status); | |||
| status.Check(true); | |||
| } | |||
| return outputs.Select(x => new EagerTensor(x)).ToArray(); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,305 +0,0 @@ | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System; | |||
| using static Tensorflow.OpDef.Types; | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow.Eager | |||
| { | |||
| /// <summary> | |||
| /// python\eager\pywrap_tfe_src.cc | |||
| /// </summary> | |||
| public partial class wrap_tfe_src | |||
| { | |||
| static int kFastPathExecuteInputStartIndex = 0; | |||
| public static EagerTensor[] TFE_FastPathExecute(Context ctx, | |||
| string device_name, | |||
| string opName, | |||
| string name, | |||
| Action callbacks, | |||
| params object[] args) | |||
| { | |||
| int args_size = args.Length; | |||
| var attr_list_sizes = new Dictionary<string, long>(); | |||
| using var status = new Status(); | |||
| var op = GetOp(ctx, opName, status); | |||
| var op_def = Graph.TFE_GetOpDef(opName); | |||
| // Set non-inferred attrs, including setting defaults if the attr is passed in | |||
| // as None. | |||
| for (int i = kFastPathExecuteInputStartIndex + op_def.InputArg.Count; i < args_size; i += 2) | |||
| { | |||
| var attr_name = args[i].ToString(); | |||
| var attr_value = args[i + 1]; | |||
| foreach (var attr in op_def.Attr) | |||
| { | |||
| if (attr_name == attr.Name) | |||
| { | |||
| SetOpAttrWithDefaults(ctx, op, attr, attr_name, attr_value, attr_list_sizes, status); | |||
| status.Check(true); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| c_api.TFE_OpSetDevice(op, device_name, status); | |||
| status.Check(true); | |||
| // Add inferred attrs and inputs. | |||
| for (int i = 0; i < op_def.InputArg.Count; i++) | |||
| { | |||
| var input_arg = op_def.InputArg[i]; | |||
| if (!string.IsNullOrEmpty(input_arg.NumberAttr)) | |||
| { | |||
| int len = (args[kFastPathExecuteInputStartIndex + i] as object[]).Length; | |||
| c_api.TFE_OpSetAttrInt(op, input_arg.NumberAttr, len); | |||
| attr_list_sizes[input_arg.NumberAttr] = len; | |||
| if (len > 0) | |||
| { | |||
| var fast_input_array = (object[])args[i]; | |||
| // First item adds the type attr. | |||
| if (!AddInputToOp(fast_input_array[i], true, input_arg, op, status)) | |||
| return null; | |||
| for (var j = 1; j < len; j++) | |||
| { | |||
| // Since the list is homogeneous, we don't need to re-add the attr. | |||
| if (!AddInputToOp(fast_input_array[j], false, input_arg, op, status)) | |||
| return null; | |||
| } | |||
| } | |||
| } | |||
| else if (!string.IsNullOrEmpty(input_arg.TypeListAttr)) | |||
| { | |||
| } | |||
| else | |||
| { | |||
| // The item is a single item. | |||
| AddInputToOp(args[i], true, input_arg, op, status); | |||
| } | |||
| } | |||
| int num_retvals = 0; | |||
| for (int i = 0; i < op_def.OutputArg.Count; i++) | |||
| { | |||
| var output_arg = op_def.OutputArg[i]; | |||
| var delta = 1L; | |||
| if (!string.IsNullOrEmpty(output_arg.NumberAttr)) | |||
| delta = attr_list_sizes[output_arg.NumberAttr]; | |||
| else if (!string.IsNullOrEmpty(output_arg.TypeListAttr)) | |||
| delta = attr_list_sizes[output_arg.TypeListAttr]; | |||
| if (delta < 0) | |||
| throw new RuntimeError("Attributes suggest that the size of an output list is less than 0"); | |||
| num_retvals += (int)delta; | |||
| } | |||
| var retVals = new IntPtr[num_retvals]; | |||
| c_api.TFE_Execute(op, retVals, ref num_retvals, status); | |||
| status.Check(true); | |||
| return retVals.Select(x => new EagerTensor(x)).ToArray(); | |||
| } | |||
| private static TFE_Op GetOp(Context ctx, string op_or_function_name, Status status) | |||
| { | |||
| var maybe_op = ReleaseThreadLocalOp(); | |||
| if (maybe_op != IntPtr.Zero) | |||
| { | |||
| c_api.TFE_OpReset(maybe_op, op_or_function_name, ctx.device_name, status); | |||
| } | |||
| else | |||
| { | |||
| maybe_op = c_api.TFE_NewOp(ctx, op_or_function_name, status); | |||
| op = maybe_op; | |||
| } | |||
| status.Check(true); | |||
| return maybe_op; | |||
| } | |||
| static TFE_Op op; | |||
| private static TFE_Op ReleaseThreadLocalOp() | |||
| { | |||
| return op; | |||
| } | |||
| /// <summary> | |||
| /// Adds input and type attr to the op, and to the list of flattened | |||
| /// inputs/attrs. | |||
| /// </summary> | |||
| /// <param name="inputs"></param> | |||
| /// <param name="add_type_attr"></param> | |||
| /// <param name="input_arg"></param> | |||
| /// <param name="op"></param> | |||
| /// <param name="status"></param> | |||
| /// <returns></returns> | |||
| private static bool AddInputToOp(object inputs, | |||
| bool add_type_attr, | |||
| ArgDef input_arg, | |||
| IntPtr op, | |||
| Status status) | |||
| { | |||
| IntPtr input_handle; | |||
| // ConvertToTensor(); | |||
| switch (inputs) | |||
| { | |||
| case EagerTensor input: | |||
| input_handle = input.EagerTensorHandle; | |||
| break; | |||
| case EagerTensor[] input_list: | |||
| input_handle = input_list[0].EagerTensorHandle; | |||
| break; | |||
| default: | |||
| throw new NotImplementedException(""); | |||
| } | |||
| if (add_type_attr && !string.IsNullOrEmpty(input_arg.TypeAttr)) | |||
| { | |||
| var dtype = c_api.TFE_TensorHandleDataType(input_handle); | |||
| c_api.TFE_OpSetAttrType(op, input_arg.TypeAttr, dtype); | |||
| } | |||
| c_api.TFE_OpAddInput(op, input_handle, status); | |||
| status.Check(true); | |||
| return true; | |||
| } | |||
| public static void SetOpAttrs(TFE_Op op, params object[] attrs) | |||
| { | |||
| using var status = new Status(); | |||
| var len = attrs.Length; | |||
| for (int i = 0; i < len; i += 2) | |||
| { | |||
| var key = attrs[i].ToString(); | |||
| var value = attrs[i + 1]; | |||
| byte is_list = 0; | |||
| var type = c_api.TFE_OpGetAttrType(op, key, ref is_list, status); | |||
| if (!status.ok()) return; | |||
| if (is_list != 0) | |||
| SetOpAttrList(tf.context, op, key, value, type, null, status); | |||
| else | |||
| SetOpAttrScalar(tf.context, op, key, value, type, null, status); | |||
| status.Check(true); | |||
| } | |||
| } | |||
| public static string SetOpAttrs2(params object[] attrs) | |||
| { | |||
| string attr_string = string.Empty; | |||
| for(int i = 0; i < attrs.Length; i = i + 2) | |||
| { | |||
| object key = attrs[i]; | |||
| object value = attrs[i + 1]; | |||
| switch (value) | |||
| { | |||
| case TF_DataType dtype: | |||
| value = (int)dtype; | |||
| break; | |||
| case bool bVal: | |||
| value = bVal ? 1 : 0; | |||
| break; | |||
| case int[] shape: | |||
| value = shape.Length == 0 ? "null" : string.Join(" ", shape); | |||
| break; | |||
| default: | |||
| break; | |||
| } | |||
| attr_string += string.IsNullOrEmpty(attr_string) ? | |||
| $"{key},{value}" : | |||
| $",{key},{value}"; | |||
| } | |||
| return attr_string; | |||
| } | |||
| /// <summary> | |||
| /// This function will set the op attrs required. If an attr has the value of | |||
| /// None, then it will read the AttrDef to get the default value and set that | |||
| /// instead. Any failure in this function will simply fall back to the slow | |||
| /// path. | |||
| /// </summary> | |||
| /// <param name="ctx"></param> | |||
| /// <param name="op"></param> | |||
| /// <param name="attr"></param> | |||
| /// <param name="attr_name"></param> | |||
| /// <param name="attr_value"></param> | |||
| /// <param name="attr_list_sizes"></param> | |||
| /// <param name="status"></param> | |||
| private static void SetOpAttrWithDefaults(Context ctx, IntPtr op, AttrDef attr, | |||
| string attr_name, object attr_value, | |||
| Dictionary<string, long> attr_list_sizes, | |||
| Status status) | |||
| { | |||
| byte is_list = 0; | |||
| var type = c_api.TFE_OpGetAttrType(op, attr_name, ref is_list, status); | |||
| if (status.Code != TF_Code.TF_OK) return; | |||
| if(attr_value == null) | |||
| { | |||
| if (is_list != 0) | |||
| ; | |||
| //SetOpAttrListDefault | |||
| else | |||
| ; | |||
| //SetOpAttrScalarDefault | |||
| } | |||
| else | |||
| { | |||
| if (is_list != 0) | |||
| ;// SetOpAttrList | |||
| else | |||
| SetOpAttrScalar(ctx, op, attr_name, attr_value, type, attr_list_sizes, status); | |||
| } | |||
| } | |||
| private static bool SetOpAttrList(Context ctx, IntPtr op, | |||
| string key, object value, TF_AttrType type, | |||
| Dictionary<string, long> attr_list_sizes, | |||
| Status status) | |||
| { | |||
| return false; | |||
| } | |||
| private static bool SetOpAttrScalar(Context ctx, IntPtr op, | |||
| string key, object value, TF_AttrType type, | |||
| Dictionary<string, long> attr_list_sizes, | |||
| Status status) | |||
| { | |||
| switch(type) | |||
| { | |||
| case TF_AttrType.TF_ATTR_STRING: | |||
| c_api.TFE_OpSetAttrString(op, key, value.ToString(), (uint)value.ToString().Length); | |||
| break; | |||
| case TF_AttrType.TF_ATTR_TYPE: | |||
| c_api.TFE_OpSetAttrType(op, key, (TF_DataType)value); | |||
| break; | |||
| case TF_AttrType.TF_ATTR_BOOL: | |||
| c_api.TFE_OpSetAttrBool(op, key, Convert.ToBoolean(value)); | |||
| break; | |||
| case TF_AttrType.TF_ATTR_INT: | |||
| c_api.TFE_OpSetAttrInt(op, key, Convert.ToInt64(value)); | |||
| break; | |||
| case TF_AttrType.TF_ATTR_SHAPE: | |||
| var dims = (value as int[]).Select(x => (long)x).ToArray(); | |||
| c_api.TFE_OpSetAttrShape(op, key, dims, dims.Length, status); | |||
| status.Check(true); | |||
| break; | |||
| default: | |||
| throw new NotImplementedException($"SetOpAttrScalar for {type}"); | |||
| } | |||
| return true; | |||
| } | |||
| } | |||
| } | |||
| @@ -22,22 +22,27 @@ namespace Tensorflow | |||
| { | |||
| public class op_def_registry | |||
| { | |||
| private static Dictionary<string, OpDef> _registered_ops; | |||
| static Dictionary<string, OpDef> _registered_ops; | |||
| public static Dictionary<string, OpDef> get_registered_ops() | |||
| { | |||
| if(_registered_ops == null) | |||
| { | |||
| _registered_ops = new Dictionary<string, OpDef>(); | |||
| using (var buffer = new Buffer(c_api.TF_GetAllOpList())) | |||
| { | |||
| var op_list = OpList.Parser.ParseFrom(buffer.MemoryBlock.Stream()); | |||
| foreach (var op_def in op_list.Op) | |||
| _registered_ops[op_def.Name] = op_def; | |||
| } | |||
| using var buffer = new Buffer(c_api.TF_GetAllOpList()); | |||
| using var stream = buffer.MemoryBlock.Stream(); | |||
| var op_list = OpList.Parser.ParseFrom(stream); | |||
| foreach (var op_def in op_list.Op) | |||
| _registered_ops[op_def.Name] = op_def; | |||
| } | |||
| return _registered_ops; | |||
| } | |||
| public static OpDef GetOpDef(string type) | |||
| { | |||
| var ops = get_registered_ops(); | |||
| return ops[type]; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,18 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| namespace Tensorflow.Gradients | |||
| { | |||
| public class AccumulatorCallState | |||
| { | |||
| GradientTape backward_tape; | |||
| bool accumulating; | |||
| public AccumulatorCallState(GradientTape backward_tape, bool accumulating) | |||
| { | |||
| this.backward_tape = backward_tape; | |||
| this.accumulating = accumulating; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,30 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| using Tensorflow.Util; | |||
| using static Tensorflow.tensorflow; | |||
| namespace Tensorflow.Gradients | |||
| { | |||
| public class BackpropInitialState | |||
| { | |||
| public OpTape<BackwardFunction, TapeTensor> op_tape { get; set; } | |||
| /// <summary> | |||
| /// Map from tensor ID to how many references still exist for this tensor in | |||
| /// the tape. | |||
| /// </summary> | |||
| public UnorderedMap<long, long> tensor_usage_counts { get; set; } | |||
| /// <summary> | |||
| /// Maps from op ID to how many output tensors of this op still need to have | |||
| /// their gradients computed. | |||
| /// </summary> | |||
| public UnorderedMap<long, long> op_missing_tensor { get; set; } | |||
| public BackpropInitialState() | |||
| { | |||
| op_tape = new OpTape<BackwardFunction, TapeTensor>(); | |||
| tensor_usage_counts = new UnorderedMap<long, long>(); | |||
| op_missing_tensor = new UnorderedMap<long, long>(); | |||
| } | |||
| } | |||
| } | |||
| @@ -30,7 +30,7 @@ namespace Tensorflow.Gradients | |||
| bool _watch_accessed_variables; | |||
| ResourceVariable[] _watched_variables; | |||
| bool _created_eagerly; | |||
| Tape _tape; | |||
| ITape _tape; | |||
| public GradientTape(bool persistent = false, | |||
| bool watch_accessed_variables = true) | |||
| @@ -38,9 +38,20 @@ namespace Tensorflow.Gradients | |||
| _persistent = persistent; | |||
| _watch_accessed_variables = watch_accessed_variables; | |||
| _created_eagerly = tf.context.executing_eagerly(); | |||
| _recording = false; | |||
| _created_eagerly = tf.context.executing_eagerly(); | |||
| // Enters a context inside which operations are recorded on this tape. | |||
| if (_created_eagerly) | |||
| { | |||
| tf.context.ensure_initialized(); | |||
| tf.context.start_step(); | |||
| } | |||
| _push_tape(); | |||
| } | |||
| /// <summary> | |||
| /// Pushes a new tape onto the tape stack. | |||
| /// </summary> | |||
| private void _push_tape() | |||
| { | |||
| if (_recording) | |||
| @@ -50,8 +61,8 @@ namespace Tensorflow.Gradients | |||
| if (_tape == null) | |||
| _tape = new Tape(_persistent, _watch_accessed_variables); | |||
| else | |||
| throw new NotImplementedException(""); | |||
| tf.GetTapeSet().Add(_tape); | |||
| _recording = true; | |||
| } | |||
| @@ -59,7 +70,7 @@ namespace Tensorflow.Gradients | |||
| { | |||
| if (!_recording) | |||
| throw new ValueError("Tape is not recording."); | |||
| _tape.pop_tape(_tape); | |||
| _tape.PopTape(_tape); | |||
| _recording = false; | |||
| } | |||
| @@ -69,9 +80,15 @@ namespace Tensorflow.Gradients | |||
| /// <param name="x"></param> | |||
| public void watch(Tensor x) | |||
| { | |||
| _tape.watch(x as EagerTensor); | |||
| _tape.Watch(x.Id); | |||
| } | |||
| /// <summary> | |||
| /// Computes the gradient using operations recorded in context of this tape. | |||
| /// </summary> | |||
| /// <param name="target"></param> | |||
| /// <param name="source"></param> | |||
| /// <returns></returns> | |||
| public Tensor gradient(Tensor target, Tensor source) | |||
| { | |||
| if (_recording) | |||
| @@ -80,34 +97,29 @@ namespace Tensorflow.Gradients | |||
| _pop_tape(); | |||
| } | |||
| var results = EagerTensorPass.Create(); | |||
| var targets = EagerTensorPass.From(target); | |||
| var sources = EagerTensorPass.From(source); | |||
| var results = tf.Runner.TFE_TapeGradient(_tape, | |||
| new[] { target }, | |||
| new[] { source }, | |||
| null); | |||
| Status status = c_api.TFE_TapeGradient(_tape, | |||
| targets.Points, targets.Length, | |||
| sources.Points, sources.Length, | |||
| results.Points, results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| return results[0]; | |||
| } | |||
| public Tensor gradient(Tensor target, ResourceVariable source) | |||
| { | |||
| var results = gradient(target as EagerTensor, new[] { source }); | |||
| var results = gradient(target, new[] { source }); | |||
| return results[0]; | |||
| } | |||
| public (Tensor, Tensor) gradient(Tensor target, (ResourceVariable, ResourceVariable) sources) | |||
| { | |||
| var results = gradient(target as EagerTensor, new[] { sources.Item1, sources.Item2 }); | |||
| var results = gradient(target, new[] { sources.Item1, sources.Item2 }); | |||
| return (results[0], results[1]); | |||
| } | |||
| public EagerTensor[] gradient(EagerTensor target, ResourceVariable[] sources) | |||
| public Tensor[] gradient(Tensor target, ResourceVariable[] sources) | |||
| { | |||
| if (_recording) | |||
| { | |||
| @@ -115,24 +127,19 @@ namespace Tensorflow.Gradients | |||
| _pop_tape(); | |||
| } | |||
| var results = EagerTensorPass.Create(sources.Length); | |||
| var target_inputs = EagerTensorPass.From(target); | |||
| var source_inputs = EagerTensorPass.From(sources.Select(x => x.Handle).ToArray()); | |||
| Status status = c_api.TFE_TapeGradient(_tape, | |||
| target_inputs.Points, target_inputs.Length, | |||
| source_inputs.Points, source_inputs.Length, | |||
| results.Points, results.Length); | |||
| status.Check(true); | |||
| var results = tf.Runner.TFE_TapeGradient(_tape, | |||
| new[] { target }, | |||
| sources.Select(x => x.Handle).ToArray(), | |||
| null); | |||
| if (!_persistent) | |||
| { | |||
| // Keep track of watched variables before setting tape to None | |||
| _watched_variables = _tape.watched_variables(); | |||
| _watched_variables = _tape.WatchedVariables(); | |||
| _tape = null; | |||
| } | |||
| return results.Items.Select(x => x.Resolve()).ToArray(); | |||
| return results; | |||
| } | |||
| public void Dispose() | |||
| @@ -140,7 +147,8 @@ namespace Tensorflow.Gradients | |||
| if (_recording) | |||
| _pop_tape(); | |||
| tf.tensorMgr.Reset(); | |||
| if (_created_eagerly) | |||
| tf.context.end_step(); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,33 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| using Tensorflow.Util; | |||
| using static Tensorflow.tensorflow; | |||
| namespace Tensorflow.Gradients | |||
| { | |||
| public interface ITape | |||
| { | |||
| void PopTape(ITape tape); | |||
| bool ShouldRecord(long[] tensor_ids, TF_DataType[] dtypes); | |||
| void RecordOperation(string op_type, | |||
| Tensor[] input_tensors, | |||
| TapeTensor[] output_tensors, | |||
| long[] input_tensor_id, | |||
| TF_DataType[] input_dtypes, | |||
| Func<BackwardFunction> backward_function_getter); | |||
| void VariableAccessed(ResourceVariable variable); | |||
| void Watch(long tensor_id); | |||
| ResourceVariable[] WatchedVariables(); | |||
| Tensor[] ComputeGradient(long[] target_tensor_ids, | |||
| long[] source_tensor_ids, | |||
| UnorderedMap<long, TapeTensor> sources_that_are_targets, | |||
| Tensor[] output_gradients); | |||
| } | |||
| } | |||
| @@ -0,0 +1,19 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using Tensorflow.Util; | |||
| namespace Tensorflow.Gradients | |||
| { | |||
| /// <summary> | |||
| /// Map from operation-id to tape entry. | |||
| /// </summary> | |||
| /// <typeparam name="BackwardFunction"></typeparam> | |||
| /// <typeparam name="TapeTensor"></typeparam> | |||
| public class OpTape<BackwardFunction, TapeTensor> : | |||
| UnorderedMap<long, OpTapeEntry<BackwardFunction, TapeTensor>> | |||
| { | |||
| } | |||
| } | |||
| @@ -0,0 +1,19 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| namespace Tensorflow.Gradients | |||
| { | |||
| /// <summary> | |||
| /// Represents an entry in the tape. | |||
| /// </summary> | |||
| /// <typeparam name="BackwardFunction"></typeparam> | |||
| /// <typeparam name="TapeTensor"></typeparam> | |||
| public class OpTapeEntry<BackwardFunction, TapeTensor> | |||
| { | |||
| public string op_type { get; set; } | |||
| public TapeTensor[] output_tensor_info { get; set; } | |||
| public long[] input_tensor_id { get; set; } | |||
| public BackwardFunction backward_function { get; set; } | |||
| } | |||
| } | |||
| @@ -1,71 +1,50 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Runtime.InteropServices; | |||
| using System.Text; | |||
| using Tensorflow.Eager; | |||
| using Tensorflow.Util; | |||
| namespace Tensorflow.Gradients | |||
| { | |||
| public class Tape : DisposableObject | |||
| public class Tape : ITape | |||
| { | |||
| public int nesting_id { get; set; } | |||
| public Tape(bool persistent, bool watch_accessed_variables) | |||
| { | |||
| _handle = c_api.TFE_TapeSetNew(persistent, watch_accessed_variables); | |||
| } | |||
| public void watch(EagerTensor x) | |||
| public Tensor[] ComputeGradient(long[] target_tensor_ids, long[] source_tensor_ids, UnorderedMap<long, TapeTensor> sources_that_are_targets, Tensor[] output_gradients) | |||
| { | |||
| c_api.TFE_TapeWatch(_handle, x.EagerTensorHandle); | |||
| throw new NotImplementedException(); | |||
| } | |||
| public void pop_tape(Tape tape) | |||
| public void PopTape(ITape tape) | |||
| { | |||
| c_api.TFE_TapeSetRemove(tape); | |||
| throw new NotImplementedException(); | |||
| } | |||
| public static void variable_accessed(ResourceVariable variable) | |||
| public void RecordOperation(string op_type, Tensor[] input_tensors, TapeTensor[] output_tensors, long[] input_tensor_id, TF_DataType[] input_dtypes, Func<tensorflow.BackwardFunction> backward_function_getter) | |||
| { | |||
| c_api.TFE_TapeVariableAccessed(variable); | |||
| throw new NotImplementedException(); | |||
| } | |||
| public unsafe ResourceVariable[] watched_variables() | |||
| public bool ShouldRecord(long[] tensor_ids, TF_DataType[] dtypes) | |||
| { | |||
| BindingArray result = c_api.TFE_TapeWatchedVariables(_handle); | |||
| var variables = result.Data.Select(x => | |||
| { | |||
| var tensor = c_api.ResourceVariable_Handle(x); | |||
| return new ResourceVariable(x, tensor); | |||
| }).ToArray(); | |||
| return variables; | |||
| throw new NotImplementedException(); | |||
| } | |||
| public static bool IsDtypeTrainable(DataType dtype) | |||
| public void VariableAccessed(ResourceVariable variable) | |||
| { | |||
| switch (dtype) | |||
| { | |||
| case DataType.DtHalf: | |||
| case DataType.DtBfloat16: | |||
| case DataType.DtFloat: | |||
| case DataType.DtDouble: | |||
| case DataType.DtComplex64: | |||
| case DataType.DtComplex128: | |||
| case DataType.DtResource: | |||
| case DataType.DtVariant: | |||
| return true; | |||
| default: | |||
| return false; | |||
| } | |||
| throw new NotImplementedException(); | |||
| } | |||
| protected override void DisposeUnmanagedResources(IntPtr handle) | |||
| public void Watch(long tensor_id) | |||
| { | |||
| throw new NotImplementedException(); | |||
| } | |||
| public static implicit operator IntPtr(Tape tape) | |||
| => tape._handle; | |||
| public ResourceVariable[] WatchedVariables() | |||
| { | |||
| throw new NotImplementedException(); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,31 @@ | |||
| using NumSharp; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| using Tensorflow.Eager; | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow.Gradients | |||
| { | |||
| public class TapeTensor | |||
| { | |||
| long id; | |||
| TF_DataType dtype; | |||
| TensorShape shape; | |||
| public TapeTensor(long id, TF_DataType dtype, TensorShape shape) | |||
| { | |||
| this.id = id; | |||
| this.dtype = dtype; | |||
| this.shape = shape; | |||
| } | |||
| public long GetID() => id; | |||
| public Tensor ZerosLike(int[] shape = null, TF_DataType dtype = TF_DataType.TF_FLOAT) | |||
| => tf.zeros(shape == null ? new int[0] : shape, dtype: dtype); | |||
| public Tensor OnesLike(int[] shape = null, TF_DataType dtype = TF_DataType.TF_FLOAT) | |||
| => tf.ones(shape == null ? new int[0] : shape, dtype: dtype); | |||
| } | |||
| } | |||
| @@ -0,0 +1,19 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Dynamic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using Tensorflow.Util; | |||
| namespace Tensorflow.Gradients | |||
| { | |||
| /// <summary> | |||
| /// Map from tensor_id to internally-defined operation-id of the operation which | |||
| /// produced this tensor. A value of -1 means that the tensor was directly | |||
| /// watched and not the result of any operation in the tape. | |||
| /// </summary> | |||
| public class TensorTape : UnorderedMap<long, long> | |||
| { | |||
| } | |||
| } | |||
| @@ -15,7 +15,10 @@ | |||
| ******************************************************************************/ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Runtime.InteropServices; | |||
| using System.Threading; | |||
| using Tensorflow.Gradients; | |||
| namespace Tensorflow | |||
| { | |||
| @@ -0,0 +1,31 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| namespace Tensorflow.Gradients | |||
| { | |||
| public class gradient_exclustions | |||
| { | |||
| public static int[] OpGradientUnusedInputIndices(string op_name) | |||
| => op_name switch | |||
| { | |||
| "FusedBatchNorm" => new[] { 2 }, | |||
| "FusedBatchNormGradV3" => new[] { 5 }, | |||
| "FusedBatchNormV2" => new[] { 2 }, | |||
| "FusedBatchNormV3" => new[] { 2 }, | |||
| _ => null | |||
| }; | |||
| public static int[] OpGradientUnusedOutputIndices(string op_name) | |||
| => op_name switch | |||
| { | |||
| "SoftmaxCrossEntropyWithLogits" => new[] { 0 }, | |||
| "TensorArrayConcat" => new[] { 0 }, | |||
| "TensorArrayConcatV2" => new[] { 0 }, | |||
| "TensorArrayConcatV3" => new[] { 0 }, | |||
| "Mul" => new int[0], | |||
| "Sum" => new int[0], | |||
| _ => null | |||
| }; | |||
| } | |||
| } | |||
| @@ -30,7 +30,7 @@ namespace Tensorflow.Gradients | |||
| public class math_grad_eager | |||
| { | |||
| [RegisterGradientEager("Mul")] | |||
| public static EagerTensor[] _MulGrad(EagerOperation op, IntPtr[] grads) | |||
| public static Tensor[] _MulGrad(EagerOperation op, IntPtr[] grads) | |||
| { | |||
| var x = op.InputHandles[0]; | |||
| var y = op.InputHandles[1]; | |||
| @@ -39,7 +39,7 @@ namespace Tensorflow.Gradients | |||
| if (op.SkipInputIndices.Contains(1) && | |||
| EagerTensor.GetRank(grad) == 0) | |||
| { | |||
| return new EagerTensor[] | |||
| return new Tensor[] | |||
| { | |||
| null,//gen_math_ops.mul(grad, math_ops.conj(y)), | |||
| null | |||
| @@ -48,7 +48,7 @@ namespace Tensorflow.Gradients | |||
| if (_ShapesFullySpecifiedAndEqual(x, y, grad)) | |||
| { | |||
| return new EagerTensor[] | |||
| return new Tensor[] | |||
| { | |||
| gen_math_ops.mul(grad, y), | |||
| gen_math_ops.mul(grad, x) | |||
| @@ -1,101 +0,0 @@ | |||
| /***************************************************************************** | |||
| Copyright 2018 The TensorFlow.NET Authors. All Rights Reserved. | |||
| Licensed under the Apache License, Version 2.0 (the "License"); | |||
| you may not use this file except in compliance with the License. | |||
| You may obtain a copy of the License at | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||
| ******************************************************************************/ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Reflection; | |||
| using Tensorflow.Eager; | |||
| using Tensorflow.Gradients; | |||
| namespace Tensorflow | |||
| { | |||
| public partial class ops | |||
| { | |||
| public static Dictionary<string, Func<EagerOperation, IntPtr[], EagerTensor[]>> gradientFunctionsEager = null; | |||
| public static void RegisterFromAssemblyEager() | |||
| { | |||
| if (gradientFunctionsEager == null) | |||
| { | |||
| gradientFunctionsEager = new Dictionary<string, Func<EagerOperation, IntPtr[], EagerTensor[]>>(); | |||
| var gradGroups = Assembly.GetExecutingAssembly() | |||
| .GetTypes() | |||
| .Where(x => x.GetCustomAttribute<RegisterGradientEager>() != null) | |||
| .ToArray(); | |||
| foreach (var g in gradGroups) | |||
| { | |||
| var methods = g.GetMethods() | |||
| .Where(x => x.GetCustomAttribute<RegisterGradientEager>() != null) | |||
| .ToArray(); | |||
| foreach (var m in methods) | |||
| { | |||
| RegisterGradientFunctionEager(m.GetCustomAttribute<RegisterGradientEager>().Name, | |||
| (oper, out_grads) => | |||
| g.InvokeMember(m.Name, | |||
| BindingFlags.InvokeMethod, | |||
| null, | |||
| null, | |||
| args: new object[] { oper, out_grads }) as EagerTensor[] | |||
| ); | |||
| } | |||
| // REGISTER_NO_GRADIENT_OP | |||
| methods = g.GetMethods() | |||
| .Where(x => x.GetCustomAttribute<RegisterNoGradient>() != null) | |||
| .ToArray(); | |||
| foreach (var m in methods) | |||
| RegisterNoGradientFunctionEager(m.GetCustomAttribute<RegisterNoGradient>().Name); | |||
| } | |||
| } | |||
| } | |||
| /// <summary> | |||
| /// Regiter new gradient function | |||
| /// </summary> | |||
| /// <param name="name">operation type</param> | |||
| /// <param name="func">function delegate</param> | |||
| public static void RegisterGradientFunctionEager(string name, Func<EagerOperation, IntPtr[], EagerTensor[]> func) | |||
| { | |||
| RegisterFromAssemblyEager(); | |||
| gradientFunctionsEager[name] = func; | |||
| } | |||
| public static void RegisterNoGradientFunctionEager(string name) | |||
| { | |||
| RegisterFromAssemblyEager(); | |||
| gradientFunctionsEager[name] = null; | |||
| } | |||
| public static Func<EagerOperation, IntPtr[], EagerTensor[]> get_gradient_function_eager(EagerOperation op) | |||
| { | |||
| if (op.inputs == null) return null; | |||
| RegisterFromAssemblyEager(); | |||
| if (!gradientFunctionsEager.ContainsKey(op.type)) | |||
| throw new LookupError($"can't get graident function through get_gradient_function {op.type}"); | |||
| return gradientFunctionsEager[op.type]; | |||
| } | |||
| } | |||
| } | |||
| @@ -26,24 +26,7 @@ namespace Tensorflow | |||
| public partial class Graph | |||
| { | |||
| public OpDef GetOpDef(string type) | |||
| { | |||
| using (var buffer = new Buffer()) | |||
| using (var status = new Status()) | |||
| { | |||
| c_api.TF_GraphGetOpDef(_handle, type, buffer, status); | |||
| return OpDef.Parser.ParseFrom(buffer.MemoryBlock.Stream()); | |||
| } | |||
| } | |||
| public static OpDef TFE_GetOpDef(string type) | |||
| { | |||
| IntPtr handle = tf.get_default_graph(); | |||
| using var buffer = new Buffer(); | |||
| using var status = new Status(); | |||
| c_api.TF_GraphGetOpDef(handle, type, buffer, status); | |||
| using var stream = buffer.MemoryBlock.Stream(); | |||
| return OpDef.Parser.ParseFrom(stream); | |||
| } | |||
| => op_def_registry.GetOpDef(type); | |||
| public OperationDescription NewOperation(string opType, string opName) | |||
| { | |||
| @@ -16,15 +16,12 @@ | |||
| using System; | |||
| using System.Linq; | |||
| using Tensorflow.Eager; | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow.Operations | |||
| { | |||
| public class gen_nn_ops | |||
| { | |||
| public static OpDefLibrary _op_def_lib = new OpDefLibrary(); | |||
| /// <summary> | |||
| /// Computes a 2-D convolution given 4-D `input` and `filter` tensors. | |||
| /// | |||
| @@ -45,7 +42,7 @@ namespace Tensorflow.Operations | |||
| /// <returns></returns> | |||
| public static Tensor conv2d(Conv2dParams parameters) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Conv2D", name: parameters.Name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("Conv2D", name: parameters.Name, args: new | |||
| { | |||
| input = parameters.Input, | |||
| filter = parameters.Filter, | |||
| @@ -67,7 +64,7 @@ namespace Tensorflow.Operations | |||
| /// <returns></returns> | |||
| public static Tensor conv2d_backprop_filter(Conv2dParams parameters) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Conv2DBackpropFilter", name: parameters.Name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("Conv2DBackpropFilter", name: parameters.Name, args: new | |||
| { | |||
| input = parameters.Input, | |||
| filter_sizes = parameters.FilterSizes, | |||
| @@ -90,7 +87,7 @@ namespace Tensorflow.Operations | |||
| /// <returns></returns> | |||
| public static Tensor conv2d_backprop_input(Conv2dParams parameters) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Conv2DBackpropInput", name: parameters.Name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("Conv2DBackpropInput", name: parameters.Name, args: new | |||
| { | |||
| input_sizes = parameters.InputSizes, | |||
| filter = parameters.Filter, | |||
| @@ -114,7 +111,7 @@ namespace Tensorflow.Operations | |||
| if (data_format == null) | |||
| data_format = "NHWC"; | |||
| var _op = _op_def_lib._apply_op_helper("BiasAdd", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("BiasAdd", name: name, args: new | |||
| { | |||
| value, | |||
| bias, | |||
| @@ -131,7 +128,7 @@ namespace Tensorflow.Operations | |||
| if (data_format == null) | |||
| data_format = "NHWC"; | |||
| var _op = _op_def_lib._apply_op_helper("BiasAddGrad", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("BiasAddGrad", name: name, args: new | |||
| { | |||
| out_backprop, | |||
| data_format | |||
| @@ -157,7 +154,7 @@ namespace Tensorflow.Operations | |||
| /// </remarks> | |||
| public static Tensor elu(Tensor features, string name = "Elu") | |||
| { | |||
| var op = _op_def_lib._apply_op_helper("Elu", name: name, args: new { features }); | |||
| var op = tf._op_def_lib._apply_op_helper("Elu", name: name, args: new { features }); | |||
| return op.output; | |||
| } | |||
| @@ -176,7 +173,7 @@ namespace Tensorflow.Operations | |||
| /// <returns></returns> | |||
| public static Tensor[] fused_batch_norm_grad(FusedBatchNormParams @params) | |||
| { | |||
| var op = _op_def_lib._apply_op_helper("FusedBatchNormGrad", name: @params.Name, args: new | |||
| var op = tf._op_def_lib._apply_op_helper("FusedBatchNormGrad", name: @params.Name, args: new | |||
| { | |||
| y_backprop = @params.YBackprop, | |||
| x = @params.X, | |||
| @@ -192,7 +189,7 @@ namespace Tensorflow.Operations | |||
| public static Tensor[] fused_batch_norm_grad_v3(FusedBatchNormParams @params) | |||
| { | |||
| var op = _op_def_lib._apply_op_helper("FusedBatchNormGradV3", name: @params.Name, args: new | |||
| var op = tf._op_def_lib._apply_op_helper("FusedBatchNormGradV3", name: @params.Name, args: new | |||
| { | |||
| y_backprop = @params.YBackprop, | |||
| x = @params.X, | |||
| @@ -217,7 +214,7 @@ namespace Tensorflow.Operations | |||
| bool is_training = true, | |||
| string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("FusedBatchNorm", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("FusedBatchNorm", name: name, args: new | |||
| { | |||
| x, | |||
| scale, | |||
| @@ -242,7 +239,7 @@ namespace Tensorflow.Operations | |||
| bool is_training = true, | |||
| string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("FusedBatchNormV3", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("FusedBatchNormV3", name: name, args: new | |||
| { | |||
| x, | |||
| scale, | |||
| @@ -270,7 +267,7 @@ namespace Tensorflow.Operations | |||
| public static Tensor local_response_normalization(Tensor input, int depth_radius = 5, int bias = 1, | |||
| int alpha = 1, float beta = 0.5f, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("LRN", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("LRN", name: name, args: new | |||
| { | |||
| input, | |||
| depth_radius, | |||
| @@ -284,7 +281,7 @@ namespace Tensorflow.Operations | |||
| public static Tensor log_softmax(Tensor logits, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("LogSoftmax", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("LogSoftmax", name: name, args: new | |||
| { | |||
| logits | |||
| }); | |||
| @@ -302,7 +299,7 @@ namespace Tensorflow.Operations | |||
| /// <returns>A `Tensor` of type `bool`.</returns> | |||
| public static Tensor in_top_kv2(Tensor predictions, Tensor targets, int k, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("InTopKV2", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("InTopKV2", name: name, args: new | |||
| { | |||
| predictions, | |||
| targets, | |||
| @@ -314,7 +311,7 @@ namespace Tensorflow.Operations | |||
| public static Tensor leaky_relu(Tensor features, float alpha = 0.2f, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("LeakyRelu", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("LeakyRelu", name: name, args: new | |||
| { | |||
| features, | |||
| alpha | |||
| @@ -330,7 +327,7 @@ namespace Tensorflow.Operations | |||
| string data_format = "NHWC", | |||
| string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("MaxPool", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("MaxPool", name: name, args: new | |||
| { | |||
| input, | |||
| ksize, | |||
| @@ -345,7 +342,7 @@ namespace Tensorflow.Operations | |||
| public static Tensor max_pool_grad(Tensor orig_input, Tensor orig_output, Tensor grad, int[] ksize, int[] strides, string padding, | |||
| string data_format= "NHWC", string name= null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("MaxPoolGrad", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("MaxPoolGrad", name: name, args: new | |||
| { | |||
| orig_input, | |||
| orig_output, | |||
| @@ -361,7 +358,7 @@ namespace Tensorflow.Operations | |||
| public static Tensor[] top_kv2(Tensor input, int k, bool sorted = true, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("TopKV2", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("TopKV2", name: name, args: new | |||
| { | |||
| input, | |||
| k, | |||
| @@ -375,18 +372,15 @@ namespace Tensorflow.Operations | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = EagerTensorPass.Create(); | |||
| var inputs = EagerTensorPass.From(gradients, features); | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "ReluGrad", name, | |||
| inputs.Points, inputs.Length, | |||
| null, null, | |||
| results.Points, results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| null, | |||
| gradients, features); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("ReluGrad", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("ReluGrad", name: name, args: new | |||
| { | |||
| gradients, | |||
| features | |||
| @@ -397,7 +391,7 @@ namespace Tensorflow.Operations | |||
| public static Tensor leaky_relu_grad(Tensor gradients, Tensor features, float alpha = 0.2f, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("LeakyReluGrad", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("LeakyReluGrad", name: name, args: new | |||
| { | |||
| gradients, | |||
| features, | |||
| @@ -411,18 +405,15 @@ namespace Tensorflow.Operations | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = EagerTensorPass.Create(); | |||
| var inputs = EagerTensorPass.From(logits); | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Softmax", name, | |||
| inputs.Points, inputs.Length, | |||
| null, null, | |||
| results.Points, results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| null, | |||
| logits); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("Softmax", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("Softmax", name: name, args: new | |||
| { | |||
| logits | |||
| }); | |||
| @@ -439,7 +430,7 @@ namespace Tensorflow.Operations | |||
| /// <returns></returns> | |||
| public static (Tensor, Tensor) softmax_cross_entropy_with_logits(Tensor features, Tensor labels, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("SoftmaxCrossEntropyWithLogits", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("SoftmaxCrossEntropyWithLogits", name: name, args: new | |||
| { | |||
| features, | |||
| labels | |||
| @@ -477,7 +468,7 @@ namespace Tensorflow.Operations | |||
| /// </remarks> | |||
| public static (Tensor loss, Tensor backprop) sparse_softmax_cross_entropy_with_logits(Tensor features, Tensor labels, string name = "SparseSoftmaxCrossEntropyWithLogits") | |||
| { | |||
| var op = _op_def_lib._apply_op_helper("SparseSoftmaxCrossEntropyWithLogits", name: name, args: new { features, labels }); | |||
| var op = tf._op_def_lib._apply_op_helper("SparseSoftmaxCrossEntropyWithLogits", name: name, args: new { features, labels }); | |||
| int _idx = 0; | |||
| var loss = op.outputs[_idx++]; | |||
| var backprop = op.outputs[_idx++]; | |||
| @@ -494,19 +485,15 @@ namespace Tensorflow.Operations | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Relu", name, new IntPtr[] | |||
| { | |||
| features as EagerTensor, | |||
| }, 1, | |||
| null, null, | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Relu", name, | |||
| null, | |||
| features); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("Relu", name: name, args: new { features }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Relu", name: name, args: new { features }); | |||
| return _op.outputs[0]; | |||
| } | |||
| @@ -514,19 +501,15 @@ namespace Tensorflow.Operations | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Tanh", name, new IntPtr[] | |||
| { | |||
| x as EagerTensor, | |||
| }, 1, | |||
| null, null, | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Tanh", name, | |||
| null, | |||
| x); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("Tanh", name: name, args: new { x }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Tanh", name: name, args: new { x }); | |||
| return _op.outputs[0]; | |||
| } | |||
| } | |||
| @@ -14,32 +14,27 @@ | |||
| limitations under the License. | |||
| ******************************************************************************/ | |||
| using NumSharp; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using static Tensorflow.Binding; | |||
| using Tensorflow.Eager; | |||
| using System.Linq; | |||
| using static Tensorflow.Binding; | |||
| using System.Security.Cryptography.X509Certificates; | |||
| namespace Tensorflow | |||
| { | |||
| public static class gen_array_ops | |||
| { | |||
| public static OpDefLibrary _op_def_lib = new OpDefLibrary(); | |||
| public static Execute _execute = new Execute(); | |||
| public static Tensor batch_to_space_nd<T>(T input, int[] block_shape, int[,] crops, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("BatchToSpaceND", name: name, args: new { input, block_shape, crops }); | |||
| var _op = tf._op_def_lib._apply_op_helper("BatchToSpaceND", name: name, args: new { input, block_shape, crops }); | |||
| return _op.output; | |||
| } | |||
| public static Tensor check_numerics(Tensor tensor, string message, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("CheckNumerics", name: name, args: new { tensor, message }); | |||
| var _op = tf._op_def_lib._apply_op_helper("CheckNumerics", name: name, args: new { tensor, message }); | |||
| return _op.output; | |||
| } | |||
| @@ -55,20 +50,15 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "ConcatV2", name, new IntPtr[] | |||
| { | |||
| values as EagerTensor, | |||
| axis as EagerTensor | |||
| }, 2, | |||
| null, null, | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "ConcatV2", name, | |||
| null, | |||
| values, axis); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("ConcatV2", name: name, args: new { values, axis }); | |||
| var _op = tf._op_def_lib._apply_op_helper("ConcatV2", name: name, args: new { values, axis }); | |||
| return _op.output; | |||
| } | |||
| @@ -79,24 +69,24 @@ namespace Tensorflow | |||
| return concat_v2_eager_fallback(values, axis, name, tf.context); | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("ConcatV2", name: name, args: new { values, axis }); | |||
| var _op = tf._op_def_lib._apply_op_helper("ConcatV2", name: name, args: new { values, axis }); | |||
| return _op.output; | |||
| } | |||
| private static Tensor concat_v2_eager_fallback<T1, T2>(T1[] values, T2 axis, string name, Context ctx) | |||
| { | |||
| var _attr_N = len(values); | |||
| var (_attr_T, input) = _execute.args_to_matching_eager(ctx, args: values.Select(x => (object)x).ToArray()); | |||
| var (_attr_Tidx, axis1) = _execute.args_to_matching_eager(ctx, default_dtype: tf.int32, args: new object[] { axis }); | |||
| var (_attr_T, input) = tf._execute.args_to_matching_eager(ctx, args: values.Select(x => (object)x).ToArray()); | |||
| var (_attr_Tidx, axis1) = tf._execute.args_to_matching_eager(ctx, default_dtype: tf.int32, args: new object[] { axis }); | |||
| var _inputs_flat = input.concat(axis1); | |||
| var _attrs = new object[] { "N", _attr_N, "T", _attr_T, "Tidx", _attr_Tidx }; | |||
| return _execute.execute(ctx, "ConcatV2", 1, _inputs_flat, _attrs, name: name)[0]; | |||
| return tf._execute.execute(ctx, "ConcatV2", 1, _inputs_flat, _attrs, name: name)[0]; | |||
| } | |||
| public static Tensor[] concat_offset(Tensor concat_dim, Tensor[] shape, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("ConcatOffset", name: name, args: new { concat_dim, shape }); | |||
| var _op = tf._op_def_lib._apply_op_helper("ConcatOffset", name: name, args: new { concat_dim, shape }); | |||
| return _op.outputs; | |||
| } | |||
| @@ -134,28 +124,28 @@ namespace Tensorflow | |||
| /// </remarks> | |||
| public static Tensor diag(Tensor diagonal, string name = null) | |||
| { | |||
| var op = _op_def_lib._apply_op_helper("Diag", name: name, args: new { diagonal }); | |||
| var op = tf._op_def_lib._apply_op_helper("Diag", name: name, args: new { diagonal }); | |||
| return op.output; | |||
| } | |||
| public static Tensor expand_dims(Tensor input, int axis, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("ExpandDims", name: name, args: new { input, dim = axis }); | |||
| var _op = tf._op_def_lib._apply_op_helper("ExpandDims", name: name, args: new { input, dim = axis }); | |||
| return _op.outputs[0]; | |||
| } | |||
| public static Tensor gather_v2<T1, T2>(T1 @params, T2 indices, int axis, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("GatherV2", name: name, new { @params, indices, axis }); | |||
| var _op = tf._op_def_lib._apply_op_helper("GatherV2", name: name, new { @params, indices, axis }); | |||
| return _op.outputs[0]; | |||
| } | |||
| public static Tensor pad(Tensor input, Tensor paddings, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Pad", name: name, args: new { input, paddings }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Pad", name: name, args: new { input, paddings }); | |||
| return _op.output; | |||
| } | |||
| @@ -164,7 +154,7 @@ namespace Tensorflow | |||
| { | |||
| if(tf.context.executing_eagerly()) | |||
| { | |||
| var results = wrap_tfe_src.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Pack", name, | |||
| null, | |||
| values, | |||
| @@ -172,13 +162,13 @@ namespace Tensorflow | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("Pack", name: name, args: new { values, axis }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Pack", name: name, args: new { values, axis }); | |||
| return _op.output; | |||
| } | |||
| public static Tensor placeholder(TF_DataType dtype, TensorShape shape = null, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Placeholder", name: name, args: new { dtype, shape }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Placeholder", name: name, args: new { dtype, shape }); | |||
| var _result = _op.outputs; | |||
| var _inputs_flat = _op.inputs; | |||
| @@ -217,7 +207,7 @@ namespace Tensorflow | |||
| /// </remarks> | |||
| public static Tensor prevent_gradient(Tensor input, string message = "", string name = null) | |||
| { | |||
| var op = _op_def_lib._apply_op_helper("PreventGradient", name: name, args: new { input, message }); | |||
| var op = tf._op_def_lib._apply_op_helper("PreventGradient", name: name, args: new { input, message }); | |||
| return op.output; | |||
| } | |||
| @@ -230,40 +220,36 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Identity", name, new IntPtr[] | |||
| { | |||
| input as EagerTensor | |||
| }, 1, | |||
| null, null, | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Identity", name, | |||
| null, | |||
| input); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("Identity", name, new { input }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Identity", name, new { input }); | |||
| return _op.output; | |||
| } | |||
| public static Tensor invert_permutation(Tensor x, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("InvertPermutation", name, new { x }); | |||
| var _op = tf._op_def_lib._apply_op_helper("InvertPermutation", name, new { x }); | |||
| return _op.outputs[0]; | |||
| } | |||
| public static Tensor log(Tensor x, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Log", name: name, args: new { x }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Log", name: name, args: new { x }); | |||
| return _op.outputs[0]; | |||
| } | |||
| public static Tensor rank(Tensor input, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Rank", name: name, args: new { input }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Rank", name: name, args: new { input }); | |||
| return _op.outputs[0]; | |||
| } | |||
| @@ -279,20 +265,15 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = EagerTensorPass.Create(); | |||
| var inputs = EagerTensorPass.From(dims, value); | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Fill", name, | |||
| inputs.Points, inputs.Length, | |||
| null, null, | |||
| results.Points, results.Length); | |||
| status.Check(true); | |||
| null, | |||
| dims, value); | |||
| return results[0].Resolve(); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("Fill", name, new { dims, value }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Fill", name, new { dims, value }); | |||
| return _op.output; | |||
| } | |||
| @@ -307,27 +288,22 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor(), new EagerTensor() }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "BroadcastGradientArgs", name, new IntPtr[] | |||
| { | |||
| s0 as EagerTensor, | |||
| s1 as EagerTensor | |||
| }, 2, | |||
| null, null, | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return (results[0].Resolve(), results[1].Resolve()); | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "BroadcastGradientArgs", name, | |||
| null, | |||
| s0,s1); | |||
| return (results[0], results[1]); | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("BroadcastGradientArgs", name, new { s0, s1 }); | |||
| var _op = tf._op_def_lib._apply_op_helper("BroadcastGradientArgs", name, new { s0, s1 }); | |||
| return (_op.outputs[0], _op.outputs[1]); | |||
| } | |||
| public static Tensor reverse<T>(Tensor tensor, T axis, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("ReverseV2", name, new { tensor, axis }); | |||
| var _op = tf._op_def_lib._apply_op_helper("ReverseV2", name, new { tensor, axis }); | |||
| return _op.output; | |||
| } | |||
| @@ -335,26 +311,21 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Reshape", name, new IntPtr[] | |||
| { | |||
| tensor as EagerTensor, | |||
| shape as EagerTensor | |||
| }, 2, | |||
| null, null, | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Reshape", name, | |||
| null, | |||
| tensor, shape); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("Reshape", name, new { tensor, shape }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Reshape", name, new { tensor, shape }); | |||
| return _op.output; | |||
| } | |||
| public static Tensor reshape(Tensor tensor, int[] shape, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Reshape", name, new { tensor, shape }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Reshape", name, new { tensor, shape }); | |||
| return _op.outputs[0]; | |||
| } | |||
| @@ -367,7 +338,7 @@ namespace Tensorflow | |||
| /// <returns></returns> | |||
| public static (Tensor, Tensor) unique(Tensor x, TF_DataType out_idx = TF_DataType.TF_INT32, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Unique", name, new { x, out_idx }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Unique", name, new { x, out_idx }); | |||
| // TODO | |||
| //var _result = _UniqueOutput._make(_op.outputs); | |||
| return (_op.outputs[0], _op.outputs[1]); | |||
| @@ -375,13 +346,13 @@ namespace Tensorflow | |||
| public static Tensor[] unpack(Tensor value, int num, int axis = 0, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Unpack", name, new { value, num, axis }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Unpack", name, new { value, num, axis }); | |||
| return _op.outputs; | |||
| } | |||
| public static Tensor where(Tensor condition, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Where", name, new { input = condition }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Where", name, new { input = condition }); | |||
| return _op.output; | |||
| } | |||
| @@ -394,22 +365,16 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = EagerTensorPass.Create(); | |||
| var inputs = EagerTensorPass.From(indices, depth, on_value, off_value); | |||
| var attrs = new object[] { "axis", axis }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "OneHot", name, | |||
| inputs.Points, inputs.Length, | |||
| wrap_tfe_src.SetOpAttrs2(attrs), | |||
| op => wrap_tfe_src.SetOpAttrs(op, attrs), | |||
| results.Points, results.Length); | |||
| status.Check(true); | |||
| null, | |||
| indices, depth, on_value, off_value, | |||
| "axis", axis); | |||
| return results[0].Resolve(); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("OneHot", name, new { indices, depth, on_value, off_value, axis }); | |||
| var _op = tf._op_def_lib._apply_op_helper("OneHot", name, new { indices, depth, on_value, off_value, axis }); | |||
| return _op.outputs[0]; | |||
| } | |||
| @@ -422,7 +387,7 @@ namespace Tensorflow | |||
| /// <returns></returns> | |||
| public static Tensor placeholder_with_default<T>(T input, int[] shape, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("PlaceholderWithDefault", name, new { input, shape, name }); | |||
| var _op = tf._op_def_lib._apply_op_helper("PlaceholderWithDefault", name, new { input, shape, name }); | |||
| return _op.outputs[0]; | |||
| } | |||
| @@ -430,26 +395,21 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = EagerTensorPass.Create(); | |||
| var inputs = EagerTensorPass.From(condition, t, e); | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "SelectV2", name, | |||
| inputs.Points, inputs.Length, | |||
| null, null, | |||
| results.Points, results.Length); | |||
| status.Check(true); | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "SelectV2", name, | |||
| null, | |||
| condition, t, e); | |||
| return results[0].Resolve(); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("Select", name, new { condition, t, e }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Select", name, new { condition, t, e }); | |||
| return _op.outputs[0]; | |||
| } | |||
| public static Tensor scatter_nd(Tensor indices, Tensor updates, Tensor[] shape, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("ScatterNd", name, new { indices, updates, shape }); | |||
| var _op = tf._op_def_lib._apply_op_helper("ScatterNd", name, new { indices, updates, shape }); | |||
| return _op.outputs[0]; | |||
| } | |||
| @@ -457,20 +417,16 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Shape", name, new IntPtr[] | |||
| { | |||
| input as EagerTensor, | |||
| }, 1, | |||
| wrap_tfe_src.SetOpAttrs2("out_type", out_type), | |||
| op => wrap_tfe_src.SetOpAttrs(op, "out_type", out_type), | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Shape", name, | |||
| null, | |||
| input, | |||
| "out_type", out_type); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("Shape", name, new { input, out_type }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Shape", name, new { input, out_type }); | |||
| return _op.outputs[0]; | |||
| } | |||
| @@ -483,13 +439,13 @@ namespace Tensorflow | |||
| /// <returns></returns> | |||
| public static Tensor[] shape_n(Tensor[] input, TF_DataType out_type = TF_DataType.TF_INT32, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("ShapeN", name, new { input, out_type }); | |||
| var _op = tf._op_def_lib._apply_op_helper("ShapeN", name, new { input, out_type }); | |||
| return _op.outputs; | |||
| } | |||
| public static Tensor size(Tensor input, TF_DataType out_type = TF_DataType.TF_INT32, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Size", name, new { input, out_type }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Size", name, new { input, out_type }); | |||
| return _op.outputs[0]; | |||
| } | |||
| @@ -503,13 +459,13 @@ namespace Tensorflow | |||
| /// <returns></returns> | |||
| public static Tensor slice(Tensor input, Tensor begin, Tensor size, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Slice", name, new { input, begin, size }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Slice", name, new { input, begin, size }); | |||
| return _op.outputs[0]; | |||
| } | |||
| public static Tensor[] split(Tensor axis, Tensor value, int num_split, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Split", name, new { split_dim = axis, value, num_split }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Split", name, new { split_dim = axis, value, num_split }); | |||
| return _op.outputs; | |||
| } | |||
| @@ -517,38 +473,33 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Tile", name, new IntPtr[] | |||
| { | |||
| input as EagerTensor, | |||
| multiples as EagerTensor | |||
| }, 2, | |||
| null, null, | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Tile", name, | |||
| null, | |||
| input, multiples); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("Tile", name, new { input, multiples }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Tile", name, new { input, multiples }); | |||
| return _op.outputs[0]; | |||
| } | |||
| public static Tensor transpose<T1, T2>(T1 x, T2 perm, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Transpose", name, new { x, perm }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Transpose", name, new { x, perm }); | |||
| return _op.outputs[0]; | |||
| } | |||
| public static Tensor zeros_like(Tensor x, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("ZerosLike", name, new { x }); | |||
| var _op = tf._op_def_lib._apply_op_helper("ZerosLike", name, new { x }); | |||
| return _op.outputs[0]; | |||
| } | |||
| public static Tensor stop_gradient(Tensor x, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("StopGradient", name, args: new { input = x, name }); | |||
| var _op = tf._op_def_lib._apply_op_helper("StopGradient", name, args: new { input = x, name }); | |||
| return _op.output; | |||
| } | |||
| @@ -563,31 +514,20 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| var attrs = new object[] | |||
| { | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "StridedSlice", name, | |||
| null, | |||
| input, begin, end, strides, | |||
| "begin_mask", begin_mask, | |||
| "end_mask", end_mask, | |||
| "ellipsis_mask", ellipsis_mask, | |||
| "new_axis_mask", new_axis_mask, | |||
| "shrink_axis_mask", shrink_axis_mask | |||
| }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "StridedSlice", name, new IntPtr[] | |||
| { | |||
| input as EagerTensor, | |||
| begin as EagerTensor, | |||
| end as EagerTensor, | |||
| strides as EagerTensor, | |||
| }, 4, | |||
| wrap_tfe_src.SetOpAttrs2(attrs), | |||
| op => wrap_tfe_src.SetOpAttrs(op, attrs), | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| "shrink_axis_mask", shrink_axis_mask); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("StridedSlice", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("StridedSlice", name, new | |||
| { | |||
| input, | |||
| begin, | |||
| @@ -611,7 +551,7 @@ namespace Tensorflow | |||
| int shrink_axis_mask = 0, | |||
| string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("StridedSlice", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("StridedSlice", name, new | |||
| { | |||
| input, | |||
| begin, | |||
| @@ -651,7 +591,7 @@ namespace Tensorflow | |||
| int begin_mask = 0, int end_mask = 0, int ellipsis_mask = 0, int new_axis_mask = 0, | |||
| int shrink_axis_mask = 0, string name = null) | |||
| { | |||
| var op = _op_def_lib._apply_op_helper("StridedSliceGrad", name: name, args: new | |||
| var op = tf._op_def_lib._apply_op_helper("StridedSliceGrad", name: name, args: new | |||
| { | |||
| shape, | |||
| begin, | |||
| @@ -670,7 +610,7 @@ namespace Tensorflow | |||
| public static Tensor slice<Tb, Ts>(Tensor input, Tb begin, Ts size, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Slice", name, new { input, begin, size }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Slice", name, new { input, begin, size }); | |||
| return _op.outputs[0]; | |||
| } | |||
| @@ -689,21 +629,17 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Squeeze", name, new IntPtr[] | |||
| { | |||
| input as EagerTensor | |||
| }, 1, | |||
| wrap_tfe_src.SetOpAttrs2("squeeze_dims", axis), | |||
| op => wrap_tfe_src.SetOpAttrs(op, "squeeze_dims", axis), | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Squeeze", name, | |||
| null, | |||
| input, | |||
| "squeeze_dims", axis); | |||
| return results[0]; | |||
| } | |||
| if (axis == null) axis = new int[0]; | |||
| var _op = _op_def_lib._apply_op_helper("Squeeze", name, args: new { input, squeeze_dims = axis }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Squeeze", name, args: new { input, squeeze_dims = axis }); | |||
| return _op.outputs[0]; | |||
| } | |||
| @@ -719,7 +655,7 @@ namespace Tensorflow | |||
| /// <returns> `Tensor`. Has the same type as `s0`.</returns> | |||
| public static Tensor broadcast_args(Tensor s0, Tensor s1, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("BroadcastArgs", name, args: new { s0, s1, name }); | |||
| var _op = tf._op_def_lib._apply_op_helper("BroadcastArgs", name, args: new { s0, s1, name }); | |||
| return _op.outputs[0]; | |||
| } | |||
| @@ -735,19 +671,15 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = EagerTensorPass.Create(); | |||
| var inputs = EagerTensorPass.From(input, shape); | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "BroadcastTo", name, | |||
| inputs.Points, inputs.Length, | |||
| null, null, | |||
| results.Points, results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| null, | |||
| input, shape); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("BroadcastTo", name, args: new { input, shape, name }); | |||
| var _op = tf._op_def_lib._apply_op_helper("BroadcastTo", name, args: new { input, shape, name }); | |||
| return _op.outputs[0]; | |||
| } | |||
| @@ -15,16 +15,15 @@ | |||
| ******************************************************************************/ | |||
| using Tensorflow.Operations; | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow | |||
| { | |||
| public class gen_control_flow_ops | |||
| { | |||
| public static OpDefLibrary _op_def_lib = new OpDefLibrary(); | |||
| public static Operation control_trigger(string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("ControlTrigger", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("ControlTrigger", name, new | |||
| { | |||
| }); | |||
| @@ -42,7 +41,7 @@ namespace Tensorflow | |||
| /// <returns></returns> | |||
| public static Tensor enter(Tensor data, string frame_name = "frame_name", bool is_constant = false, int parallel_iterations = 10, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Enter", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("Enter", name, new | |||
| { | |||
| data, | |||
| frame_name, | |||
| @@ -61,7 +60,7 @@ namespace Tensorflow | |||
| /// <returns></returns> | |||
| public static Tensor loop_cond(Tensor input, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("LoopCond", name, new { input }); | |||
| var _op = tf._op_def_lib._apply_op_helper("LoopCond", name, new { input }); | |||
| return _op.output; | |||
| } | |||
| @@ -74,7 +73,7 @@ namespace Tensorflow | |||
| /// <returns></returns> | |||
| public static Tensor ref_next_iteration(Tensor data, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("RefNextIteration", name, new { data }); | |||
| var _op = tf._op_def_lib._apply_op_helper("RefNextIteration", name, new { data }); | |||
| return _op; | |||
| } | |||
| @@ -87,7 +86,7 @@ namespace Tensorflow | |||
| /// <returns></returns> | |||
| public static Tensor next_iteration(Tensor data, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("NextIteration", name, new { data }); | |||
| var _op = tf._op_def_lib._apply_op_helper("NextIteration", name, new { data }); | |||
| return _op; | |||
| } | |||
| @@ -100,7 +99,7 @@ namespace Tensorflow | |||
| /// <returns></returns> | |||
| public static Tensor ref_exit(Tensor data, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("RefExit", name, new { data }); | |||
| var _op = tf._op_def_lib._apply_op_helper("RefExit", name, new { data }); | |||
| return _op; | |||
| } | |||
| @@ -113,21 +112,21 @@ namespace Tensorflow | |||
| /// <returns></returns> | |||
| public static Tensor _exit(Tensor data, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Exit", name, new { data }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Exit", name, new { data }); | |||
| return _op; | |||
| } | |||
| public static Operation no_op(string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("NoOp", name, null); | |||
| var _op = tf._op_def_lib._apply_op_helper("NoOp", name, null); | |||
| return _op; | |||
| } | |||
| public static Tensor[] ref_switch(Tensor data, Tensor pred, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("RefSwitch", name, new { data, pred }); | |||
| var _op = tf._op_def_lib._apply_op_helper("RefSwitch", name, new { data, pred }); | |||
| return _op.outputs; | |||
| } | |||
| @@ -151,7 +150,7 @@ namespace Tensorflow | |||
| /// </returns> | |||
| public static Tensor[] @switch(Tensor data, Tensor pred, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Switch", name, new { data, pred }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Switch", name, new { data, pred }); | |||
| var _inputs_flat = _op.inputs; | |||
| var _attrs = ("T", _op.get_attr("T")); | |||
| // TODO: missing original code | |||
| @@ -161,14 +160,14 @@ namespace Tensorflow | |||
| public static MergeOutput ref_merge(Tensor[] inputs, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("RefMerge", name, new { inputs }); | |||
| var _op = tf._op_def_lib._apply_op_helper("RefMerge", name, new { inputs }); | |||
| return new MergeOutput(_op.outputs); | |||
| } | |||
| public static MergeOutput merge(Tensor[] inputs, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Merge", name, new { inputs }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Merge", name, new { inputs }); | |||
| return new MergeOutput(_op.outputs); | |||
| } | |||
| @@ -14,15 +14,15 @@ | |||
| limitations under the License. | |||
| ******************************************************************************/ | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow | |||
| { | |||
| public class gen_ctc_ops | |||
| { | |||
| public static OpDefLibrary _op_def_lib = new OpDefLibrary(); | |||
| public static Tensor[] ctc_greedy_decoder(Tensor inputs, Tensor sequence_length, bool merge_repeated = true, string name = "CTCGreedyDecoder") | |||
| { | |||
| var op = _op_def_lib._apply_op_helper("CTCGreedyDecoder", name: name, args: new | |||
| var op = tf._op_def_lib._apply_op_helper("CTCGreedyDecoder", name: name, args: new | |||
| { | |||
| inputs, | |||
| sequence_length, | |||
| @@ -14,15 +14,15 @@ | |||
| limitations under the License. | |||
| ******************************************************************************/ | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow | |||
| { | |||
| public class gen_data_flow_ops | |||
| { | |||
| public static OpDefLibrary _op_def_lib = new OpDefLibrary(); | |||
| public static Tensor dynamic_stitch(Tensor[] indices, Tensor[] data, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("DynamicStitch", name, new { indices, data }); | |||
| var _op = tf._op_def_lib._apply_op_helper("DynamicStitch", name, new { indices, data }); | |||
| return _op.output; | |||
| } | |||
| @@ -30,7 +30,7 @@ namespace Tensorflow | |||
| public static Tensor[] dynamic_partition(Tensor data, Tensor partitions, int num_partitions, | |||
| string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("DynamicPartition", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("DynamicPartition", name, new | |||
| { | |||
| data, | |||
| partitions, | |||
| @@ -44,7 +44,7 @@ namespace Tensorflow | |||
| TensorShape element_shape = null, bool dynamic_size = false, bool clear_after_read = true, | |||
| bool identical_element_shapes = false, string tensor_array_name = "", string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("TensorArrayV3", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("TensorArrayV3", name, new | |||
| { | |||
| size, | |||
| dtype, | |||
| @@ -61,7 +61,7 @@ namespace Tensorflow | |||
| public static Tensor tensor_array_scatter_v3(Tensor handle, Tensor indices, Tensor value, | |||
| Tensor flow_in, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("TensorArrayScatterV3", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("TensorArrayScatterV3", name, new | |||
| { | |||
| handle, | |||
| indices, | |||
| @@ -76,7 +76,7 @@ namespace Tensorflow | |||
| int capacity = -1, string container = "", string shared_name = "", | |||
| string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("PaddingFIFOQueueV2", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("PaddingFIFOQueueV2", name, new | |||
| { | |||
| component_types, | |||
| shapes, | |||
| @@ -92,7 +92,7 @@ namespace Tensorflow | |||
| int capacity = -1, string container = "", string shared_name = "", | |||
| string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("FIFOQueueV2", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("FIFOQueueV2", name, new | |||
| { | |||
| component_types, | |||
| shapes, | |||
| @@ -108,7 +108,7 @@ namespace Tensorflow | |||
| int capacity = -1, string container = "", string shared_name = "", | |||
| string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("PriorityQueueV2", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("PriorityQueueV2", name, new | |||
| { | |||
| component_types, | |||
| shapes, | |||
| @@ -124,7 +124,7 @@ namespace Tensorflow | |||
| int capacity = -1, int min_after_dequeue = 0, int seed = 0, int seed2 = 0, | |||
| string container = "", string shared_name = "", string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("RandomShuffleQueueV2", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("RandomShuffleQueueV2", name, new | |||
| { | |||
| component_types, | |||
| shapes, | |||
| @@ -141,7 +141,7 @@ namespace Tensorflow | |||
| public static Operation queue_enqueue(Tensor handle, Tensor[] components, int timeout_ms = -1, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("QueueEnqueue", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("QueueEnqueue", name, new | |||
| { | |||
| handle, | |||
| components, | |||
| @@ -153,7 +153,7 @@ namespace Tensorflow | |||
| public static Operation queue_enqueue_v2(Tensor handle, Tensor[] components, int timeout_ms = -1, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("QueueEnqueueV2", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("QueueEnqueueV2", name, new | |||
| { | |||
| handle, | |||
| components, | |||
| @@ -165,7 +165,7 @@ namespace Tensorflow | |||
| public static Tensor[] queue_dequeue_v2(Tensor handle, TF_DataType[] component_types, int timeout_ms = -1, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("QueueDequeueV2", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("QueueDequeueV2", name, new | |||
| { | |||
| handle, | |||
| component_types, | |||
| @@ -177,7 +177,7 @@ namespace Tensorflow | |||
| public static Tensor[] queue_dequeue(Tensor handle, TF_DataType[] component_types, int timeout_ms = -1, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("QueueDequeue", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("QueueDequeue", name, new | |||
| { | |||
| handle, | |||
| component_types, | |||
| @@ -189,7 +189,7 @@ namespace Tensorflow | |||
| public static Operation queue_enqueue_many_v2(Tensor handle, Tensor[] components, int timeout_ms = -1, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("QueueEnqueueManyV2", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("QueueEnqueueManyV2", name, new | |||
| { | |||
| handle, | |||
| components, | |||
| @@ -201,7 +201,7 @@ namespace Tensorflow | |||
| public static Tensor[] queue_dequeue_many_v2(Tensor handle, int n, TF_DataType[] component_types, int timeout_ms = -1, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("QueueDequeueManyV2", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("QueueDequeueManyV2", name, new | |||
| { | |||
| handle, | |||
| n, | |||
| @@ -223,7 +223,7 @@ namespace Tensorflow | |||
| /// <returns></returns> | |||
| public static Tensor tensor_array_read_v3(Tensor handle, Tensor index, Tensor flow_in, TF_DataType dtype, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("TensorArrayReadV3", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("TensorArrayReadV3", name, new | |||
| { | |||
| handle, | |||
| index, | |||
| @@ -236,7 +236,7 @@ namespace Tensorflow | |||
| public static Tensor tensor_array_write_v3(Tensor handle, Tensor index, Tensor value, Tensor flow_in, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("TensorArrayWriteV3", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("TensorArrayWriteV3", name, new | |||
| { | |||
| handle, | |||
| index, | |||
| @@ -249,7 +249,7 @@ namespace Tensorflow | |||
| public static Tensor tensor_array_size_v3(Tensor handle, Tensor flow_in, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("TensorArraySizeV3", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("TensorArraySizeV3", name, new | |||
| { | |||
| handle, | |||
| flow_in | |||
| @@ -261,7 +261,7 @@ namespace Tensorflow | |||
| public static Tensor tensor_array_gather_v3(Tensor handle, Tensor indices, Tensor flow_in, | |||
| TF_DataType dtype, TensorShape element_shape = null, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("TensorArrayGatherV3", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("TensorArrayGatherV3", name, new | |||
| { | |||
| handle, | |||
| indices, | |||
| @@ -276,7 +276,7 @@ namespace Tensorflow | |||
| public static Tensor stack_v2(Tensor max_size, TF_DataType elem_type, string stack_name = "", | |||
| string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("StackV2", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("StackV2", name, new | |||
| { | |||
| max_size, | |||
| elem_type, | |||
| @@ -289,7 +289,7 @@ namespace Tensorflow | |||
| public static Tensor stack_push_v2(Tensor handle, Tensor elem, bool swap_memory = false, | |||
| string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("StackPushV2", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("StackPushV2", name, new | |||
| { | |||
| handle, | |||
| elem, | |||
| @@ -301,7 +301,7 @@ namespace Tensorflow | |||
| public static Tensor stack_pop_v2(Tensor handle, TF_DataType elem_type, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("StackPopV2", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("StackPopV2", name, new | |||
| { | |||
| handle, | |||
| elem_type | |||
| @@ -21,8 +21,6 @@ namespace Tensorflow | |||
| { | |||
| public class gen_image_ops | |||
| { | |||
| public static OpDefLibrary _op_def_lib = new OpDefLibrary(); | |||
| public static Tensor convert_image_dtype(Tensor image, TF_DataType dtype, bool saturate = false, string name= null) | |||
| { | |||
| if (dtype == image.dtype) | |||
| @@ -73,7 +71,7 @@ namespace Tensorflow | |||
| } | |||
| else | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("DecodeJpeg", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("DecodeJpeg", name: name, args: new | |||
| { | |||
| contents, | |||
| channels, | |||
| @@ -98,7 +96,7 @@ namespace Tensorflow | |||
| } | |||
| else | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("DecodeGif", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("DecodeGif", name: name, args: new | |||
| { | |||
| contents | |||
| }); | |||
| @@ -119,7 +117,7 @@ namespace Tensorflow | |||
| } | |||
| else | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("DecodePng", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("DecodePng", name: name, args: new | |||
| { | |||
| contents, | |||
| channels, | |||
| @@ -141,7 +139,7 @@ namespace Tensorflow | |||
| } | |||
| else | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("DecodeBmp", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("DecodeBmp", name: name, args: new | |||
| { | |||
| contents, | |||
| channels | |||
| @@ -159,7 +157,7 @@ namespace Tensorflow | |||
| } | |||
| else | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("ResizeBilinear", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("ResizeBilinear", name: name, args: new | |||
| { | |||
| images, | |||
| size, | |||
| @@ -173,7 +171,7 @@ namespace Tensorflow | |||
| public static Tensor resize_nearest_neighbor<Tsize>(Tensor images, Tsize size, bool align_corners = false, | |||
| bool half_pixel_centers = false, string name = null) | |||
| { | |||
| var op = _op_def_lib._apply_op_helper("ResizeNearestNeighbor", name: name, args: new | |||
| var op = tf._op_def_lib._apply_op_helper("ResizeNearestNeighbor", name: name, args: new | |||
| { | |||
| images, | |||
| size, | |||
| @@ -187,7 +185,7 @@ namespace Tensorflow | |||
| public static Tensor resize_nearest_neighbor_grad<Tsize>(Tensor grads, Tsize size, bool align_corners = false, | |||
| bool half_pixel_centers = false, string name = null) | |||
| { | |||
| var op = _op_def_lib._apply_op_helper("ResizeNearestNeighborGrad", name: name, args: new | |||
| var op = tf._op_def_lib._apply_op_helper("ResizeNearestNeighborGrad", name: name, args: new | |||
| { | |||
| grads, | |||
| size, | |||
| @@ -14,29 +14,29 @@ | |||
| limitations under the License. | |||
| ******************************************************************************/ | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow | |||
| { | |||
| public class gen_io_ops | |||
| { | |||
| public static OpDefLibrary _op_def_lib = new OpDefLibrary(); | |||
| public static Operation save_v2(Tensor prefix, string[] tensor_names, string[] shape_and_slices, Tensor[] tensors, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("SaveV2", name: name, args: new { prefix, tensor_names, shape_and_slices, tensors }); | |||
| var _op = tf._op_def_lib._apply_op_helper("SaveV2", name: name, args: new { prefix, tensor_names, shape_and_slices, tensors }); | |||
| return _op; | |||
| } | |||
| public static Tensor[] restore_v2(Tensor prefix, string[] tensor_names, string[] shape_and_slices, TF_DataType[] dtypes, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("RestoreV2", name: name, args: new { prefix, tensor_names, shape_and_slices, dtypes }); | |||
| var _op = tf._op_def_lib._apply_op_helper("RestoreV2", name: name, args: new { prefix, tensor_names, shape_and_slices, dtypes }); | |||
| return _op.outputs; | |||
| } | |||
| public static Tensor read_file<T>(T filename, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("ReadFile", name: name, args: new { filename }); | |||
| var _op = tf._op_def_lib._apply_op_helper("ReadFile", name: name, args: new { filename }); | |||
| return _op.outputs[0]; | |||
| } | |||
| @@ -15,19 +15,18 @@ | |||
| ******************************************************************************/ | |||
| using System.Collections.Generic; | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow | |||
| { | |||
| public class gen_logging_ops | |||
| { | |||
| public static OpDefLibrary _op_def_lib = new OpDefLibrary(); | |||
| public static Operation _assert(Tensor condition, object[] data, int? summarize = 3, string name = null) | |||
| { | |||
| if (!summarize.HasValue) | |||
| summarize = 3; | |||
| var _op = _op_def_lib._apply_op_helper("Assert", name, args: new { condition, data, summarize }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Assert", name, args: new { condition, data, summarize }); | |||
| return _op; | |||
| } | |||
| @@ -35,7 +34,7 @@ namespace Tensorflow | |||
| public static Tensor histogram_summary(string tag, Tensor values, string name = null) | |||
| { | |||
| var dict = new Dictionary<string, object>(); | |||
| var op = _op_def_lib._apply_op_helper("HistogramSummary", name: name, args: new { tag, values }); | |||
| var op = tf._op_def_lib._apply_op_helper("HistogramSummary", name: name, args: new { tag, values }); | |||
| return op.output; | |||
| } | |||
| @@ -64,7 +63,7 @@ namespace Tensorflow | |||
| var dict = new Dictionary<string, object>(); | |||
| dict["tags"] = tags; | |||
| dict["values"] = values; | |||
| var op = _op_def_lib._apply_op_helper("ScalarSummary", name: name, keywords: dict); | |||
| var op = tf._op_def_lib._apply_op_helper("ScalarSummary", name: name, keywords: dict); | |||
| return op.output; | |||
| } | |||
| @@ -95,7 +94,7 @@ namespace Tensorflow | |||
| { | |||
| var dict = new Dictionary<string, object>(); | |||
| dict["inputs"] = inputs; | |||
| var op = _op_def_lib._apply_op_helper("MergeSummary", name: name, keywords: dict); | |||
| var op = tf._op_def_lib._apply_op_helper("MergeSummary", name: name, keywords: dict); | |||
| return op.output; | |||
| } | |||
| } | |||
| @@ -9,19 +9,14 @@ namespace Tensorflow | |||
| { | |||
| public static partial class gen_math_ops | |||
| { | |||
| public static EagerTensor mul(IntPtr x, IntPtr y, string name = null) | |||
| public static Tensor mul(IntPtr x, IntPtr y, string name = null) | |||
| { | |||
| var results = EagerTensorPass.Create(); | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Mul", name, new IntPtr[] | |||
| { | |||
| x, | |||
| y, | |||
| }, 2, | |||
| null, null, | |||
| results.Points, results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Mul", name, | |||
| null, | |||
| x, y); | |||
| return results[0]; | |||
| } | |||
| } | |||
| } | |||
| @@ -22,8 +22,6 @@ namespace Tensorflow | |||
| { | |||
| public class gen_random_ops | |||
| { | |||
| public static OpDefLibrary _op_def_lib = new OpDefLibrary(); | |||
| /// <summary> | |||
| /// Outputs random values from a normal distribution. | |||
| /// </summary> | |||
| @@ -42,25 +40,18 @@ namespace Tensorflow | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = EagerTensorPass.Create(); | |||
| var attrs = new object[] | |||
| { | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "RandomStandardNormal", name, | |||
| null, | |||
| shape, | |||
| "seed", seed, | |||
| "seed2", seed2, | |||
| "dtype", dtype | |||
| }; | |||
| var inputs = EagerTensorPass.From(shape); | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "RandomStandardNormal", name, | |||
| inputs.Points, inputs.Length, | |||
| wrap_tfe_src.SetOpAttrs2(attrs), | |||
| op => wrap_tfe_src.SetOpAttrs(op, attrs), | |||
| results.Points, results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| "dtype", dtype); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("RandomStandardNormal", | |||
| var _op = tf._op_def_lib._apply_op_helper("RandomStandardNormal", | |||
| name: name, | |||
| args: new { shape, dtype, seed, seed2 }); | |||
| @@ -84,7 +75,7 @@ namespace Tensorflow | |||
| if (!seed2.HasValue) | |||
| seed2 = 0; | |||
| var _op = _op_def_lib._apply_op_helper("RandomUniformInt", | |||
| var _op = tf._op_def_lib._apply_op_helper("RandomUniformInt", | |||
| name: name, | |||
| args: new { shape, minval, maxval, seed, seed2 }); | |||
| @@ -107,7 +98,7 @@ namespace Tensorflow | |||
| if (!seed2.HasValue) | |||
| seed2 = 0; | |||
| var _op = _op_def_lib._apply_op_helper("RandomUniform", | |||
| var _op = tf._op_def_lib._apply_op_helper("RandomUniform", | |||
| name: name, | |||
| args: new { shape, dtype, seed, seed2}); | |||
| @@ -125,7 +116,7 @@ namespace Tensorflow | |||
| public static Tensor random_shuffle(Tensor value, int seed = 0, int seed2 = 0, | |||
| string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("RandomShuffle", | |||
| var _op = tf._op_def_lib._apply_op_helper("RandomShuffle", | |||
| name: name, | |||
| args: new { value, seed, seed2 }); | |||
| @@ -151,25 +142,18 @@ namespace Tensorflow | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = EagerTensorPass.Create(); | |||
| var inputs = EagerTensorPass.From(shape); | |||
| var attrs = new object[] | |||
| { | |||
| "seed", seed, | |||
| "seed2", seed2, | |||
| "dtype", dtype | |||
| }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "TruncatedNormal", name, | |||
| inputs.Points, inputs.Length, | |||
| wrap_tfe_src.SetOpAttrs2(attrs), | |||
| op => wrap_tfe_src.SetOpAttrs(op, attrs), | |||
| results.Points, results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| null, | |||
| shape, | |||
| "seed", seed, | |||
| "seed2", seed2, | |||
| "dtype", dtype); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("TruncatedNormal", | |||
| var _op = tf._op_def_lib._apply_op_helper("TruncatedNormal", | |||
| name: name, | |||
| args: new { shape, dtype, seed, seed2 }); | |||
| @@ -186,7 +170,7 @@ namespace Tensorflow | |||
| if (output_dtype == TF_DataType.DtInvalid) | |||
| output_dtype = TF_DataType.TF_INT64; | |||
| var _op = _op_def_lib._apply_op_helper("Multinomial", | |||
| var _op = tf._op_def_lib._apply_op_helper("Multinomial", | |||
| name: name, | |||
| args: new { logits, num_samples, seed, seed2, output_dtype }); | |||
| @@ -23,21 +23,16 @@ namespace Tensorflow | |||
| { | |||
| public static class gen_resource_variable_ops | |||
| { | |||
| public static OpDefLibrary _op_def_lib = new OpDefLibrary(); | |||
| public static Operation assign_sub_variable_op(Tensor resource, Tensor value, string name = null) | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = EagerTensorPass.Create(); | |||
| var inputs = EagerTensorPass.From(resource, value); | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "AssignSubVariableOp", name, | |||
| inputs.Points, inputs.Length, | |||
| null, null, | |||
| results.Points, results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| null, | |||
| resource, value); | |||
| return null; | |||
| } | |||
| return null; | |||
| @@ -54,13 +49,11 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var inputs = EagerTensorPass.From(resource, value); | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "AssignAddVariableOp", name, | |||
| inputs.Points, inputs.Length, | |||
| null, null, | |||
| null, 0); | |||
| status.Check(true); | |||
| null, | |||
| resource, value); | |||
| return null; | |||
| } | |||
| @@ -71,17 +64,15 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var inputs = EagerTensorPass.From(resource, value); | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "AssignVariableOp", name, | |||
| inputs.Points, inputs.Length, | |||
| null, null, | |||
| null, 0); | |||
| status.Check(true); | |||
| null, | |||
| resource, value); | |||
| return null; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("AssignVariableOp", name, new { resource, value }); | |||
| var _op = tf._op_def_lib._apply_op_helper("AssignVariableOp", name, new { resource, value }); | |||
| return _op; | |||
| } | |||
| @@ -90,18 +81,15 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "VarIsInitializedOp", name, | |||
| new IntPtr[] { resource as EagerTensor }, | |||
| 1, | |||
| null, null, | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| null, | |||
| resource); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("VarIsInitializedOp", name, new { resource }); | |||
| var _op = tf._op_def_lib._apply_op_helper("VarIsInitializedOp", name, new { resource }); | |||
| return _op.output; | |||
| } | |||
| @@ -120,24 +108,18 @@ namespace Tensorflow | |||
| { | |||
| if(tf.context.executing_eagerly()) | |||
| { | |||
| var results = EagerTensorPass.Create(); | |||
| var attrs = new object[] | |||
| { | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "VarHandleOp", name, | |||
| null, | |||
| "container", container, | |||
| "shared_name", shared_name, | |||
| "dtype", dtype, | |||
| "shape", shape.dims | |||
| }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "VarHandleOp", name, null, 0, | |||
| wrap_tfe_src.SetOpAttrs2(attrs), | |||
| op => wrap_tfe_src.SetOpAttrs(op, attrs), | |||
| results.Points, results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| "shape", shape.dims); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("VarHandleOp", name, new { | |||
| var _op = tf._op_def_lib._apply_op_helper("VarHandleOp", name, new { | |||
| dtype, | |||
| shape, | |||
| container, | |||
| @@ -158,18 +140,16 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| var results = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "ReadVariableOp", name, | |||
| new IntPtr[] { resource as EagerTensor }, 1, | |||
| wrap_tfe_src.SetOpAttrs2("dtype", dtype), | |||
| op => wrap_tfe_src.SetOpAttrs(op, "dtype", dtype), | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| null, | |||
| resource, | |||
| "dtype", dtype); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("ReadVariableOp", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("ReadVariableOp", name, new | |||
| { | |||
| resource, | |||
| dtype | |||
| @@ -181,7 +161,7 @@ namespace Tensorflow | |||
| public static Tensor resource_gather(Tensor resource, Tensor indices, TF_DataType dtype, | |||
| int batch_dims = 0, bool validate_indices = true, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("ResourceGather", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("ResourceGather", name, new | |||
| { | |||
| resource, | |||
| indices, | |||
| @@ -15,14 +15,12 @@ | |||
| ******************************************************************************/ | |||
| using System.Collections.Generic; | |||
| using Tensorflow.Framework; | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow | |||
| { | |||
| public class gen_sparse_ops | |||
| { | |||
| public static OpDefLibrary _op_def_lib = new OpDefLibrary(); | |||
| /// <summary> | |||
| /// Converts a sparse representation into a dense tensor. | |||
| /// </summary> | |||
| @@ -40,7 +38,7 @@ namespace Tensorflow | |||
| bool validate_indices = true, | |||
| string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("SparseToDense", name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("SparseToDense", name, args: new | |||
| { | |||
| sparse_indices, | |||
| output_shape, | |||
| @@ -59,7 +57,7 @@ namespace Tensorflow | |||
| bool validate_indices = true, | |||
| string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("SparseToDense", name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("SparseToDense", name, args: new | |||
| { | |||
| sparse_indices, | |||
| output_shape, | |||
| @@ -17,18 +17,16 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow | |||
| { | |||
| public class gen_string_ops | |||
| { | |||
| static readonly OpDefLibrary _op_def_lib; | |||
| static gen_string_ops() { _op_def_lib = new OpDefLibrary(); } | |||
| public static Tensor substr(Tensor input, int pos, int len, | |||
| string name = null, string @uint = "BYTE") | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Substr", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("Substr", name: name, args: new | |||
| { | |||
| input, | |||
| pos, | |||
| @@ -1,5 +1,5 @@ | |||
| /***************************************************************************** | |||
| Copyright 2018 The TensorFlow.NET Authors. All Rights Reserved. | |||
| Copyright 2020 Haiping Chen. All Rights Reserved. | |||
| Licensed under the Apache License, Version 2.0 (the "License"); | |||
| you may not use this file except in compliance with the License. | |||
| @@ -14,7 +14,6 @@ | |||
| limitations under the License. | |||
| ******************************************************************************/ | |||
| using NumSharp; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| @@ -112,7 +111,7 @@ namespace Tensorflow | |||
| public static Tensor crop_and_resize(Tensor image, Tensor boxes, Tensor box_ind, Tensor crop_size, string method, float extrapolation_value, string name) | |||
| { | |||
| var _op = gen_nn_ops._op_def_lib._apply_op_helper("CropAndResize", name: name, args: new | |||
| var _op = tf._op_def_lib._apply_op_helper("CropAndResize", name: name, args: new | |||
| { | |||
| image, | |||
| boxes, | |||
| @@ -567,10 +567,8 @@ namespace Tensorflow | |||
| } | |||
| else | |||
| { | |||
| if(x is EagerTensor) | |||
| { | |||
| return constant_op.constant(np.arange(x.shape.Rank)); | |||
| } | |||
| if(x is Tensor) | |||
| return constant_op.constant(np.arange(x.rank)); | |||
| var rank = array_ops.rank(x); | |||
| return range(0, rank, 1); | |||
| @@ -1,17 +0,0 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| namespace Tensorflow | |||
| { | |||
| public class GCItemCounter | |||
| { | |||
| public GCItemType ItemType { get; set; } | |||
| public int RefCounter { get; set; } | |||
| public DateTime LastUpdateTime { get; set; } | |||
| public IntPtr Handle { get; set; } | |||
| public override string ToString() | |||
| => $"{ItemType} {RefCounter} {LastUpdateTime}"; | |||
| } | |||
| } | |||
| @@ -1,13 +0,0 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| namespace Tensorflow | |||
| { | |||
| public enum GCItemType | |||
| { | |||
| TensorHandle = 0, | |||
| LocalTensorHandle = 1, | |||
| EagerTensorHandle = 2 | |||
| } | |||
| } | |||
| @@ -1,97 +0,0 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading; | |||
| using System.Threading.Tasks; | |||
| using System.Timers; | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow | |||
| { | |||
| public class GarbageCollector | |||
| { | |||
| static Dictionary<IntPtr, GCItemCounter> container = new Dictionary<IntPtr, GCItemCounter>(); | |||
| static object locker = new object(); | |||
| public static void Init() | |||
| { | |||
| /*Task.Run(() => | |||
| { | |||
| while (true) | |||
| { | |||
| Thread.Sleep(100); | |||
| Recycle(); | |||
| } | |||
| });*/ | |||
| } | |||
| public static void Increase(IntPtr handle, GCItemType type) | |||
| { | |||
| if (handle == IntPtr.Zero) | |||
| return; | |||
| if (container.ContainsKey(handle)) | |||
| { | |||
| container[handle].RefCounter++; | |||
| container[handle].LastUpdateTime = DateTime.Now; | |||
| } | |||
| else | |||
| { | |||
| lock (locker) | |||
| { | |||
| container[handle] = new GCItemCounter | |||
| { | |||
| ItemType = type, | |||
| RefCounter = 1, | |||
| Handle = handle, | |||
| LastUpdateTime = DateTime.Now | |||
| }; | |||
| } | |||
| } | |||
| } | |||
| public static void Decrease(IntPtr handle) | |||
| { | |||
| lock (locker) | |||
| { | |||
| if (handle != IntPtr.Zero && container.ContainsKey(handle)) | |||
| container[handle].RefCounter--; | |||
| } | |||
| } | |||
| private static void Recycle() | |||
| { | |||
| // dispose before 1 sec | |||
| lock (locker) | |||
| { | |||
| var items = container.Values | |||
| .Where(x => x.RefCounter <= 0 && (DateTime.Now - x.LastUpdateTime).TotalMilliseconds > 300) | |||
| .ToArray(); | |||
| foreach (var item in items) | |||
| { | |||
| item.RefCounter = 0; | |||
| container.Remove(item.Handle); | |||
| switch (item.ItemType) | |||
| { | |||
| case GCItemType.TensorHandle: | |||
| //print($"c_api.TF_DeleteTensor({item.Handle.ToString("x16")})"); | |||
| c_api.TF_DeleteTensor(item.Handle); | |||
| break; | |||
| case GCItemType.LocalTensorHandle: | |||
| //print($"c_api.TFE_DeleteTensorHandle({item.Handle.ToString("x16")})"); | |||
| c_api.TFE_DeleteTensorHandle(item.Handle); | |||
| break; | |||
| case GCItemType.EagerTensorHandle: | |||
| //print($"c_api.TFE_DeleteEagerTensor({item.Handle.ToString("x16")})"); | |||
| c_api.TFE_DeleteEagerTensor(item.Handle); | |||
| break; | |||
| default: | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -12,17 +12,15 @@ namespace Tensorflow | |||
| { | |||
| public class EagerTensorV2 : DisposableObject, ITensor | |||
| { | |||
| IntPtr tfe_tensor_handle; | |||
| public IntPtr EagerTensorHandle { get; set; } | |||
| public string Device => c_api.StringPiece(c_api.TFE_TensorHandleDeviceName(tfe_tensor_handle, status)); | |||
| IntPtr EagerTensorHandle; | |||
| public string Device => c_api.StringPiece(c_api.TFE_TensorHandleDeviceName(EagerTensorHandle, status)); | |||
| static Status status = new Status(); | |||
| public EagerTensorV2(IntPtr handle) | |||
| { | |||
| EagerTensorHandle = handle; | |||
| tfe_tensor_handle = c_api.TFE_EagerTensorHandle(handle); | |||
| _handle = c_api.TFE_TensorHandleResolve(tfe_tensor_handle, status); | |||
| EagerTensorHandle = c_api.TFE_EagerTensorHandle(handle); | |||
| _handle = c_api.TFE_TensorHandleResolve(EagerTensorHandle, status); | |||
| } | |||
| public unsafe EagerTensorV2(NDArray nd, string device_name = "") | |||
| @@ -42,8 +40,7 @@ namespace Tensorflow | |||
| }, IntPtr.Zero); | |||
| tfe_tensor_handle = c_api.TFE_NewTensorHandle(_handle, status); | |||
| EagerTensorHandle = c_api.TFE_NewEagerTensor(); | |||
| EagerTensorHandle = c_api.TFE_NewTensorHandle(_handle, status); | |||
| } | |||
| /*public unsafe EagerTensorV2(float[,] value) | |||
| @@ -72,8 +69,7 @@ namespace Tensorflow | |||
| protected override void DisposeUnmanagedResources(IntPtr handle) | |||
| { | |||
| c_api.TF_DeleteTensor(_handle); | |||
| c_api.TFE_DeleteTensorHandle(tfe_tensor_handle); | |||
| c_api.TFE_DeleteEagerTensor(EagerTensorHandle); | |||
| c_api.TFE_DeleteTensorHandle(EagerTensorHandle); | |||
| } | |||
| } | |||
| } | |||
| @@ -25,8 +25,6 @@ namespace Tensorflow | |||
| { | |||
| public class constant_op | |||
| { | |||
| public static Execute _execute = new Execute(); | |||
| /// <summary> | |||
| /// Creates a constant tensor. | |||
| /// | |||
| @@ -107,7 +105,7 @@ namespace Tensorflow | |||
| var dims_t = convert_to_eager_tensor(dims, ctx, dtypes.int32); | |||
| var inputs_flat = new[] { dims_t, value }; | |||
| var attrs = new object[] { "T", attr_t, "index_type", TF_DataType.TF_INT32 }; | |||
| var result = _execute.execute(ctx, "Fill", 1, inputs_flat, attrs); | |||
| var result = tf._execute.execute(ctx, "Fill", 1, inputs_flat, attrs); | |||
| return result[0]; | |||
| } | |||
| @@ -23,13 +23,11 @@ namespace Tensorflow | |||
| { | |||
| public class gen_training_ops | |||
| { | |||
| public static OpDefLibrary _op_def_lib = new OpDefLibrary(); | |||
| public static Tensor apply_adam(RefVariable var, RefVariable m, RefVariable v, Tensor beta1_power, Tensor beta2_power, | |||
| Tensor lr, Tensor beta1, Tensor beta2, Tensor epsilon, Tensor grad, | |||
| bool use_locking = false, bool use_nesterov = false, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("ApplyAdam", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("ApplyAdam", name, new | |||
| { | |||
| var, | |||
| m, | |||
| @@ -50,7 +48,7 @@ namespace Tensorflow | |||
| public static Tensor apply_gradient_descent(RefVariable var, Tensor alpha, Tensor delta, bool use_locking = false, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("ApplyGradientDescent", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("ApplyGradientDescent", name, new | |||
| { | |||
| var, | |||
| alpha, | |||
| @@ -65,21 +63,15 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "ResourceApplyGradientDescent", name, new IntPtr[] | |||
| { | |||
| var, | |||
| alpha, | |||
| delta | |||
| }, 3, | |||
| wrap_tfe_src.SetOpAttrs2("use_locking", use_locking), | |||
| op => wrap_tfe_src.SetOpAttrs(op, "use_locking", use_locking), | |||
| null, 0); | |||
| status.Check(true); | |||
| var result = tf.Runner.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "ResourceApplyGradientDescent", name, | |||
| null, | |||
| var, alpha, delta, | |||
| "use_locking", use_locking); | |||
| return null; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("ResourceApplyGradientDescent", name, new | |||
| var _op = tf._op_def_lib._apply_op_helper("ResourceApplyGradientDescent", name, new | |||
| { | |||
| var, | |||
| alpha, | |||
| @@ -1,22 +0,0 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using Tensorflow.Eager; | |||
| namespace Tensorflow | |||
| { | |||
| public class EagerTensorPass : PointerInputs<EagerTensor> | |||
| { | |||
| public EagerTensorPass(params EagerTensor[] tensors) | |||
| { | |||
| data = tensors; | |||
| } | |||
| public static EagerTensorPass Create(int count = 1) | |||
| => new EagerTensorPass(Enumerable.Range(0, count).Select(x => new EagerTensor()).ToArray()); | |||
| public static EagerTensorPass From(params object[] objects) | |||
| => new EagerTensorPass(objects.Select(x => ops.convert_to_tensor(x) as EagerTensor).ToArray()); | |||
| } | |||
| } | |||
| @@ -1,31 +0,0 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| using Tensorflow.Eager; | |||
| namespace Tensorflow | |||
| { | |||
| public class TensorManager | |||
| { | |||
| Dictionary<IntPtr, EagerTensor> tensors; | |||
| public TensorManager() | |||
| { | |||
| tensors = new Dictionary<IntPtr, EagerTensor>(); | |||
| } | |||
| public EagerTensor GetTensor(IntPtr handle) | |||
| { | |||
| if (tensors.ContainsKey(handle)) | |||
| return tensors[handle]; | |||
| //return new EagerTensor(handle); | |||
| tensors[handle] = new EagerTensor(handle); | |||
| return tensors[handle]; | |||
| } | |||
| public void Reset() | |||
| { | |||
| tensors.Clear(); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,76 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| namespace Tensorflow.Util | |||
| { | |||
| public class UnorderedMap<Tk, Tv> : Dictionary<Tk, Tv> | |||
| { | |||
| /// <summary> | |||
| /// Avoid null when accessing not existed element | |||
| /// </summary> | |||
| /// <param name="key"></param> | |||
| /// <returns></returns> | |||
| public new Tv this[Tk key] | |||
| { | |||
| get | |||
| { | |||
| if (!ContainsKey(key)) | |||
| Add(key, default); | |||
| return base[key]; | |||
| } | |||
| set | |||
| { | |||
| base[key] = value; | |||
| } | |||
| } | |||
| public void push_back(Tk key, Tv value) | |||
| => Add(key, value); | |||
| public void emplace(Tk key, Tv value) | |||
| => Add(key, value); | |||
| public bool find(Tk key) | |||
| => ContainsKey(key); | |||
| public void erase(Tk key) | |||
| => Remove(key); | |||
| public bool find(Tk key, out Tv value) | |||
| { | |||
| if (ContainsKey(key)) | |||
| { | |||
| value = this[key]; | |||
| return true; | |||
| } | |||
| else | |||
| { | |||
| value = default(Tv); | |||
| return false; | |||
| } | |||
| } | |||
| } | |||
| public class UnorderedMapEnumerable<Tk, Tv> : UnorderedMap<Tk, Tv> | |||
| where Tv : new() | |||
| { | |||
| public new Tv this[Tk key] | |||
| { | |||
| get | |||
| { | |||
| if (!ContainsKey(key)) | |||
| Add(key, new Tv()); | |||
| return base[key]; | |||
| } | |||
| set | |||
| { | |||
| base[key] = value; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,18 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| namespace Tensorflow.Util | |||
| { | |||
| public class UnorderedSet<T> : HashSet<T> | |||
| { | |||
| public UnorderedSet(T[] elements) | |||
| { | |||
| foreach (var el in elements) | |||
| Add(el); | |||
| } | |||
| public bool find(T value) | |||
| => Contains(value); | |||
| } | |||
| } | |||
| @@ -48,13 +48,11 @@ namespace Tensorflow | |||
| public BaseResourceVariable() | |||
| { | |||
| _handle = c_api.TFE_NewResourceVariable(); | |||
| } | |||
| public BaseResourceVariable(IntPtr handle, IntPtr tensor) | |||
| { | |||
| _handle = handle; | |||
| this.handle = tf.tensorMgr.GetTensor(tensor); | |||
| } | |||
| public void __init__(bool trainable = true, | |||
| @@ -104,7 +102,10 @@ namespace Tensorflow | |||
| void variable_accessed(BaseResourceVariable variable) | |||
| { | |||
| if (variable.trainable) | |||
| Tape.variable_accessed(variable as ResourceVariable); | |||
| { | |||
| foreach (var tape in tf.GetTapeSet()) | |||
| tape.VariableAccessed(variable as ResourceVariable); | |||
| } | |||
| } | |||
| /// <summary> | |||
| @@ -22,8 +22,6 @@ namespace Tensorflow | |||
| { | |||
| public partial class ResourceVariable | |||
| { | |||
| public static OpDefLibrary _op_def_lib = new OpDefLibrary(); | |||
| public static Tensor operator +(ResourceVariable x, int y) => op_helper("add", x, y); | |||
| public static Tensor operator +(ResourceVariable x, float y) => op_helper("add", x, y); | |||
| public static Tensor operator +(ResourceVariable x, double y) => op_helper("add", x, y); | |||
| @@ -160,9 +160,6 @@ namespace Tensorflow | |||
| initializer_op = null; | |||
| _graph_element = null; | |||
| initial_value = _in_graph_mode ? initial_value : null; | |||
| c_api.TFE_SetResourceVariableHandle(_handle, handle as EagerTensor); | |||
| c_api.TFE_SetResourceVariableName(_handle, handle_name + ":0"); | |||
| } | |||
| base.__init__(trainable: trainable, | |||
| @@ -16,15 +16,12 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using Tensorflow.Eager; | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow | |||
| { | |||
| public class gen_state_ops | |||
| { | |||
| public static OpDefLibrary _op_def_lib = new OpDefLibrary(); | |||
| public static Execute _execute = new Execute(); | |||
| /// <summary> | |||
| /// Holds state in the form of a tensor that persists across steps. | |||
| /// Outputs a ref to the tensor state so it may be read or modified. | |||
| @@ -37,7 +34,7 @@ namespace Tensorflow | |||
| /// <returns></returns> | |||
| public static Tensor variable_v2(int[] shape, TF_DataType dtype, string name = null, string container = "", string shared_name = "") | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("VariableV2", name: name, args: new { dtype, shape, container, shared_name }); | |||
| var _op = tf._op_def_lib._apply_op_helper("VariableV2", name: name, args: new { dtype, shape, container, shared_name }); | |||
| var _result = _op.outputs; | |||
| var _inputs_flat = _op.inputs; | |||
| @@ -64,7 +61,7 @@ namespace Tensorflow | |||
| bool use_locking = true, | |||
| string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Assign", name: name, args: new { @ref, value, validate_shape, use_locking }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Assign", name: name, args: new { @ref, value, validate_shape, use_locking }); | |||
| var _result = _op.outputs; | |||
| var _inputs_flat = _op.inputs; | |||
| @@ -82,7 +79,7 @@ namespace Tensorflow | |||
| bool use_locking = true, | |||
| string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Assign", name: name, args: new { @ref, value, validate_shape, use_locking }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Assign", name: name, args: new { @ref, value, validate_shape, use_locking }); | |||
| var _result = _op.outputs; | |||
| var _inputs_flat = _op.inputs; | |||
| @@ -100,7 +97,7 @@ namespace Tensorflow | |||
| bool use_locking = true, | |||
| string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("Assign", name: name, args: new { @ref, value, validate_shape, use_locking }); | |||
| var _op = tf._op_def_lib._apply_op_helper("Assign", name: name, args: new { @ref, value, validate_shape, use_locking }); | |||
| var _result = _op.outputs; | |||
| var _inputs_flat = _op.inputs; | |||
| @@ -118,7 +115,7 @@ namespace Tensorflow | |||
| bool use_locking = false, | |||
| string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("AssignSub", name: name, args: new { @ref, value, use_locking }); | |||
| var _op = tf._op_def_lib._apply_op_helper("AssignSub", name: name, args: new { @ref, value, use_locking }); | |||
| return _op.outputs[0]; | |||
| } | |||
| @@ -140,7 +137,7 @@ namespace Tensorflow | |||
| // A mutable `Tensor`. Has the same type as `ref`. | |||
| public static Tensor assign_add<T>(RefVariable @ref, T value, bool use_locking = false, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("AssignAdd", name: name, args: new { @ref, value, use_locking }); | |||
| var _op = tf._op_def_lib._apply_op_helper("AssignAdd", name: name, args: new { @ref, value, use_locking }); | |||
| return _op.outputs[0]; | |||
| } | |||
| @@ -155,13 +152,13 @@ namespace Tensorflow | |||
| /// <returns></returns> | |||
| public static Tensor scatter_add(RefVariable @ref, Tensor indices, Tensor updates, bool use_locking = false, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("ScatterAdd", name: name, args: new { @ref, indices, updates, use_locking }); | |||
| var _op = tf._op_def_lib._apply_op_helper("ScatterAdd", name: name, args: new { @ref, indices, updates, use_locking }); | |||
| return _op.outputs[0]; | |||
| } | |||
| public static Tensor is_variable_initialized(RefVariable @ref, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("IsVariableInitialized", name: name, args: new { @ref }); | |||
| var _op = tf._op_def_lib._apply_op_helper("IsVariableInitialized", name: name, args: new { @ref }); | |||
| return _op.output; | |||
| } | |||
| } | |||
| @@ -21,6 +21,7 @@ using System.Linq; | |||
| using System.Runtime.InteropServices; | |||
| using System.Threading; | |||
| using Tensorflow.Eager; | |||
| using Tensorflow.Gradients; | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow | |||
| @@ -39,63 +40,23 @@ namespace Tensorflow | |||
| public TF_DataType chars = TF_DataType.TF_STRING; | |||
| public TF_DataType @string = TF_DataType.TF_STRING; | |||
| public delegate Tensor[] BackwardFunction(Tensor[] grads, long[] unneeded_gradients); | |||
| public OpDefLibrary _op_def_lib = new OpDefLibrary(); | |||
| public Execute _execute = new Execute(); | |||
| public IEagerRunner Runner = new EagerRunner(); | |||
| public Context context = new Context(new ContextOptions(), new Status()); | |||
| public TensorManager tensorMgr; | |||
| public tensorflow() | |||
| { | |||
| enable_eager_execution(); | |||
| _constructThreadingObjects(); | |||
| InitGradientEnvironment(); | |||
| tensorMgr = new TensorManager(); | |||
| } | |||
| private void InitGradientEnvironment() | |||
| { | |||
| GarbageCollector.Init(); | |||
| /*var vspace = c_api.VSpace_Handle((shape, dims, dtype) => | |||
| { | |||
| var ones = constant_op.constant(1.0f, dtype: dtype) as EagerTensor; | |||
| return ones.EagerTensorHandle; | |||
| }, (gradients) => | |||
| { | |||
| var add_n = gen_math_ops.add_n(gradients.Data); | |||
| return add_n; | |||
| });*/ | |||
| ops.RegisterFromAssembly(); | |||
| // ops.RegisterFromAssemblyEager(); | |||
| /*c_api.TFE_RegisterGradientFunction((op_name, op_inputs, op_outputs, attrs_string, output_grads, skip_input_indices) => | |||
| { | |||
| var input_tensors = new BindingTensorArray(op_inputs) | |||
| .Data.Select(x => tf.tensorMgr.GetTensor(x)).ToArray(); | |||
| var output_tensors = new BindingTensorArray(op_outputs) | |||
| .Data.Select(x => tf.tensorMgr.GetTensor(x)).ToArray(); | |||
| var output_grad_tensors = new BindingTensorArray(output_grads) | |||
| .Data.Select(x => tf.tensorMgr.GetTensor(x)).ToArray(); | |||
| var skip_input_indices_param = new BindingArray(skip_input_indices); | |||
| var gradients = ops.gradientFunctions[op_name](new EagerOperation | |||
| { | |||
| Name = op_name, | |||
| NumInputs = input_tensors.Length, | |||
| Inputs = input_tensors, | |||
| // InputHandles = input_tensors.Data, | |||
| NumOutputs = output_tensors.Length, | |||
| Outputs = output_tensors, | |||
| // OutputHandles = output_tensors.Data, | |||
| SkipInputIndicesArray = skip_input_indices_param, | |||
| AttrsArray = attrs_string.Split(',') | |||
| }, output_grad_tensors); | |||
| var gradients_handles = gradients.Select(x => x == null ? IntPtr.Zero : (x as EagerTensor).EagerTensorHandle).ToArray(); | |||
| var wrap_handle = c_api.TFE_WrapGradientResult(gradients_handles, gradients.Length); | |||
| return wrap_handle; | |||
| }, (op_name, op_inputs, op_outputs) => | |||
| { | |||
| });*/ | |||
| } | |||
| public ResourceVariable Variable<T>(T data, | |||
| @@ -111,7 +72,7 @@ namespace Tensorflow | |||
| dtype: dtype, | |||
| shape: shape); | |||
| public unsafe Tensor placeholder(TF_DataType dtype, TensorShape shape = null, string name = null) | |||
| public Tensor placeholder(TF_DataType dtype, TensorShape shape = null, string name = null) | |||
| => gen_array_ops.placeholder(dtype, shape, name); | |||
| public void enable_eager_execution() | |||
| @@ -140,6 +101,17 @@ namespace Tensorflow | |||
| return new Session(null, config).as_default(); | |||
| } | |||
| List<ITape> tape_set; | |||
| public List<ITape> GetTapeSet() | |||
| { | |||
| if (tape_set == null) | |||
| { | |||
| tape_set = new List<ITape>(); | |||
| } | |||
| return tape_set; | |||
| } | |||
| public void __init__() | |||
| { | |||
| @@ -229,6 +229,7 @@ namespace TensorFlowNET.UnitTest | |||
| } | |||
| } | |||
| [Ignore] | |||
| [TestMethod] | |||
| public void SessionRun_Initialization() | |||
| { | |||
| @@ -248,6 +249,7 @@ namespace TensorFlowNET.UnitTest | |||
| } | |||
| } | |||
| [Ignore] | |||
| [TestMethod] | |||
| public void SessionRun_Initialization_OutsideSession() | |||
| { | |||
| @@ -33,9 +33,9 @@ namespace TensorFlowNET.UnitTest.NativeAPI | |||
| TFE_OpAddInputList(assertOp, data, 3, status); | |||
| CHECK_EQ(TF_OK, TF_GetCode(status), TF_Message(status)); | |||
| var attr_values = Graph.TFE_GetOpDef("Assert").Attr; | |||
| /*var attr_values = Graph.TFE_GetOpDef("Assert").Attr; | |||
| var attr_found = attr_values.First(x => x.Name == "T"); | |||
| EXPECT_NE(attr_found, attr_values.Last()); | |||
| EXPECT_NE(attr_found, attr_values.Last());*/ | |||
| // EXPECT_EQ(attr_found.Type[0], "DT_BOOL"); | |||
| //EXPECT_EQ(attr_found->second.list().type(1), tensorflow::DataType::DT_FLOAT); | |||
| //EXPECT_EQ(attr_found->second.list().type(2), tensorflow::DataType::DT_INT32); | |||
| @@ -11,7 +11,7 @@ namespace TensorFlowNET.UnitTest.Gradient | |||
| public class GradientEagerTest : PythonTest | |||
| { | |||
| [TestMethod] | |||
| public void ConstantSq() | |||
| public void ConstantSquare() | |||
| { | |||
| // Calcute the gradient of w * w | |||
| // by Automatic Differentiation in Eager mode | |||
| @@ -21,7 +21,21 @@ namespace TensorFlowNET.UnitTest.Gradient | |||
| tape.watch(w); | |||
| var loss = w * w; | |||
| var grad = tape.gradient(loss, w); | |||
| print(grad); | |||
| Assert.AreEqual((float)grad, 3.0f); | |||
| } | |||
| [TestMethod] | |||
| public void ConstantMultiply() | |||
| { | |||
| var x = tf.ones((2, 2)); | |||
| using var tape = tf.GradientTape(); | |||
| tape.watch(x); | |||
| var y = tf.reduce_sum(x); | |||
| var z = tf.multiply(y, y); | |||
| var dz_dx = tape.gradient(z, x); | |||
| var expected = new float[] { 8.0f, 8.0f, 8.0f, 8.0f }; | |||
| Assert.IsTrue(Enumerable.SequenceEqual(dz_dx.numpy().ToArray<float>(), expected)); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,25 +0,0 @@ | |||
| using Microsoft.VisualStudio.TestTools.UnitTesting; | |||
| using Tensorflow; | |||
| using static Tensorflow.Binding; | |||
| namespace TensorFlowNET.UnitTest | |||
| { | |||
| [TestClass] | |||
| public class PlaceholderTest | |||
| { | |||
| [Ignore] | |||
| [TestMethod] | |||
| public void placeholder() | |||
| { | |||
| var x = tf.placeholder(tf.int32); | |||
| var y = x * 3; | |||
| using (var sess = tf.Session()) | |||
| { | |||
| var result = sess.run(y, | |||
| new FeedItem(x, 2)); | |||
| Assert.AreEqual((int)result, 6); | |||
| } | |||
| } | |||
| } | |||
| } | |||