| @@ -15,8 +15,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TensorFlowNET.Hub", "src\Te | |||||
| EndProject | EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TensorFlowNET.Datasets", "src\TensorFlowNET.Datasets\TensorFlowNET.Datasets.csproj", "{494D6CAD-2C0D-4C0B-90E2-B097DB039383}" | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TensorFlowNET.Datasets", "src\TensorFlowNET.Datasets\TensorFlowNET.Datasets.csproj", "{494D6CAD-2C0D-4C0B-90E2-B097DB039383}" | ||||
| EndProject | EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NumSharp.Core", "..\NumSharp\src\NumSharp.Core\NumSharp.Core.csproj", "{9249BCC4-3FEB-4EF5-8AB9-789FFE4040B4}" | |||||
| EndProject | |||||
| Global | Global | ||||
| GlobalSection(SolutionConfigurationPlatforms) = preSolution | GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| Debug|Any CPU = Debug|Any CPU | Debug|Any CPU = Debug|Any CPU | ||||
| @@ -99,18 +97,6 @@ Global | |||||
| {494D6CAD-2C0D-4C0B-90E2-B097DB039383}.Release|Any CPU.Build.0 = Release|Any CPU | {494D6CAD-2C0D-4C0B-90E2-B097DB039383}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| {494D6CAD-2C0D-4C0B-90E2-B097DB039383}.Release|x64.ActiveCfg = Release|Any CPU | {494D6CAD-2C0D-4C0B-90E2-B097DB039383}.Release|x64.ActiveCfg = Release|Any CPU | ||||
| {494D6CAD-2C0D-4C0B-90E2-B097DB039383}.Release|x64.Build.0 = Release|Any CPU | {494D6CAD-2C0D-4C0B-90E2-B097DB039383}.Release|x64.Build.0 = Release|Any CPU | ||||
| {9249BCC4-3FEB-4EF5-8AB9-789FFE4040B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
| {9249BCC4-3FEB-4EF5-8AB9-789FFE4040B4}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
| {9249BCC4-3FEB-4EF5-8AB9-789FFE4040B4}.Debug|x64.ActiveCfg = Debug|x64 | |||||
| {9249BCC4-3FEB-4EF5-8AB9-789FFE4040B4}.Debug|x64.Build.0 = Debug|x64 | |||||
| {9249BCC4-3FEB-4EF5-8AB9-789FFE4040B4}.Publish|Any CPU.ActiveCfg = Publish|Any CPU | |||||
| {9249BCC4-3FEB-4EF5-8AB9-789FFE4040B4}.Publish|Any CPU.Build.0 = Publish|Any CPU | |||||
| {9249BCC4-3FEB-4EF5-8AB9-789FFE4040B4}.Publish|x64.ActiveCfg = Publish|x64 | |||||
| {9249BCC4-3FEB-4EF5-8AB9-789FFE4040B4}.Publish|x64.Build.0 = Publish|x64 | |||||
| {9249BCC4-3FEB-4EF5-8AB9-789FFE4040B4}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
| {9249BCC4-3FEB-4EF5-8AB9-789FFE4040B4}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
| {9249BCC4-3FEB-4EF5-8AB9-789FFE4040B4}.Release|x64.ActiveCfg = Release|x64 | |||||
| {9249BCC4-3FEB-4EF5-8AB9-789FFE4040B4}.Release|x64.Build.0 = Release|x64 | |||||
| EndGlobalSection | EndGlobalSection | ||||
| GlobalSection(SolutionProperties) = preSolution | GlobalSection(SolutionProperties) = preSolution | ||||
| HideSolutionNode = FALSE | HideSolutionNode = FALSE | ||||
| @@ -26,7 +26,7 @@ Related merged [commits](https://github.com/SciSharp/TensorFlow.NET/commit/854a5 | |||||
| On Windows, the tar command does not support extracting archives with symlinks. So when `dotnet pack` runs on Windows it will only package the Windows binaries. | On Windows, the tar command does not support extracting archives with symlinks. So when `dotnet pack` runs on Windows it will only package the Windows binaries. | ||||
| 1. Run `dotnet pack SciSharp.TensorFlow.Redist-CPU.nupkgproj` under `src/SciSharp.TensorFlow.Redist` directory in Linux. | |||||
| 2. Run `dotnet nuget push SciSharp.TensorFlow.Redist.1.14.0.nupkg -k APIKEY -s https://api.nuget.org/v3/index.json` | |||||
| 1. Run `dotnet pack SciSharp.TensorFlow.Redist.nupkgproj` under `src/SciSharp.TensorFlow.Redist` directory in Linux. | |||||
| 2. Run `dotnet nuget push SciSharp.TensorFlow.Redist.1.15.0.nupkg -k APIKEY -s https://api.nuget.org/v3/index.json` | |||||
| @@ -7,7 +7,7 @@ | |||||
| <TargetArchitecture Condition="'$(TargetArchitecture)' == ''">x64</TargetArchitecture> | <TargetArchitecture Condition="'$(TargetArchitecture)' == ''">x64</TargetArchitecture> | ||||
| <TargetFramework>netstandard2.0</TargetFramework> | <TargetFramework>netstandard2.0</TargetFramework> | ||||
| <TensorFlowVersion>1.14.0</TensorFlowVersion> | |||||
| <TensorFlowVersion>1.15.0</TensorFlowVersion> | |||||
| <TensorFlowMajorVersion>1</TensorFlowMajorVersion> | <TensorFlowMajorVersion>1</TensorFlowMajorVersion> | ||||
| <PackageAssetsPath>$(BinDir)packages\</PackageAssetsPath> | <PackageAssetsPath>$(BinDir)packages\</PackageAssetsPath> | ||||
| @@ -38,7 +38,7 @@ | |||||
| <TensorFlowConfig Include="windows" | <TensorFlowConfig Include="windows" | ||||
| FileExtension=".zip" | FileExtension=".zip" | ||||
| FilesFromArchive="lib\tensorflow.dll; | FilesFromArchive="lib\tensorflow.dll; | ||||
| include\tensorflow\c\LICENSE" | |||||
| LICENSE" | |||||
| Runtime="win-x64"/> | Runtime="win-x64"/> | ||||
| <TensorFlowConfig Condition="'$(OS)' != 'Windows_NT'" | <TensorFlowConfig Condition="'$(OS)' != 'Windows_NT'" | ||||
| @@ -46,14 +46,14 @@ | |||||
| FileExtension=".tar.gz" | FileExtension=".tar.gz" | ||||
| FilesFromArchive="lib\libtensorflow.so; | FilesFromArchive="lib\libtensorflow.so; | ||||
| lib\libtensorflow_framework.so.$(TensorFlowMajorVersion); | lib\libtensorflow_framework.so.$(TensorFlowMajorVersion); | ||||
| include\tensorflow\c\LICENSE" | |||||
| LICENSE" | |||||
| Runtime="linux-x64" /> | Runtime="linux-x64" /> | ||||
| <TensorFlowConfig Condition="'$(OS)' != 'Windows_NT'" | <TensorFlowConfig Condition="'$(OS)' != 'Windows_NT'" | ||||
| Include="darwin" FileExtension=".tar.gz" | Include="darwin" FileExtension=".tar.gz" | ||||
| FilesFromArchive="lib\libtensorflow.dylib; | FilesFromArchive="lib\libtensorflow.dylib; | ||||
| lib\libtensorflow_framework.$(TensorFlowMajorVersion).dylib; | lib\libtensorflow_framework.$(TensorFlowMajorVersion).dylib; | ||||
| include\tensorflow\c\LICENSE" | |||||
| LICENSE" | |||||
| Runtime="osx-x64" /> | Runtime="osx-x64" /> | ||||
| <AdditionalDownloadFile Include="https://raw.githubusercontent.com/tensorflow/tensorflow/master/LICENSE" | <AdditionalDownloadFile Include="https://raw.githubusercontent.com/tensorflow/tensorflow/master/LICENSE" | ||||
| @@ -34,6 +34,9 @@ namespace Tensorflow | |||||
| public Optimizer GradientDescentOptimizer(float learning_rate) | public Optimizer GradientDescentOptimizer(float learning_rate) | ||||
| => new GradientDescentOptimizer(learning_rate); | => new GradientDescentOptimizer(learning_rate); | ||||
| public Optimizer GradientDescentOptimizer(Tensor learning_rate) | |||||
| => new GradientDescentOptimizer(learning_rate); | |||||
| public Optimizer AdamOptimizer(float learning_rate, string name = "Adam") | public Optimizer AdamOptimizer(float learning_rate, string name = "Adam") | ||||
| => new AdamOptimizer(learning_rate, name: name); | => new AdamOptimizer(learning_rate, name: name); | ||||
| @@ -129,6 +129,7 @@ namespace Tensorflow | |||||
| } | } | ||||
| } | } | ||||
| [DebuggerStepThrough] | |||||
| [DebuggerNonUserCode()] // with "Just My Code" enabled this lets the debugger break at the origin of the exception | [DebuggerNonUserCode()] // with "Just My Code" enabled this lets the debugger break at the origin of the exception | ||||
| public static TOut tf_with<TIn, TOut>(TIn py, Func<TIn, TOut> action) where TIn : IObjectLife | public static TOut tf_with<TIn, TOut>(TIn py, Func<TIn, TOut> action) where TIn : IObjectLife | ||||
| { | { | ||||
| @@ -134,7 +134,7 @@ namespace Tensorflow | |||||
| } | } | ||||
| break; | break; | ||||
| default: | default: | ||||
| Console.WriteLine("import_scoped_meta_graph_with_return_elements"); | |||||
| Console.WriteLine($"import_scoped_meta_graph_with_return_elements {col.Key}"); | |||||
| continue; | continue; | ||||
| } | } | ||||
| } | } | ||||
| @@ -15,6 +15,7 @@ | |||||
| ******************************************************************************/ | ******************************************************************************/ | ||||
| using System; | using System; | ||||
| using static Tensorflow.Binding; | |||||
| namespace Tensorflow.Framework | namespace Tensorflow.Framework | ||||
| { | { | ||||
| @@ -75,7 +75,7 @@ namespace Tensorflow | |||||
| /// then create a TensorFlow session to run parts of the graph across a set of local and remote devices. | /// then create a TensorFlow session to run parts of the graph across a set of local and remote devices. | ||||
| /// </summary> | /// </summary> | ||||
| /// <remarks>https://www.tensorflow.org/guide/graphs <br></br>https://www.tensorflow.org/api_docs/python/tf/Graph</remarks> | /// <remarks>https://www.tensorflow.org/guide/graphs <br></br>https://www.tensorflow.org/api_docs/python/tf/Graph</remarks> | ||||
| public partial class Graph : DisposableObject, IEnumerable<Operation> | |||||
| public partial class Graph : DisposableObject//, IEnumerable<Operation> | |||||
| { | { | ||||
| private Dictionary<int, ITensorOrOperation> _nodes_by_id; | private Dictionary<int, ITensorOrOperation> _nodes_by_id; | ||||
| public Dictionary<string, ITensorOrOperation> _nodes_by_name; | public Dictionary<string, ITensorOrOperation> _nodes_by_name; | ||||
| @@ -257,17 +257,17 @@ namespace Tensorflow | |||||
| if (inputs == null) | if (inputs == null) | ||||
| inputs = new Tensor[0]; | inputs = new Tensor[0]; | ||||
| foreach ((int idx, Tensor a) in enumerate(inputs)) | |||||
| { | |||||
| } | |||||
| if (String.IsNullOrEmpty(name)) | |||||
| if (string.IsNullOrEmpty(name)) | |||||
| name = op_type; | name = op_type; | ||||
| // If a names ends with a '/' it is a "name scope" and we use it as-is, | // If a names ends with a '/' it is a "name scope" and we use it as-is, | ||||
| // after removing the trailing '/'. | // after removing the trailing '/'. | ||||
| name = name.EndsWith("/") ? ops.name_from_scope_name(name) : unique_name(name); | name = name.EndsWith("/") ? ops.name_from_scope_name(name) : unique_name(name); | ||||
| var node_def = ops._NodeDef(op_type, name, device: "", attrs: attrs); | var node_def = ops._NodeDef(op_type, name, device: "", attrs: attrs); | ||||
| if (name.Contains("define_loss/bigger_box_loss/mul_13")) | |||||
| { | |||||
| } | |||||
| var input_ops = inputs.Select(x => x.op).ToArray(); | var input_ops = inputs.Select(x => x.op).ToArray(); | ||||
| var control_inputs = _control_dependencies_for_inputs(input_ops); | var control_inputs = _control_dependencies_for_inputs(input_ops); | ||||
| @@ -526,14 +526,14 @@ namespace Tensorflow | |||||
| return debugString;*/ | return debugString;*/ | ||||
| } | } | ||||
| private IEnumerable<Operation> GetEnumerable() | |||||
| /*private IEnumerable<Operation> GetEnumerable() | |||||
| => c_api_util.tf_operations(this); | => c_api_util.tf_operations(this); | ||||
| IEnumerator<Operation> IEnumerable<Operation>.GetEnumerator() | IEnumerator<Operation> IEnumerable<Operation>.GetEnumerator() | ||||
| => GetEnumerable().GetEnumerator(); | => GetEnumerable().GetEnumerator(); | ||||
| IEnumerator IEnumerable.GetEnumerator() | IEnumerator IEnumerable.GetEnumerator() | ||||
| => throw new NotImplementedException(); | |||||
| => throw new NotImplementedException();*/ | |||||
| public static implicit operator IntPtr(Graph graph) | public static implicit operator IntPtr(Graph graph) | ||||
| { | { | ||||
| @@ -56,9 +56,9 @@ namespace Tensorflow.Keras.Engine | |||||
| { | { | ||||
| // Instantiate an input layer. | // Instantiate an input layer. | ||||
| var x = keras.layers.Input( | var x = keras.layers.Input( | ||||
| batch_shape: batch_shape, | |||||
| dtype: dtype, | |||||
| name: layer.name + "_input"); | |||||
| batch_shape: batch_shape, | |||||
| dtype: dtype, | |||||
| name: layer.name + "_input"); | |||||
| // This will build the current layer | // This will build the current layer | ||||
| // and create the node connecting the current layer | // and create the node connecting the current layer | ||||
| @@ -71,7 +71,7 @@ namespace Tensorflow.Keras.Engine | |||||
| if (set_inputs) | if (set_inputs) | ||||
| { | { | ||||
| // If an input layer (placeholder) is available. | // If an input layer (placeholder) is available. | ||||
| // outputs = layer._inbound_nodes; | |||||
| // outputs = layer.inbound_nodes; | |||||
| } | } | ||||
| } | } | ||||
| @@ -106,6 +106,7 @@ namespace Tensorflow.Keras.Layers | |||||
| VariableScope scope = null) | VariableScope scope = null) | ||||
| { | { | ||||
| var input_list = inputs; | var input_list = inputs; | ||||
| var input = inputs[0]; | |||||
| Tensor outputs = null; | Tensor outputs = null; | ||||
| // We will attempt to build a TF graph if & only if all inputs are symbolic. | // We will attempt to build a TF graph if & only if all inputs are symbolic. | ||||
| @@ -139,6 +140,7 @@ namespace Tensorflow.Keras.Layers | |||||
| _maybe_build(inputs[0]); | _maybe_build(inputs[0]); | ||||
| outputs = call(inputs[0], training: training); | outputs = call(inputs[0], training: training); | ||||
| (input, outputs) = _set_connectivity_metadata_(input, outputs); | |||||
| _handle_activity_regularization(inputs[0], outputs); | _handle_activity_regularization(inputs[0], outputs); | ||||
| _set_mask_metadata(inputs[0], outputs, null); | _set_mask_metadata(inputs[0], outputs, null); | ||||
| }); | }); | ||||
| @@ -147,6 +149,12 @@ namespace Tensorflow.Keras.Layers | |||||
| return outputs; | return outputs; | ||||
| } | } | ||||
| private (Tensor, Tensor) _set_connectivity_metadata_(Tensor inputs, Tensor outputs) | |||||
| { | |||||
| //_add_inbound_node(input_tensors: inputs, output_tensors: outputs); | |||||
| return (inputs, outputs); | |||||
| } | |||||
| private void _handle_activity_regularization(Tensor inputs, Tensor outputs) | private void _handle_activity_regularization(Tensor inputs, Tensor outputs) | ||||
| { | { | ||||
| //if(_activity_regularizer != null) | //if(_activity_regularizer != null) | ||||
| @@ -224,7 +232,7 @@ namespace Tensorflow.Keras.Layers | |||||
| overwrite: true, | overwrite: true, | ||||
| initializer: initializer, | initializer: initializer, | ||||
| trainable: trainable.Value); | trainable: trainable.Value); | ||||
| backend.track_variable(variable); | |||||
| //backend.track_variable(variable); | |||||
| _trainable_weights.Add(variable); | _trainable_weights.Add(variable); | ||||
| return variable; | return variable; | ||||
| @@ -14,6 +14,8 @@ | |||||
| limitations under the License. | limitations under the License. | ||||
| ******************************************************************************/ | ******************************************************************************/ | ||||
| using static Tensorflow.Binding; | |||||
| namespace Tensorflow.Operations | namespace Tensorflow.Operations | ||||
| { | { | ||||
| public class gen_nn_ops | public class gen_nn_ops | ||||
| @@ -54,10 +54,6 @@ namespace Tensorflow | |||||
| public void _set_control_flow_context(ControlFlowContext ctx) | public void _set_control_flow_context(ControlFlowContext ctx) | ||||
| { | { | ||||
| if(name == "define_loss/conv_sobj_branch/batch_normalization/cond/FusedBatchNorm_1") | |||||
| { | |||||
| } | |||||
| _control_flow_context = ctx; | _control_flow_context = ctx; | ||||
| } | } | ||||
| @@ -14,6 +14,7 @@ | |||||
| limitations under the License. | limitations under the License. | ||||
| ******************************************************************************/ | ******************************************************************************/ | ||||
| using Newtonsoft.Json; | |||||
| using System; | using System; | ||||
| using System.Linq; | using System.Linq; | ||||
| using System.Runtime.InteropServices; | using System.Runtime.InteropServices; | ||||
| @@ -37,7 +38,9 @@ namespace Tensorflow | |||||
| } | } | ||||
| return num; | return num; | ||||
| } | } | ||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public int NumInputs => c_api.TF_OperationNumInputs(_handle); | public int NumInputs => c_api.TF_OperationNumInputs(_handle); | ||||
| private TF_DataType[] _input_types => _inputs._inputs.Select(x => x.dtype).ToArray(); | private TF_DataType[] _input_types => _inputs._inputs.Select(x => x.dtype).ToArray(); | ||||
| @@ -14,6 +14,7 @@ | |||||
| limitations under the License. | limitations under the License. | ||||
| ******************************************************************************/ | ******************************************************************************/ | ||||
| using Newtonsoft.Json; | |||||
| using System; | using System; | ||||
| using System.Linq; | using System.Linq; | ||||
| using System.Runtime.InteropServices; | using System.Runtime.InteropServices; | ||||
| @@ -23,6 +24,9 @@ namespace Tensorflow | |||||
| { | { | ||||
| public partial class Operation | public partial class Operation | ||||
| { | { | ||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public int NumOutputs => c_api.TF_OperationNumOutputs(_handle); | public int NumOutputs => c_api.TF_OperationNumOutputs(_handle); | ||||
| public TF_DataType OutputType(int index) => c_api.TF_OperationOutputType(_tf_output(index)); | public TF_DataType OutputType(int index) => c_api.TF_OperationOutputType(_tf_output(index)); | ||||
| @@ -40,7 +44,9 @@ namespace Tensorflow | |||||
| private Tensor[] _outputs; | private Tensor[] _outputs; | ||||
| public Tensor[] outputs => _outputs; | public Tensor[] outputs => _outputs; | ||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public Tensor output => _outputs.FirstOrDefault(); | public Tensor output => _outputs.FirstOrDefault(); | ||||
| public int NumControlOutputs => c_api.TF_OperationNumControlOutputs(_handle); | public int NumControlOutputs => c_api.TF_OperationNumControlOutputs(_handle); | ||||
| @@ -15,6 +15,9 @@ | |||||
| ******************************************************************************/ | ******************************************************************************/ | ||||
| using Google.Protobuf.Collections; | using Google.Protobuf.Collections; | ||||
| #if SERIALIZABLE | |||||
| using Newtonsoft.Json; | |||||
| #endif | |||||
| using System; | using System; | ||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||
| using System.IO; | using System.IO; | ||||
| @@ -43,20 +46,37 @@ namespace Tensorflow | |||||
| /// </summary> | /// </summary> | ||||
| public partial class Operation : ITensorOrOperation | public partial class Operation : ITensorOrOperation | ||||
| { | { | ||||
| private readonly IntPtr _handle; // _c_op in python | |||||
| private readonly Graph _graph; | |||||
| private NodeDef _node_def; | |||||
| private readonly IntPtr _handle; // _c_op in python | |||||
| public string type => OpType; | |||||
| public Graph graph => _graph; | |||||
| public int _id => _id_value; | |||||
| public int _id_value; | |||||
| private readonly Graph _graph; | |||||
| private NodeDef _node_def; | |||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public string type => OpType; | |||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public Graph graph => _graph; | |||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public int _id => _id_value; | |||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public int _id_value; | |||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public Operation op => this; | public Operation op => this; | ||||
| public TF_DataType dtype => TF_DataType.DtInvalid; | public TF_DataType dtype => TF_DataType.DtInvalid; | ||||
| public string name => _handle == IntPtr.Zero ? null : c_api.StringPiece(c_api.TF_OperationName(_handle)); | public string name => _handle == IntPtr.Zero ? null : c_api.StringPiece(c_api.TF_OperationName(_handle)); | ||||
| public string OpType => _handle == IntPtr.Zero ? null : c_api.StringPiece(c_api.TF_OperationOpType(_handle)); | public string OpType => _handle == IntPtr.Zero ? null : c_api.StringPiece(c_api.TF_OperationOpType(_handle)); | ||||
| public string Device => _handle == IntPtr.Zero ? null : c_api.StringPiece(c_api.TF_OperationDevice(_handle)); | |||||
| public string Device => _handle == IntPtr.Zero ? null : c_api.StringPiece(c_api.TF_OperationDevice(_handle)); | |||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public NodeDef node_def | public NodeDef node_def | ||||
| { | { | ||||
| get | get | ||||
| @@ -601,7 +601,16 @@ namespace Tensorflow | |||||
| } | } | ||||
| public static Tensor gather<T1, T2>(T1 @params, T2 indices, string name = null, int axis = 0) | public static Tensor gather<T1, T2>(T1 @params, T2 indices, string name = null, int axis = 0) | ||||
| => gen_array_ops.gather_v2(@params, indices, axis, name: name); | |||||
| { | |||||
| if (axis != 0) | |||||
| return gen_array_ops.gather_v2(@params, indices, axis, name: name); | |||||
| if (@params is ResourceVariable variable && | |||||
| indices is Tensor indices_tensor) | |||||
| return variable.sparse_read(indices_tensor, name); | |||||
| return gen_array_ops.gather_v2(@params, indices, axis, name: name); | |||||
| } | |||||
| public static Tensor transpose<T1, T2>(T1 a, T2 perm, string name = "transpose", bool conjugate = false) | public static Tensor transpose<T1, T2>(T1 a, T2 perm, string name = "transpose", bool conjugate = false) | ||||
| { | { | ||||
| @@ -31,7 +31,62 @@ namespace Tensorflow | |||||
| { | { | ||||
| var _op = _op_def_lib._apply_op_helper("VarIsInitializedOp", name, new { resource }); | var _op = _op_def_lib._apply_op_helper("VarIsInitializedOp", name, new { resource }); | ||||
| return _op; | |||||
| return _op.output; | |||||
| } | |||||
| /// <summary> | |||||
| /// Creates a handle to a Variable resource. | |||||
| /// </summary> | |||||
| /// <param name="dtype"></param> | |||||
| /// <param name="shape"></param> | |||||
| /// <param name="container"></param> | |||||
| /// <param name="shared_name"></param> | |||||
| /// <param name="name"></param> | |||||
| /// <returns></returns> | |||||
| public static Tensor var_handle_op(TF_DataType dtype, TensorShape shape, | |||||
| string container ="", string shared_name = "", string name = null) | |||||
| { | |||||
| var _op = _op_def_lib._apply_op_helper("VarHandleOp", name, new { | |||||
| dtype, | |||||
| shape, | |||||
| container, | |||||
| shared_name | |||||
| }); | |||||
| return _op.output; | |||||
| } | |||||
| /// <summary> | |||||
| /// Reads the value of a variable. | |||||
| /// </summary> | |||||
| /// <param name="resource"></param> | |||||
| /// <param name="dtype"></param> | |||||
| /// <param name="name"></param> | |||||
| /// <returns></returns> | |||||
| public static Tensor read_variable_op(Tensor resource, TF_DataType dtype, string name = null) | |||||
| { | |||||
| var _op = _op_def_lib._apply_op_helper("ReadVariableOp", name, new | |||||
| { | |||||
| resource, | |||||
| dtype | |||||
| }); | |||||
| return _op.output; | |||||
| } | |||||
| 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 | |||||
| { | |||||
| resource, | |||||
| indices, | |||||
| dtype, | |||||
| batch_dims, | |||||
| validate_indices | |||||
| }); | |||||
| return _op.output; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -16,6 +16,7 @@ | |||||
| using System; | using System; | ||||
| using Tensorflow.Framework; | using Tensorflow.Framework; | ||||
| using static Tensorflow.CppShapeInferenceResult.Types; | |||||
| namespace Tensorflow | namespace Tensorflow | ||||
| { | { | ||||
| @@ -91,12 +92,80 @@ namespace Tensorflow | |||||
| shape, dtype, shared_name, name, graph_mode, initial_value); | shape, dtype, shared_name, name, graph_mode, initial_value); | ||||
| } | } | ||||
| /// <summary> | |||||
| /// Create a new variable handle, optionally copying in `extra_handle_data` | |||||
| /// </summary> | |||||
| /// <param name="shape"></param> | |||||
| /// <param name="dtype"></param> | |||||
| /// <param name="shared_name"></param> | |||||
| /// <param name="name"></param> | |||||
| /// <param name="graph_mode"></param> | |||||
| /// <param name="extra_handle_data"></param> | |||||
| /// <returns></returns> | |||||
| public static Tensor variable_handle_from_shape_and_dtype(TensorShape shape, TF_DataType dtype, | public static Tensor variable_handle_from_shape_and_dtype(TensorShape shape, TF_DataType dtype, | ||||
| string shared_name, string name, bool graph_mode, Tensor extra_handle_data = null) | string shared_name, string name, bool graph_mode, Tensor extra_handle_data = null) | ||||
| { | { | ||||
| var container = "";// ops.get_default_graph().container; | |||||
| var handle = gen_resource_variable_ops.var_handle_op(shape: shape, | |||||
| dtype: dtype, | |||||
| shared_name: shared_name, | |||||
| name: name, | |||||
| container: container); | |||||
| if (extra_handle_data == null) | |||||
| extra_handle_data = handle; | |||||
| if (graph_mode) | |||||
| { | |||||
| var full_handle_data = _combine_handle_data(handle, extra_handle_data); | |||||
| _set_handle_shapes_and_types(handle, full_handle_data, graph_mode); | |||||
| return handle; | |||||
| } | |||||
| else | |||||
| { | |||||
| throw new NotImplementedException(""); | |||||
| } | |||||
| } | |||||
| private static void _set_handle_shapes_and_types(Tensor handle, HandleData full_handle_data, bool graph_mode) | |||||
| { | |||||
| } | |||||
| /// <summary> | |||||
| /// Concats HandleData from tensors `handle` and `initial_value`. | |||||
| /// </summary> | |||||
| /// <param name="handle"></param> | |||||
| /// <param name="initial_value"></param> | |||||
| /// <returns></returns> | |||||
| private static HandleData _combine_handle_data(Tensor handle, Tensor initial_value) | |||||
| { | |||||
| var variable_handle_data = get_eager_safe_handle_data(initial_value); | |||||
| if (initial_value.dtype != dtypes.variant) | |||||
| return variable_handle_data; | |||||
| throw new NotImplementedException(""); | throw new NotImplementedException(""); | ||||
| } | } | ||||
| private static HandleData get_eager_safe_handle_data(Tensor handle) | |||||
| { | |||||
| if(handle == IntPtr.Zero) | |||||
| { | |||||
| var data = new HandleData(); | |||||
| data.ShapeAndType.Add(new HandleShapeAndType | |||||
| { | |||||
| Shape = handle.TensorShape.as_proto(), | |||||
| Dtype = handle.dtype.as_datatype_enum() | |||||
| }); | |||||
| return data; | |||||
| } | |||||
| else | |||||
| { | |||||
| return HandleData.Parser.ParseFrom(handle.BufferToArray()); | |||||
| } | |||||
| } | |||||
| /// <summary> | /// <summary> | ||||
| /// Represents a future for a read of a variable. | /// Represents a future for a read of a variable. | ||||
| /// Pretends to be the tensor if anyone looks. | /// Pretends to be the tensor if anyone looks. | ||||
| @@ -0,0 +1,692 @@ | |||||
| // <auto-generated> | |||||
| // Generated by the protocol buffer compiler. DO NOT EDIT! | |||||
| // source: tensorflow/python/framework/cpp_shape_inference.proto | |||||
| // </auto-generated> | |||||
| #pragma warning disable 1591, 0612, 3021 | |||||
| #region Designer generated code | |||||
| using pb = global::Google.Protobuf; | |||||
| using pbc = global::Google.Protobuf.Collections; | |||||
| using pbr = global::Google.Protobuf.Reflection; | |||||
| using scg = global::System.Collections.Generic; | |||||
| namespace Tensorflow { | |||||
| /// <summary>Holder for reflection information generated from tensorflow/python/framework/cpp_shape_inference.proto</summary> | |||||
| public static partial class CppShapeInferenceReflection { | |||||
| #region Descriptor | |||||
| /// <summary>File descriptor for tensorflow/python/framework/cpp_shape_inference.proto</summary> | |||||
| public static pbr::FileDescriptor Descriptor { | |||||
| get { return descriptor; } | |||||
| } | |||||
| private static pbr::FileDescriptor descriptor; | |||||
| static CppShapeInferenceReflection() { | |||||
| byte[] descriptorData = global::System.Convert.FromBase64String( | |||||
| string.Concat( | |||||
| "CjV0ZW5zb3JmbG93L3B5dGhvbi9mcmFtZXdvcmsvY3BwX3NoYXBlX2luZmVy", | |||||
| "ZW5jZS5wcm90bxIKdGVuc29yZmxvdxoldGVuc29yZmxvdy9jb3JlL2ZyYW1l", | |||||
| "d29yay90eXBlcy5wcm90bxosdGVuc29yZmxvdy9jb3JlL2ZyYW1ld29yay90", | |||||
| "ZW5zb3Jfc2hhcGUucHJvdG8i7QIKF0NwcFNoYXBlSW5mZXJlbmNlUmVzdWx0", | |||||
| "EisKBXNoYXBlGAEgASgLMhwudGVuc29yZmxvdy5UZW5zb3JTaGFwZVByb3Rv", | |||||
| "EkMKC2hhbmRsZV9kYXRhGAQgASgLMi4udGVuc29yZmxvdy5DcHBTaGFwZUlu", | |||||
| "ZmVyZW5jZVJlc3VsdC5IYW5kbGVEYXRhGmYKEkhhbmRsZVNoYXBlQW5kVHlw", | |||||
| "ZRIrCgVzaGFwZRgBIAEoCzIcLnRlbnNvcmZsb3cuVGVuc29yU2hhcGVQcm90", | |||||
| "bxIjCgVkdHlwZRgCIAEoDjIULnRlbnNvcmZsb3cuRGF0YVR5cGUabAoKSGFu", | |||||
| "ZGxlRGF0YRIOCgZpc19zZXQYASABKAgSTgoOc2hhcGVfYW5kX3R5cGUYAiAD", | |||||
| "KAsyNi50ZW5zb3JmbG93LkNwcFNoYXBlSW5mZXJlbmNlUmVzdWx0LkhhbmRs", | |||||
| "ZVNoYXBlQW5kVHlwZUoECAIQA0oECAMQBCJlCh1DcHBTaGFwZUluZmVyZW5j", | |||||
| "ZUlucHV0c05lZWRlZBIcChRpbnB1dF90ZW5zb3JzX25lZWRlZBgBIAMoBRIm", | |||||
| "Ch5pbnB1dF90ZW5zb3JzX2FzX3NoYXBlc19uZWVkZWQYAiADKAVCA/gBAWIG", | |||||
| "cHJvdG8z")); | |||||
| descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, | |||||
| new pbr::FileDescriptor[] { global::Tensorflow.TypesReflection.Descriptor, global::Tensorflow.TensorShapeReflection.Descriptor, }, | |||||
| new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { | |||||
| new pbr::GeneratedClrTypeInfo(typeof(global::Tensorflow.CppShapeInferenceResult), global::Tensorflow.CppShapeInferenceResult.Parser, new[]{ "Shape", "HandleData" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Tensorflow.CppShapeInferenceResult.Types.HandleShapeAndType), global::Tensorflow.CppShapeInferenceResult.Types.HandleShapeAndType.Parser, new[]{ "Shape", "Dtype" }, null, null, null), | |||||
| new pbr::GeneratedClrTypeInfo(typeof(global::Tensorflow.CppShapeInferenceResult.Types.HandleData), global::Tensorflow.CppShapeInferenceResult.Types.HandleData.Parser, new[]{ "IsSet", "ShapeAndType" }, null, null, null)}), | |||||
| new pbr::GeneratedClrTypeInfo(typeof(global::Tensorflow.CppShapeInferenceInputsNeeded), global::Tensorflow.CppShapeInferenceInputsNeeded.Parser, new[]{ "InputTensorsNeeded", "InputTensorsAsShapesNeeded" }, null, null, null) | |||||
| })); | |||||
| } | |||||
| #endregion | |||||
| } | |||||
| #region Messages | |||||
| public sealed partial class CppShapeInferenceResult : pb::IMessage<CppShapeInferenceResult> { | |||||
| private static readonly pb::MessageParser<CppShapeInferenceResult> _parser = new pb::MessageParser<CppShapeInferenceResult>(() => new CppShapeInferenceResult()); | |||||
| private pb::UnknownFieldSet _unknownFields; | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public static pb::MessageParser<CppShapeInferenceResult> Parser { get { return _parser; } } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public static pbr::MessageDescriptor Descriptor { | |||||
| get { return global::Tensorflow.CppShapeInferenceReflection.Descriptor.MessageTypes[0]; } | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| pbr::MessageDescriptor pb::IMessage.Descriptor { | |||||
| get { return Descriptor; } | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public CppShapeInferenceResult() { | |||||
| OnConstruction(); | |||||
| } | |||||
| partial void OnConstruction(); | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public CppShapeInferenceResult(CppShapeInferenceResult other) : this() { | |||||
| shape_ = other.shape_ != null ? other.shape_.Clone() : null; | |||||
| handleData_ = other.handleData_ != null ? other.handleData_.Clone() : null; | |||||
| _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public CppShapeInferenceResult Clone() { | |||||
| return new CppShapeInferenceResult(this); | |||||
| } | |||||
| /// <summary>Field number for the "shape" field.</summary> | |||||
| public const int ShapeFieldNumber = 1; | |||||
| private global::Tensorflow.TensorShapeProto shape_; | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public global::Tensorflow.TensorShapeProto Shape { | |||||
| get { return shape_; } | |||||
| set { | |||||
| shape_ = value; | |||||
| } | |||||
| } | |||||
| /// <summary>Field number for the "handle_data" field.</summary> | |||||
| public const int HandleDataFieldNumber = 4; | |||||
| private global::Tensorflow.CppShapeInferenceResult.Types.HandleData handleData_; | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public global::Tensorflow.CppShapeInferenceResult.Types.HandleData HandleData { | |||||
| get { return handleData_; } | |||||
| set { | |||||
| handleData_ = value; | |||||
| } | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public override bool Equals(object other) { | |||||
| return Equals(other as CppShapeInferenceResult); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public bool Equals(CppShapeInferenceResult other) { | |||||
| if (ReferenceEquals(other, null)) { | |||||
| return false; | |||||
| } | |||||
| if (ReferenceEquals(other, this)) { | |||||
| return true; | |||||
| } | |||||
| if (!object.Equals(Shape, other.Shape)) return false; | |||||
| if (!object.Equals(HandleData, other.HandleData)) return false; | |||||
| return Equals(_unknownFields, other._unknownFields); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public override int GetHashCode() { | |||||
| int hash = 1; | |||||
| if (shape_ != null) hash ^= Shape.GetHashCode(); | |||||
| if (handleData_ != null) hash ^= HandleData.GetHashCode(); | |||||
| if (_unknownFields != null) { | |||||
| hash ^= _unknownFields.GetHashCode(); | |||||
| } | |||||
| return hash; | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public override string ToString() { | |||||
| return pb::JsonFormatter.ToDiagnosticString(this); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public void WriteTo(pb::CodedOutputStream output) { | |||||
| if (shape_ != null) { | |||||
| output.WriteRawTag(10); | |||||
| output.WriteMessage(Shape); | |||||
| } | |||||
| if (handleData_ != null) { | |||||
| output.WriteRawTag(34); | |||||
| output.WriteMessage(HandleData); | |||||
| } | |||||
| if (_unknownFields != null) { | |||||
| _unknownFields.WriteTo(output); | |||||
| } | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public int CalculateSize() { | |||||
| int size = 0; | |||||
| if (shape_ != null) { | |||||
| size += 1 + pb::CodedOutputStream.ComputeMessageSize(Shape); | |||||
| } | |||||
| if (handleData_ != null) { | |||||
| size += 1 + pb::CodedOutputStream.ComputeMessageSize(HandleData); | |||||
| } | |||||
| if (_unknownFields != null) { | |||||
| size += _unknownFields.CalculateSize(); | |||||
| } | |||||
| return size; | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public void MergeFrom(CppShapeInferenceResult other) { | |||||
| if (other == null) { | |||||
| return; | |||||
| } | |||||
| if (other.shape_ != null) { | |||||
| if (shape_ == null) { | |||||
| shape_ = new global::Tensorflow.TensorShapeProto(); | |||||
| } | |||||
| Shape.MergeFrom(other.Shape); | |||||
| } | |||||
| if (other.handleData_ != null) { | |||||
| if (handleData_ == null) { | |||||
| handleData_ = new global::Tensorflow.CppShapeInferenceResult.Types.HandleData(); | |||||
| } | |||||
| HandleData.MergeFrom(other.HandleData); | |||||
| } | |||||
| _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public void MergeFrom(pb::CodedInputStream input) { | |||||
| uint tag; | |||||
| while ((tag = input.ReadTag()) != 0) { | |||||
| switch(tag) { | |||||
| default: | |||||
| _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); | |||||
| break; | |||||
| case 10: { | |||||
| if (shape_ == null) { | |||||
| shape_ = new global::Tensorflow.TensorShapeProto(); | |||||
| } | |||||
| input.ReadMessage(shape_); | |||||
| break; | |||||
| } | |||||
| case 34: { | |||||
| if (handleData_ == null) { | |||||
| handleData_ = new global::Tensorflow.CppShapeInferenceResult.Types.HandleData(); | |||||
| } | |||||
| input.ReadMessage(handleData_); | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| #region Nested types | |||||
| /// <summary>Container for nested types declared in the CppShapeInferenceResult message type.</summary> | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public static partial class Types { | |||||
| public sealed partial class HandleShapeAndType : pb::IMessage<HandleShapeAndType> { | |||||
| private static readonly pb::MessageParser<HandleShapeAndType> _parser = new pb::MessageParser<HandleShapeAndType>(() => new HandleShapeAndType()); | |||||
| private pb::UnknownFieldSet _unknownFields; | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public static pb::MessageParser<HandleShapeAndType> Parser { get { return _parser; } } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public static pbr::MessageDescriptor Descriptor { | |||||
| get { return global::Tensorflow.CppShapeInferenceResult.Descriptor.NestedTypes[0]; } | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| pbr::MessageDescriptor pb::IMessage.Descriptor { | |||||
| get { return Descriptor; } | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public HandleShapeAndType() { | |||||
| OnConstruction(); | |||||
| } | |||||
| partial void OnConstruction(); | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public HandleShapeAndType(HandleShapeAndType other) : this() { | |||||
| shape_ = other.shape_ != null ? other.shape_.Clone() : null; | |||||
| dtype_ = other.dtype_; | |||||
| _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public HandleShapeAndType Clone() { | |||||
| return new HandleShapeAndType(this); | |||||
| } | |||||
| /// <summary>Field number for the "shape" field.</summary> | |||||
| public const int ShapeFieldNumber = 1; | |||||
| private global::Tensorflow.TensorShapeProto shape_; | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public global::Tensorflow.TensorShapeProto Shape { | |||||
| get { return shape_; } | |||||
| set { | |||||
| shape_ = value; | |||||
| } | |||||
| } | |||||
| /// <summary>Field number for the "dtype" field.</summary> | |||||
| public const int DtypeFieldNumber = 2; | |||||
| private global::Tensorflow.DataType dtype_ = 0; | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public global::Tensorflow.DataType Dtype { | |||||
| get { return dtype_; } | |||||
| set { | |||||
| dtype_ = value; | |||||
| } | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public override bool Equals(object other) { | |||||
| return Equals(other as HandleShapeAndType); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public bool Equals(HandleShapeAndType other) { | |||||
| if (ReferenceEquals(other, null)) { | |||||
| return false; | |||||
| } | |||||
| if (ReferenceEquals(other, this)) { | |||||
| return true; | |||||
| } | |||||
| if (!object.Equals(Shape, other.Shape)) return false; | |||||
| if (Dtype != other.Dtype) return false; | |||||
| return Equals(_unknownFields, other._unknownFields); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public override int GetHashCode() { | |||||
| int hash = 1; | |||||
| if (shape_ != null) hash ^= Shape.GetHashCode(); | |||||
| if (Dtype != 0) hash ^= Dtype.GetHashCode(); | |||||
| if (_unknownFields != null) { | |||||
| hash ^= _unknownFields.GetHashCode(); | |||||
| } | |||||
| return hash; | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public override string ToString() { | |||||
| return pb::JsonFormatter.ToDiagnosticString(this); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public void WriteTo(pb::CodedOutputStream output) { | |||||
| if (shape_ != null) { | |||||
| output.WriteRawTag(10); | |||||
| output.WriteMessage(Shape); | |||||
| } | |||||
| if (Dtype != 0) { | |||||
| output.WriteRawTag(16); | |||||
| output.WriteEnum((int) Dtype); | |||||
| } | |||||
| if (_unknownFields != null) { | |||||
| _unknownFields.WriteTo(output); | |||||
| } | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public int CalculateSize() { | |||||
| int size = 0; | |||||
| if (shape_ != null) { | |||||
| size += 1 + pb::CodedOutputStream.ComputeMessageSize(Shape); | |||||
| } | |||||
| if (Dtype != 0) { | |||||
| size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Dtype); | |||||
| } | |||||
| if (_unknownFields != null) { | |||||
| size += _unknownFields.CalculateSize(); | |||||
| } | |||||
| return size; | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public void MergeFrom(HandleShapeAndType other) { | |||||
| if (other == null) { | |||||
| return; | |||||
| } | |||||
| if (other.shape_ != null) { | |||||
| if (shape_ == null) { | |||||
| shape_ = new global::Tensorflow.TensorShapeProto(); | |||||
| } | |||||
| Shape.MergeFrom(other.Shape); | |||||
| } | |||||
| if (other.Dtype != 0) { | |||||
| Dtype = other.Dtype; | |||||
| } | |||||
| _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public void MergeFrom(pb::CodedInputStream input) { | |||||
| uint tag; | |||||
| while ((tag = input.ReadTag()) != 0) { | |||||
| switch(tag) { | |||||
| default: | |||||
| _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); | |||||
| break; | |||||
| case 10: { | |||||
| if (shape_ == null) { | |||||
| shape_ = new global::Tensorflow.TensorShapeProto(); | |||||
| } | |||||
| input.ReadMessage(shape_); | |||||
| break; | |||||
| } | |||||
| case 16: { | |||||
| dtype_ = (global::Tensorflow.DataType) input.ReadEnum(); | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| public sealed partial class HandleData : pb::IMessage<HandleData> { | |||||
| private static readonly pb::MessageParser<HandleData> _parser = new pb::MessageParser<HandleData>(() => new HandleData()); | |||||
| private pb::UnknownFieldSet _unknownFields; | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public static pb::MessageParser<HandleData> Parser { get { return _parser; } } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public static pbr::MessageDescriptor Descriptor { | |||||
| get { return global::Tensorflow.CppShapeInferenceResult.Descriptor.NestedTypes[1]; } | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| pbr::MessageDescriptor pb::IMessage.Descriptor { | |||||
| get { return Descriptor; } | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public HandleData() { | |||||
| OnConstruction(); | |||||
| } | |||||
| partial void OnConstruction(); | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public HandleData(HandleData other) : this() { | |||||
| isSet_ = other.isSet_; | |||||
| shapeAndType_ = other.shapeAndType_.Clone(); | |||||
| _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public HandleData Clone() { | |||||
| return new HandleData(this); | |||||
| } | |||||
| /// <summary>Field number for the "is_set" field.</summary> | |||||
| public const int IsSetFieldNumber = 1; | |||||
| private bool isSet_; | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public bool IsSet { | |||||
| get { return isSet_; } | |||||
| set { | |||||
| isSet_ = value; | |||||
| } | |||||
| } | |||||
| /// <summary>Field number for the "shape_and_type" field.</summary> | |||||
| public const int ShapeAndTypeFieldNumber = 2; | |||||
| private static readonly pb::FieldCodec<global::Tensorflow.CppShapeInferenceResult.Types.HandleShapeAndType> _repeated_shapeAndType_codec | |||||
| = pb::FieldCodec.ForMessage(18, global::Tensorflow.CppShapeInferenceResult.Types.HandleShapeAndType.Parser); | |||||
| private readonly pbc::RepeatedField<global::Tensorflow.CppShapeInferenceResult.Types.HandleShapeAndType> shapeAndType_ = new pbc::RepeatedField<global::Tensorflow.CppShapeInferenceResult.Types.HandleShapeAndType>(); | |||||
| /// <summary> | |||||
| /// Only valid if <is_set>. | |||||
| /// </summary> | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public pbc::RepeatedField<global::Tensorflow.CppShapeInferenceResult.Types.HandleShapeAndType> ShapeAndType { | |||||
| get { return shapeAndType_; } | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public override bool Equals(object other) { | |||||
| return Equals(other as HandleData); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public bool Equals(HandleData other) { | |||||
| if (ReferenceEquals(other, null)) { | |||||
| return false; | |||||
| } | |||||
| if (ReferenceEquals(other, this)) { | |||||
| return true; | |||||
| } | |||||
| if (IsSet != other.IsSet) return false; | |||||
| if(!shapeAndType_.Equals(other.shapeAndType_)) return false; | |||||
| return Equals(_unknownFields, other._unknownFields); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public override int GetHashCode() { | |||||
| int hash = 1; | |||||
| if (IsSet != false) hash ^= IsSet.GetHashCode(); | |||||
| hash ^= shapeAndType_.GetHashCode(); | |||||
| if (_unknownFields != null) { | |||||
| hash ^= _unknownFields.GetHashCode(); | |||||
| } | |||||
| return hash; | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public override string ToString() { | |||||
| return pb::JsonFormatter.ToDiagnosticString(this); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public void WriteTo(pb::CodedOutputStream output) { | |||||
| if (IsSet != false) { | |||||
| output.WriteRawTag(8); | |||||
| output.WriteBool(IsSet); | |||||
| } | |||||
| shapeAndType_.WriteTo(output, _repeated_shapeAndType_codec); | |||||
| if (_unknownFields != null) { | |||||
| _unknownFields.WriteTo(output); | |||||
| } | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public int CalculateSize() { | |||||
| int size = 0; | |||||
| if (IsSet != false) { | |||||
| size += 1 + 1; | |||||
| } | |||||
| size += shapeAndType_.CalculateSize(_repeated_shapeAndType_codec); | |||||
| if (_unknownFields != null) { | |||||
| size += _unknownFields.CalculateSize(); | |||||
| } | |||||
| return size; | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public void MergeFrom(HandleData other) { | |||||
| if (other == null) { | |||||
| return; | |||||
| } | |||||
| if (other.IsSet != false) { | |||||
| IsSet = other.IsSet; | |||||
| } | |||||
| shapeAndType_.Add(other.shapeAndType_); | |||||
| _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public void MergeFrom(pb::CodedInputStream input) { | |||||
| uint tag; | |||||
| while ((tag = input.ReadTag()) != 0) { | |||||
| switch(tag) { | |||||
| default: | |||||
| _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); | |||||
| break; | |||||
| case 8: { | |||||
| IsSet = input.ReadBool(); | |||||
| break; | |||||
| } | |||||
| case 18: { | |||||
| shapeAndType_.AddEntriesFrom(input, _repeated_shapeAndType_codec); | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| #endregion | |||||
| } | |||||
| public sealed partial class CppShapeInferenceInputsNeeded : pb::IMessage<CppShapeInferenceInputsNeeded> { | |||||
| private static readonly pb::MessageParser<CppShapeInferenceInputsNeeded> _parser = new pb::MessageParser<CppShapeInferenceInputsNeeded>(() => new CppShapeInferenceInputsNeeded()); | |||||
| private pb::UnknownFieldSet _unknownFields; | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public static pb::MessageParser<CppShapeInferenceInputsNeeded> Parser { get { return _parser; } } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public static pbr::MessageDescriptor Descriptor { | |||||
| get { return global::Tensorflow.CppShapeInferenceReflection.Descriptor.MessageTypes[1]; } | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| pbr::MessageDescriptor pb::IMessage.Descriptor { | |||||
| get { return Descriptor; } | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public CppShapeInferenceInputsNeeded() { | |||||
| OnConstruction(); | |||||
| } | |||||
| partial void OnConstruction(); | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public CppShapeInferenceInputsNeeded(CppShapeInferenceInputsNeeded other) : this() { | |||||
| inputTensorsNeeded_ = other.inputTensorsNeeded_.Clone(); | |||||
| inputTensorsAsShapesNeeded_ = other.inputTensorsAsShapesNeeded_.Clone(); | |||||
| _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public CppShapeInferenceInputsNeeded Clone() { | |||||
| return new CppShapeInferenceInputsNeeded(this); | |||||
| } | |||||
| /// <summary>Field number for the "input_tensors_needed" field.</summary> | |||||
| public const int InputTensorsNeededFieldNumber = 1; | |||||
| private static readonly pb::FieldCodec<int> _repeated_inputTensorsNeeded_codec | |||||
| = pb::FieldCodec.ForInt32(10); | |||||
| private readonly pbc::RepeatedField<int> inputTensorsNeeded_ = new pbc::RepeatedField<int>(); | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public pbc::RepeatedField<int> InputTensorsNeeded { | |||||
| get { return inputTensorsNeeded_; } | |||||
| } | |||||
| /// <summary>Field number for the "input_tensors_as_shapes_needed" field.</summary> | |||||
| public const int InputTensorsAsShapesNeededFieldNumber = 2; | |||||
| private static readonly pb::FieldCodec<int> _repeated_inputTensorsAsShapesNeeded_codec | |||||
| = pb::FieldCodec.ForInt32(18); | |||||
| private readonly pbc::RepeatedField<int> inputTensorsAsShapesNeeded_ = new pbc::RepeatedField<int>(); | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public pbc::RepeatedField<int> InputTensorsAsShapesNeeded { | |||||
| get { return inputTensorsAsShapesNeeded_; } | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public override bool Equals(object other) { | |||||
| return Equals(other as CppShapeInferenceInputsNeeded); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public bool Equals(CppShapeInferenceInputsNeeded other) { | |||||
| if (ReferenceEquals(other, null)) { | |||||
| return false; | |||||
| } | |||||
| if (ReferenceEquals(other, this)) { | |||||
| return true; | |||||
| } | |||||
| if(!inputTensorsNeeded_.Equals(other.inputTensorsNeeded_)) return false; | |||||
| if(!inputTensorsAsShapesNeeded_.Equals(other.inputTensorsAsShapesNeeded_)) return false; | |||||
| return Equals(_unknownFields, other._unknownFields); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public override int GetHashCode() { | |||||
| int hash = 1; | |||||
| hash ^= inputTensorsNeeded_.GetHashCode(); | |||||
| hash ^= inputTensorsAsShapesNeeded_.GetHashCode(); | |||||
| if (_unknownFields != null) { | |||||
| hash ^= _unknownFields.GetHashCode(); | |||||
| } | |||||
| return hash; | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public override string ToString() { | |||||
| return pb::JsonFormatter.ToDiagnosticString(this); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public void WriteTo(pb::CodedOutputStream output) { | |||||
| inputTensorsNeeded_.WriteTo(output, _repeated_inputTensorsNeeded_codec); | |||||
| inputTensorsAsShapesNeeded_.WriteTo(output, _repeated_inputTensorsAsShapesNeeded_codec); | |||||
| if (_unknownFields != null) { | |||||
| _unknownFields.WriteTo(output); | |||||
| } | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public int CalculateSize() { | |||||
| int size = 0; | |||||
| size += inputTensorsNeeded_.CalculateSize(_repeated_inputTensorsNeeded_codec); | |||||
| size += inputTensorsAsShapesNeeded_.CalculateSize(_repeated_inputTensorsAsShapesNeeded_codec); | |||||
| if (_unknownFields != null) { | |||||
| size += _unknownFields.CalculateSize(); | |||||
| } | |||||
| return size; | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public void MergeFrom(CppShapeInferenceInputsNeeded other) { | |||||
| if (other == null) { | |||||
| return; | |||||
| } | |||||
| inputTensorsNeeded_.Add(other.inputTensorsNeeded_); | |||||
| inputTensorsAsShapesNeeded_.Add(other.inputTensorsAsShapesNeeded_); | |||||
| _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); | |||||
| } | |||||
| [global::System.Diagnostics.DebuggerNonUserCodeAttribute] | |||||
| public void MergeFrom(pb::CodedInputStream input) { | |||||
| uint tag; | |||||
| while ((tag = input.ReadTag()) != 0) { | |||||
| switch(tag) { | |||||
| default: | |||||
| _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); | |||||
| break; | |||||
| case 10: | |||||
| case 8: { | |||||
| inputTensorsNeeded_.AddEntriesFrom(input, _repeated_inputTensorsNeeded_codec); | |||||
| break; | |||||
| } | |||||
| case 18: | |||||
| case 16: { | |||||
| inputTensorsAsShapesNeeded_.AddEntriesFrom(input, _repeated_inputTensorsAsShapesNeeded_codec); | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| #endregion | |||||
| } | |||||
| #endregion Designer generated code | |||||
| @@ -5,7 +5,7 @@ | |||||
| <AssemblyName>TensorFlow.NET</AssemblyName> | <AssemblyName>TensorFlow.NET</AssemblyName> | ||||
| <RootNamespace>Tensorflow</RootNamespace> | <RootNamespace>Tensorflow</RootNamespace> | ||||
| <TargetTensorFlow>1.14.0</TargetTensorFlow> | <TargetTensorFlow>1.14.0</TargetTensorFlow> | ||||
| <Version>0.11.6</Version> | |||||
| <Version>0.11.8</Version> | |||||
| <Authors>Haiping Chen, Meinrad Recheis, Eli Belash</Authors> | <Authors>Haiping Chen, Meinrad Recheis, Eli Belash</Authors> | ||||
| <Company>SciSharp STACK</Company> | <Company>SciSharp STACK</Company> | ||||
| <GeneratePackageOnBuild>true</GeneratePackageOnBuild> | <GeneratePackageOnBuild>true</GeneratePackageOnBuild> | ||||
| @@ -17,7 +17,7 @@ | |||||
| <PackageTags>TensorFlow, NumSharp, SciSharp, MachineLearning, TensorFlow.NET, C#</PackageTags> | <PackageTags>TensorFlow, NumSharp, SciSharp, MachineLearning, TensorFlow.NET, C#</PackageTags> | ||||
| <Description>Google's TensorFlow full binding in .NET Standard. | <Description>Google's TensorFlow full binding in .NET Standard. | ||||
| Docs: https://tensorflownet.readthedocs.io</Description> | Docs: https://tensorflownet.readthedocs.io</Description> | ||||
| <AssemblyVersion>0.11.6.0</AssemblyVersion> | |||||
| <AssemblyVersion>0.11.8.0</AssemblyVersion> | |||||
| <PackageReleaseNotes>Changes since v0.10.0: | <PackageReleaseNotes>Changes since v0.10.0: | ||||
| 1. Upgrade NumSharp to v0.20.3. | 1. Upgrade NumSharp to v0.20.3. | ||||
| 2. Add DisposableObject class to manage object lifetime. | 2. Add DisposableObject class to manage object lifetime. | ||||
| @@ -31,9 +31,10 @@ Docs: https://tensorflownet.readthedocs.io</Description> | |||||
| 10. Support n-dim indexing for tensor. | 10. Support n-dim indexing for tensor. | ||||
| 11. Add RegisterNoGradients | 11. Add RegisterNoGradients | ||||
| 12. Add CumsumGrad, BroadcastToGrad. | 12. Add CumsumGrad, BroadcastToGrad. | ||||
| 13. Return VariableV1 instead of RefVariable.</PackageReleaseNotes> | |||||
| 13. Return VariableV1 instead of RefVariable. | |||||
| 14. Add Tensor overload to GradientDescentOptimizer.</PackageReleaseNotes> | |||||
| <LangVersion>7.3</LangVersion> | <LangVersion>7.3</LangVersion> | ||||
| <FileVersion>0.11.6.0</FileVersion> | |||||
| <FileVersion>0.11.8.0</FileVersion> | |||||
| <PackageLicenseFile>LICENSE</PackageLicenseFile> | <PackageLicenseFile>LICENSE</PackageLicenseFile> | ||||
| <PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance> | <PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance> | ||||
| <SignAssembly>true</SignAssembly> | <SignAssembly>true</SignAssembly> | ||||
| @@ -42,7 +43,7 @@ Docs: https://tensorflownet.readthedocs.io</Description> | |||||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> | ||||
| <AllowUnsafeBlocks>true</AllowUnsafeBlocks> | <AllowUnsafeBlocks>true</AllowUnsafeBlocks> | ||||
| <DefineConstants>TRACE;DEBUG</DefineConstants> | |||||
| <DefineConstants>TRACE;DEBUG;SERIALIZABLE</DefineConstants> | |||||
| </PropertyGroup> | </PropertyGroup> | ||||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'"> | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'"> | ||||
| @@ -65,6 +66,8 @@ Docs: https://tensorflownet.readthedocs.io</Description> | |||||
| <ItemGroup> | <ItemGroup> | ||||
| <PackageReference Include="Google.Protobuf" Version="3.5.1" /> | <PackageReference Include="Google.Protobuf" Version="3.5.1" /> | ||||
| <PackageReference Include="Newtonsoft.Json" Version="12.0.2" /> | |||||
| <PackageReference Include="NumSharp" Version="0.20.4" /> | |||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| @@ -72,8 +75,4 @@ Docs: https://tensorflownet.readthedocs.io</Description> | |||||
| <Folder Include="Keras\Initializers\" /> | <Folder Include="Keras\Initializers\" /> | ||||
| <Folder Include="Models\" /> | <Folder Include="Models\" /> | ||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | |||||
| <ProjectReference Include="..\..\..\NumSharp\src\NumSharp.Core\NumSharp.Core.csproj" /> | |||||
| </ItemGroup> | |||||
| </Project> | </Project> | ||||
| @@ -25,6 +25,7 @@ using System.Text; | |||||
| using NumSharp.Backends; | using NumSharp.Backends; | ||||
| using NumSharp.Backends.Unmanaged; | using NumSharp.Backends.Unmanaged; | ||||
| using static Tensorflow.c_api; | using static Tensorflow.c_api; | ||||
| using Newtonsoft.Json; | |||||
| namespace Tensorflow | namespace Tensorflow | ||||
| { | { | ||||
| @@ -44,11 +45,17 @@ namespace Tensorflow | |||||
| /// <summary> | /// <summary> | ||||
| /// True if this Tensor holds data allocated by C#. | /// True if this Tensor holds data allocated by C#. | ||||
| /// </summary> | /// </summary> | ||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public bool IsMemoryOwner => AllocationType >= AllocationType.Marshal; | public bool IsMemoryOwner => AllocationType >= AllocationType.Marshal; | ||||
| /// <summary> | /// <summary> | ||||
| /// The allocation method used to create this Tensor. | /// The allocation method used to create this Tensor. | ||||
| /// </summary> | /// </summary> | ||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public AllocationType AllocationType { get; protected set; } | public AllocationType AllocationType { get; protected set; } | ||||
| /// <summary> | /// <summary> | ||||
| @@ -28,6 +28,7 @@ using NumSharp.Backends; | |||||
| using NumSharp.Backends.Unmanaged; | using NumSharp.Backends.Unmanaged; | ||||
| using NumSharp.Utilities; | using NumSharp.Utilities; | ||||
| using Tensorflow.Framework; | using Tensorflow.Framework; | ||||
| using Newtonsoft.Json; | |||||
| namespace Tensorflow | namespace Tensorflow | ||||
| { | { | ||||
| @@ -43,19 +44,29 @@ namespace Tensorflow | |||||
| private readonly int _value_index; | private readonly int _value_index; | ||||
| private TF_Output? _tf_output; | private TF_Output? _tf_output; | ||||
| private readonly TF_DataType _override_dtype; | private readonly TF_DataType _override_dtype; | ||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public int Id => _id; | public int Id => _id; | ||||
| /// <summary> | /// <summary> | ||||
| /// The Graph that contains this tensor. | /// The Graph that contains this tensor. | ||||
| /// </summary> | /// </summary> | ||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public Graph graph => op?.graph; | public Graph graph => op?.graph; | ||||
| /// <summary> | /// <summary> | ||||
| /// The Operation that produces this tensor as an output. | /// The Operation that produces this tensor as an output. | ||||
| /// </summary> | /// </summary> | ||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public Operation op => _op; | public Operation op => _op; | ||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public Tensor[] outputs => op.outputs; | public Tensor[] outputs => op.outputs; | ||||
| /// <summary> | /// <summary> | ||||
| @@ -72,24 +83,40 @@ namespace Tensorflow | |||||
| /// The DType of elements in this tensor. | /// The DType of elements in this tensor. | ||||
| /// </summary> | /// </summary> | ||||
| public TF_DataType dtype => _handle == IntPtr.Zero ? _override_dtype : c_api.TF_TensorType(_handle); | public TF_DataType dtype => _handle == IntPtr.Zero ? _override_dtype : c_api.TF_TensorType(_handle); | ||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public ulong bytesize => _handle == IntPtr.Zero ? 0 : c_api.TF_TensorByteSize(_handle); | public ulong bytesize => _handle == IntPtr.Zero ? 0 : c_api.TF_TensorByteSize(_handle); | ||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public ulong itemsize => _handle == IntPtr.Zero ? 0 : c_api.TF_DataTypeSize(dtype); | public ulong itemsize => _handle == IntPtr.Zero ? 0 : c_api.TF_DataTypeSize(dtype); | ||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public ulong size => _handle == IntPtr.Zero ? 0 : bytesize / itemsize; | public ulong size => _handle == IntPtr.Zero ? 0 : bytesize / itemsize; | ||||
| public IntPtr buffer => _handle == IntPtr.Zero ? IntPtr.Zero : c_api.TF_TensorData(_handle); | |||||
| private IntPtr buffer => _handle == IntPtr.Zero ? IntPtr.Zero : c_api.TF_TensorData(_handle); | |||||
| public int num_consumers(TF_Output oper_out) => _handle == IntPtr.Zero ? 0 : c_api.TF_OperationOutputNumConsumers(oper_out); | public int num_consumers(TF_Output oper_out) => _handle == IntPtr.Zero ? 0 : c_api.TF_OperationOutputNumConsumers(oper_out); | ||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public int NDims => rank; | public int NDims => rank; | ||||
| /// <summary> | /// <summary> | ||||
| /// The name of the device on which this tensor will be produced, or null. | /// The name of the device on which this tensor will be produced, or null. | ||||
| /// </summary> | /// </summary> | ||||
| public string Device => op.Device; | public string Device => op.Device; | ||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public int[] dims => shape; | public int[] dims => shape; | ||||
| /// <summary> | /// <summary> | ||||
| /// Used for keep other pointer when do implicit operating | /// Used for keep other pointer when do implicit operating | ||||
| /// </summary> | /// </summary> | ||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public object Tag { get; set; } | public object Tag { get; set; } | ||||
| @@ -139,6 +166,9 @@ namespace Tensorflow | |||||
| return rank < 0 ? null : shape; | return rank < 0 ? null : shape; | ||||
| } | } | ||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public TensorShape TensorShape => rank < 0 ? new TensorShape() : tensor_util.to_shape(shape); | public TensorShape TensorShape => rank < 0 ? new TensorShape() : tensor_util.to_shape(shape); | ||||
| /// <summary> | /// <summary> | ||||
| @@ -479,9 +509,11 @@ namespace Tensorflow | |||||
| } else | } else | ||||
| throw new InvalidOperationException($"Tensor.AllocationHandle is not null ({AllocationHandle}) but AllocationType is not matched to a C# allocation type ({AllocationType})."); | throw new InvalidOperationException($"Tensor.AllocationHandle is not null ({AllocationHandle}) but AllocationType is not matched to a C# allocation type ({AllocationType})."); | ||||
| } | } | ||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public bool IsDisposed => _disposed; | public bool IsDisposed => _disposed; | ||||
| public int tensor_int_val { get; set; } | |||||
| // public int tensor_int_val { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -1,4 +1,5 @@ | |||||
| using NumSharp; | |||||
| using Newtonsoft.Json; | |||||
| using NumSharp; | |||||
| using System; | using System; | ||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||
| using System.Diagnostics.CodeAnalysis; | using System.Diagnostics.CodeAnalysis; | ||||
| @@ -35,6 +36,9 @@ namespace Tensorflow | |||||
| /// <summary> | /// <summary> | ||||
| /// Returns the size this shape represents. | /// Returns the size this shape represents. | ||||
| /// </summary> | /// </summary> | ||||
| #if SERIALIZABLE | |||||
| [JsonIgnore] | |||||
| #endif | |||||
| public int size | public int size | ||||
| { | { | ||||
| get | get | ||||
| @@ -33,6 +33,7 @@ namespace Tensorflow | |||||
| public static TF_DataType float32 = TF_DataType.TF_FLOAT; // is that float32? | public static TF_DataType float32 = TF_DataType.TF_FLOAT; // is that float32? | ||||
| public static TF_DataType float16 = TF_DataType.TF_HALF; | public static TF_DataType float16 = TF_DataType.TF_HALF; | ||||
| public static TF_DataType float64 = TF_DataType.TF_DOUBLE; | public static TF_DataType float64 = TF_DataType.TF_DOUBLE; | ||||
| public static TF_DataType variant = TF_DataType.TF_VARIANT; | |||||
| public static TF_DataType resource = TF_DataType.TF_RESOURCE; | public static TF_DataType resource = TF_DataType.TF_RESOURCE; | ||||
| /// <summary> | /// <summary> | ||||
| @@ -46,7 +46,7 @@ namespace Tensorflow.Train | |||||
| value, | value, | ||||
| name, | name, | ||||
| colocate_with_primary: true); | colocate_with_primary: true); | ||||
| ops.add_to_collection(ops.GraphKeys.MOVING_AVERAGE_VARIABLES, var); | |||||
| ops.add_to_collection(tf.GraphKeys.MOVING_AVERAGE_VARIABLES, var); | |||||
| _averages[var] = avg; | _averages[var] = avg; | ||||
| } | } | ||||
| else | else | ||||
| @@ -39,6 +39,12 @@ namespace Tensorflow.Train | |||||
| : base(learning_rate, use_locking, name) | : base(learning_rate, use_locking, name) | ||||
| { | { | ||||
| _lr = learning_rate; | _lr = learning_rate; | ||||
| } | |||||
| public GradientDescentOptimizer(Tensor learning_rate, bool use_locking = false, string name = "GradientDescent") | |||||
| : base(learning_rate, use_locking, name) | |||||
| { | |||||
| _lr_t = learning_rate; | |||||
| } | } | ||||
| public override void _prepare() | public override void _prepare() | ||||
| @@ -115,6 +115,7 @@ namespace Tensorflow | |||||
| dtype: dtype); | dtype: dtype); | ||||
| }); | }); | ||||
| _shape = shape ?? (initial_value as Tensor).TensorShape; | _shape = shape ?? (initial_value as Tensor).TensorShape; | ||||
| _initial_value = initial_value as Tensor; | |||||
| _handle = resource_variable_ops.eager_safe_variable_handle( | _handle = resource_variable_ops.eager_safe_variable_handle( | ||||
| initial_value: _initial_value, | initial_value: _initial_value, | ||||
| shape: _shape, | shape: _shape, | ||||
| @@ -122,7 +123,6 @@ namespace Tensorflow | |||||
| name: name, | name: name, | ||||
| graph_mode: _in_graph_mode); | graph_mode: _in_graph_mode); | ||||
| _unique_id = unique_id; | _unique_id = unique_id; | ||||
| _initial_value = initial_value as Tensor; | |||||
| _handle_name = handle_name + ":0"; | _handle_name = handle_name + ":0"; | ||||
| _dtype = _initial_value.dtype.as_base_dtype(); | _dtype = _initial_value.dtype.as_base_dtype(); | ||||
| // _constraint = constraint; | // _constraint = constraint; | ||||
| @@ -133,6 +133,7 @@ namespace Tensorflow | |||||
| { | { | ||||
| _is_initialized_op = gen_resource_variable_ops.var_is_initialized_op(_handle); | _is_initialized_op = gen_resource_variable_ops.var_is_initialized_op(_handle); | ||||
| }); | }); | ||||
| if(initial_value != null) | if(initial_value != null) | ||||
| { | { | ||||
| tf_with(ops.name_scope("Assign"), scope1 => | tf_with(ops.name_scope("Assign"), scope1 => | ||||
| @@ -143,10 +144,25 @@ namespace Tensorflow | |||||
| name: n); | name: n); | ||||
| }); | }); | ||||
| } | } | ||||
| // Manually assign reads to the handle's device to avoid log | |||||
| // messages. | |||||
| tf_with(ops.name_scope("Read"), delegate | |||||
| { | |||||
| var value = _read_variable_op(); | |||||
| _graph_element = value; | |||||
| }); | |||||
| } | } | ||||
| ops.add_to_collections(collections, this); | |||||
| }); | }); | ||||
| } | |||||
| throw new NotImplementedException(""); | |||||
| private Tensor _read_variable_op() | |||||
| { | |||||
| var result = gen_resource_variable_ops.read_variable_op(_handle, _dtype); | |||||
| // _maybe_set_handle_data(_dtype, _handle, result); | |||||
| return result; | |||||
| } | } | ||||
| private void _init_from_proto(VariableDef variable_def, string import_scope = null) | private void _init_from_proto(VariableDef variable_def, string import_scope = null) | ||||
| @@ -200,6 +216,18 @@ namespace Tensorflow | |||||
| _dtype = dtypes.as_tf_dtype((DataType)_handle.op.get_attr("dtype")); | _dtype = dtypes.as_tf_dtype((DataType)_handle.op.get_attr("dtype")); | ||||
| } | } | ||||
| public Tensor sparse_read(Tensor indices, string name = "Gather") | |||||
| { | |||||
| return tf_with(ops.name_scope(name), scope => | |||||
| { | |||||
| name = scope; | |||||
| var value = gen_resource_variable_ops.resource_gather( | |||||
| _handle, indices, dtype: _dtype, name: name); | |||||
| return array_ops.identity(value); | |||||
| }); | |||||
| } | |||||
| public override string ToString() | public override string ToString() | ||||
| { | { | ||||
| return $"tf.ResourceVariable '{name}' shape={shape} dtype={dtype}"; | return $"tf.ResourceVariable '{name}' shape={shape} dtype={dtype}"; | ||||
| @@ -135,6 +135,28 @@ namespace Tensorflow | |||||
| } | } | ||||
| // If at least one input was modified, replace the op. | // If at least one input was modified, replace the op. | ||||
| if(modified) | |||||
| { | |||||
| var new_op_type = op_type; | |||||
| if (new_op_type == "RefSwitch") | |||||
| new_op_type = "Switch"; | |||||
| var new_op_name = op.node_def.Name + "_" + name; | |||||
| new_op_name = new_op_name.Replace(":", "_"); | |||||
| var _output_types = op._output_types; | |||||
| // Convert attr values to AttrValue protos. | |||||
| var attr_protos = new Dictionary<string, AttrValue>(); | |||||
| foreach (var attr_def in op.node_def.Attr) | |||||
| attr_protos[attr_def.Key] = attr_def.Value; | |||||
| return op.graph.create_op( | |||||
| new_op_type, | |||||
| new_op_inputs.ToArray(), | |||||
| _output_types, | |||||
| name: new_op_name, | |||||
| attrs: attr_protos); | |||||
| } | |||||
| return op; | return op; | ||||
| } | } | ||||
| @@ -30,8 +30,10 @@ namespace Tensorflow | |||||
| public class GraphKeys | public class GraphKeys | ||||
| { | { | ||||
| #region const | #region const | ||||
| /// <summary> | |||||
| /// Key to collect concatenated sharded variables. | |||||
| /// </summary> | |||||
| public const string CONCATENATED_VARIABLES_ = "concatenated_variables"; | |||||
| /// <summary> | /// <summary> | ||||
| /// the subset of `Variable` objects that will be trained by an optimizer. | /// the subset of `Variable` objects that will be trained by an optimizer. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -52,7 +54,12 @@ namespace Tensorflow | |||||
| /// </summary> | /// </summary> | ||||
| public const string LOSSES_ = "losses"; | public const string LOSSES_ = "losses"; | ||||
| public const string MOVING_AVERAGE_VARIABLES = "moving_average_variables"; | |||||
| public const string LOCAL_VARIABLES_ = "local_variables"; | |||||
| public const string METRIC_VARIABLES_ = "metric_variables"; | |||||
| public const string MODEL_VARIABLES_ = "model_variables"; | |||||
| public const string MOVING_AVERAGE_VARIABLES_ = "moving_average_variables"; | |||||
| /// <summary> | /// <summary> | ||||
| /// Key to collect Variable objects that are global (shared across machines). | /// Key to collect Variable objects that are global (shared across machines). | ||||
| @@ -64,7 +71,21 @@ namespace Tensorflow | |||||
| public const string GLOBAL_STEP_ = "global_step"; | public const string GLOBAL_STEP_ = "global_step"; | ||||
| public string[] _VARIABLE_COLLECTIONS_ = new string[] { "variables", "trainable_variables", "model_variables" }; | |||||
| /// <summary> | |||||
| /// List of all collections that keep track of variables. | |||||
| /// </summary> | |||||
| public string[] _VARIABLE_COLLECTIONS_ = new string[] | |||||
| { | |||||
| GLOBAL_VARIABLES_, | |||||
| LOCAL_VARIABLES_, | |||||
| METRIC_VARIABLES_, | |||||
| MODEL_VARIABLES_, | |||||
| TRAINABLE_VARIABLES_, | |||||
| MOVING_AVERAGE_VARIABLES_, | |||||
| CONCATENATED_VARIABLES_, | |||||
| TRAINABLE_RESOURCE_VARIABLES_ | |||||
| }; | |||||
| /// <summary> | /// <summary> | ||||
| /// Key to collect BaseSaverBuilder.SaveableObject instances for checkpointing. | /// Key to collect BaseSaverBuilder.SaveableObject instances for checkpointing. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -86,7 +107,8 @@ namespace Tensorflow | |||||
| #endregion | #endregion | ||||
| public string CONCATENATED_VARIABLES => CONCATENATED_VARIABLES_; | |||||
| /// <summary> | /// <summary> | ||||
| /// the subset of `Variable` objects that will be trained by an optimizer. | /// the subset of `Variable` objects that will be trained by an optimizer. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -106,13 +128,16 @@ namespace Tensorflow | |||||
| /// Key to collect local variables that are local to the machine and are not | /// Key to collect local variables that are local to the machine and are not | ||||
| /// saved/restored. | /// saved/restored. | ||||
| /// </summary> | /// </summary> | ||||
| public string LOCAL_VARIABLES = "local_variables"; | |||||
| public string LOCAL_VARIABLES = LOCAL_VARIABLES_; | |||||
| /// <summary> | /// <summary> | ||||
| /// Key to collect losses | /// Key to collect losses | ||||
| /// </summary> | /// </summary> | ||||
| public string LOSSES => LOSSES_; | public string LOSSES => LOSSES_; | ||||
| public string METRIC_VARIABLES => METRIC_VARIABLES_; | |||||
| public string MOVING_AVERAGE_VARIABLES = MOVING_AVERAGE_VARIABLES_; | |||||
| /// <summary> | /// <summary> | ||||
| /// Key to collect Variable objects that are global (shared across machines). | /// Key to collect Variable objects that are global (shared across machines). | ||||
| /// Default collection for all variables, except local ones. | /// Default collection for all variables, except local ones. | ||||
| @@ -18,6 +18,6 @@ | |||||
| <AssemblyName>TensorFlow.Hub</AssemblyName> | <AssemblyName>TensorFlow.Hub</AssemblyName> | ||||
| </PropertyGroup> | </PropertyGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <ProjectReference Include="..\..\..\NumSharp\src\NumSharp.Core\NumSharp.Core.csproj" /> | |||||
| <PackageReference Include="NumSharp" Version="0.20.4" /> | |||||
| </ItemGroup> | </ItemGroup> | ||||
| </Project> | </Project> | ||||
| @@ -82,8 +82,7 @@ namespace TensorFlowNET.UnitTest | |||||
| var sess_graph = sess.GetPrivate<Graph>("_graph"); | var sess_graph = sess.GetPrivate<Graph>("_graph"); | ||||
| sess_graph.Should().NotBeNull(); | sess_graph.Should().NotBeNull(); | ||||
| default_graph.Should().NotBeNull() | default_graph.Should().NotBeNull() | ||||
| .And.BeEquivalentTo(sess_graph) | |||||
| .And.BeEquivalentTo(beforehand); | |||||
| .And.BeEquivalentTo(sess_graph); | |||||
| Console.WriteLine($"{tid}-{default_graph.graph_key}"); | Console.WriteLine($"{tid}-{default_graph.graph_key}"); | ||||