diff --git a/.gitignore b/.gitignore index e4aba715..eee1dc7b 100644 --- a/.gitignore +++ b/.gitignore @@ -62,7 +62,6 @@ StyleCopReport.xml *_p.c *_i.h *.ilk -*.meta *.obj *.iobj *.pch diff --git a/TensorFlow.NET.sln b/TensorFlow.NET.sln index b96f8203..bef96f5e 100644 --- a/TensorFlow.NET.sln +++ b/TensorFlow.NET.sln @@ -9,6 +9,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TensorFlowNET.Examples", "t EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TensorFlowNET.Core", "src\TensorFlowNET.Core\TensorFlowNET.Core.csproj", "{FD682AC0-7B2D-45D3-8B0D-C6D678B04144}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NumSharp.Core", "..\NumSharp\src\NumSharp.Core\NumSharp.Core.csproj", "{DE97EAD7-B92C-4112-9690-91C40A97179E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -27,6 +29,10 @@ Global {FD682AC0-7B2D-45D3-8B0D-C6D678B04144}.Debug|Any CPU.Build.0 = Debug|Any CPU {FD682AC0-7B2D-45D3-8B0D-C6D678B04144}.Release|Any CPU.ActiveCfg = Release|Any CPU {FD682AC0-7B2D-45D3-8B0D-C6D678B04144}.Release|Any CPU.Build.0 = Release|Any CPU + {DE97EAD7-B92C-4112-9690-91C40A97179E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DE97EAD7-B92C-4112-9690-91C40A97179E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DE97EAD7-B92C-4112-9690-91C40A97179E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DE97EAD7-B92C-4112-9690-91C40A97179E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/graph/README.md b/graph/README.md new file mode 100644 index 00000000..e69de29b diff --git a/graph/cond_test.meta b/graph/cond_test.meta new file mode 100644 index 00000000..2110d577 Binary files /dev/null and b/graph/cond_test.meta differ diff --git a/graph/kmeans.meta b/graph/kmeans.meta new file mode 100644 index 00000000..0ad4f03f Binary files /dev/null and b/graph/kmeans.meta differ diff --git a/src/TensorFlowNET.Core/Framework/op_def_registry.py.cs b/src/TensorFlowNET.Core/Framework/op_def_registry.py.cs index 11a89af1..270b9056 100644 --- a/src/TensorFlowNET.Core/Framework/op_def_registry.py.cs +++ b/src/TensorFlowNET.Core/Framework/op_def_registry.py.cs @@ -20,32 +20,9 @@ namespace Tensorflow foreach (var op_def in op_list.Op) _registered_ops[op_def.Name] = op_def; - - if (!_registered_ops.ContainsKey("NearestNeighbors")) - _registered_ops["NearestNeighbors"] = op_NearestNeighbors(); } return _registered_ops; } - - /// - /// Doesn't work because the op can't be found on binary - /// - /// - private static OpDef op_NearestNeighbors() - { - var def = new OpDef - { - Name = "NearestNeighbors" - }; - - def.InputArg.Add(new ArgDef { Name = "points", Type = DataType.DtFloat }); - def.InputArg.Add(new ArgDef { Name = "centers", Type = DataType.DtFloat }); - def.InputArg.Add(new ArgDef { Name = "k", Type = DataType.DtInt64 }); - def.OutputArg.Add(new ArgDef { Name = "nearest_center_indices", Type = DataType.DtInt64 }); - def.OutputArg.Add(new ArgDef { Name = "nearest_center_distances", Type = DataType.DtFloat }); - - return def; - } } } diff --git a/src/TensorFlowNET.Core/Operations/ControlFlows/CondContext.cs b/src/TensorFlowNET.Core/Operations/ControlFlows/CondContext.cs index 254df0cf..40238dce 100644 --- a/src/TensorFlowNET.Core/Operations/ControlFlows/CondContext.cs +++ b/src/TensorFlowNET.Core/Operations/ControlFlows/CondContext.cs @@ -335,7 +335,7 @@ namespace Tensorflow.Operations ret.Enter(); foreach (var nested_def in proto.NestedContexts) - throw new NotImplementedException(""); + from_control_flow_context_def(nested_def, import_scope: import_scope); ret.Exit(); return ret; } diff --git a/src/TensorFlowNET.Core/Operations/ControlFlows/ControlFlowContext.cs b/src/TensorFlowNET.Core/Operations/ControlFlows/ControlFlowContext.cs index 48a519db..a36602f7 100644 --- a/src/TensorFlowNET.Core/Operations/ControlFlows/ControlFlowContext.cs +++ b/src/TensorFlowNET.Core/Operations/ControlFlows/ControlFlowContext.cs @@ -3,7 +3,8 @@ using System.Collections.Generic; using System.Linq; using System.Text; using Tensorflow.Operations.ControlFlows; - +using static Tensorflow.ControlFlowContextDef; + namespace Tensorflow.Operations { /// @@ -184,6 +185,23 @@ namespace Tensorflow.Operations return null; } + /// + /// Deserializes `context_def` into the appropriate ControlFlowContext. + /// + /// ControlFlowContextDef proto + /// Name scope to add + /// A ControlFlowContext subclass + protected ControlFlowContext from_control_flow_context_def(ControlFlowContextDef context_def, string import_scope = "") + { + switch (context_def.CtxtCase) + { + case CtxtOneofCase.CondCtxt: + return new CondContext().from_proto(context_def.CondCtxt, import_scope: import_scope); + } + + throw new NotImplementedException($"Unknown ControlFlowContextDef field: {context_def.CtxtCase}"); + } + public object to_proto() { throw new NotImplementedException(); diff --git a/src/TensorFlowNET.Core/Operations/Operation.Implicit.cs b/src/TensorFlowNET.Core/Operations/Operation.Implicit.cs new file mode 100644 index 00000000..013c193c --- /dev/null +++ b/src/TensorFlowNET.Core/Operations/Operation.Implicit.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tensorflow +{ + /// + /// Convert to other datatype implicitly + /// + public partial class Operation + { + public static implicit operator Operation(IntPtr handle) => new Operation(handle); + public static implicit operator IntPtr(Operation op) => op._handle; + public static implicit operator Tensor(Operation op) => op.output; + + public override string ToString() + { + return _handle == IntPtr.Zero ? "tf.Operation Undefined" : $"tf.Operation '{name}' type={OpType}"; + } + + public override bool Equals(object obj) + { + switch (obj) + { + case IntPtr val: + return val == _handle; + case Operation val: + return val._handle == _handle; + } + + return base.Equals(obj); + } + } +} diff --git a/src/TensorFlowNET.Core/Operations/Operation.cs b/src/TensorFlowNET.Core/Operations/Operation.cs index 5915c216..bbb62be2 100644 --- a/src/TensorFlowNET.Core/Operations/Operation.cs +++ b/src/TensorFlowNET.Core/Operations/Operation.cs @@ -248,27 +248,6 @@ namespace Tensorflow s.Check(); return NodeDef.Parser.ParseFrom(buffer); } - } - - public override string ToString() - { - return _handle == IntPtr.Zero ? "tf.Operation Undefined" : $"tf.Operation '{name}' type={OpType}"; - } - - public static implicit operator Operation(IntPtr handle) => new Operation(handle); - public static implicit operator IntPtr(Operation op) => op._handle; - - public override bool Equals(object obj) - { - switch (obj) - { - case IntPtr val: - return val == _handle; - case Operation val: - return val._handle == _handle; - } - - return base.Equals(obj); } /// diff --git a/src/TensorFlowNET.Core/Python.cs b/src/TensorFlowNET.Core/Python.cs index d216dae3..e183ef43 100644 --- a/src/TensorFlowNET.Core/Python.cs +++ b/src/TensorFlowNET.Core/Python.cs @@ -27,6 +27,11 @@ namespace Tensorflow return Enumerable.Range(0, end); } + protected IEnumerable range(int start, int end) + { + return Enumerable.Range(start, end); + } + public static T New(object args) where T : IPyClass { var instance = Activator.CreateInstance(); diff --git a/src/TensorFlowNET.Core/Sessions/BaseSession.cs b/src/TensorFlowNET.Core/Sessions/BaseSession.cs index 6917ad91..3c0c7486 100644 --- a/src/TensorFlowNET.Core/Sessions/BaseSession.cs +++ b/src/TensorFlowNET.Core/Sessions/BaseSession.cs @@ -204,6 +204,12 @@ namespace Tensorflow switch (tensor.dtype) { + case TF_DataType.TF_BOOL: + var bools = new bool[tensor.size]; + for (ulong i = 0; i < tensor.size; i++) + bools[i] = *(bool*)(offset + (int)(tensor.itemsize * i)); + nd = np.array(bools).reshape(ndims); + break; case TF_DataType.TF_STRING: var bytes = tensor.Data(); // wired, don't know why we have to start from offset 9. diff --git a/src/TensorFlowNET.Core/TensorFlowNET.Core.csproj b/src/TensorFlowNET.Core/TensorFlowNET.Core.csproj index ee59b28d..cae47f15 100644 --- a/src/TensorFlowNET.Core/TensorFlowNET.Core.csproj +++ b/src/TensorFlowNET.Core/TensorFlowNET.Core.csproj @@ -57,4 +57,8 @@ More math/ linalg APIs. + + + + diff --git a/src/TensorFlowNET.Core/Train/Saving/BaseSaverBuilder.cs b/src/TensorFlowNET.Core/Train/Saving/BaseSaverBuilder.cs index 0cc3c981..6b58c184 100644 --- a/src/TensorFlowNET.Core/Train/Saving/BaseSaverBuilder.cs +++ b/src/TensorFlowNET.Core/Train/Saving/BaseSaverBuilder.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using Tensorflow.Operations; namespace Tensorflow { @@ -115,6 +116,9 @@ namespace Tensorflow case List values: foreach (var element in values) ; break; + case List values: + foreach (var element in values) ; + break; default: throw new NotImplementedException("_build_internal.check_collection_list"); } diff --git a/tensorflowlib/runtimes/win-x64/native/tensorflow.dll b/tensorflowlib/runtimes/win-x64/native/tensorflow.dll index f98eb380..0be52700 100644 Binary files a/tensorflowlib/runtimes/win-x64/native/tensorflow.dll and b/tensorflowlib/runtimes/win-x64/native/tensorflow.dll differ diff --git a/test/TensorFlowNET.Examples/KMeansClustering.cs b/test/TensorFlowNET.Examples/KMeansClustering.cs index d18a1153..9be1ad0d 100644 --- a/test/TensorFlowNET.Examples/KMeansClustering.cs +++ b/test/TensorFlowNET.Examples/KMeansClustering.cs @@ -33,19 +33,41 @@ namespace TensorFlowNET.Examples public bool Run() { + PrepareData(); + + var graph = tf.Graph().as_default(); + tf.train.import_meta_graph("kmeans.meta"); // Input images - var X = tf.placeholder(tf.float32, shape: new TensorShape(-1, num_features)); + var X = graph.get_operation_by_name("Placeholder").output; // tf.placeholder(tf.float32, shape: new TensorShape(-1, num_features)); // Labels (for assigning a label to a centroid and testing) - var Y = tf.placeholder(tf.float32, shape: new TensorShape(-1, num_classes)); + var Y = graph.get_operation_by_name("Placeholder_1").output; // tf.placeholder(tf.float32, shape: new TensorShape(-1, num_classes)); // K-Means Parameters - var kmeans = new KMeans(X, k, distance_metric: KMeans.COSINE_DISTANCE, use_mini_batch: true); + //var kmeans = new KMeans(X, k, distance_metric: KMeans.COSINE_DISTANCE, use_mini_batch: true); // Build KMeans graph - var training_graph = kmeans.training_graph(); - + //var training_graph = kmeans.training_graph(); + + var init_vars = tf.global_variables_initializer(); + Tensor init_op = graph.get_operation_by_name("cond/Merge"); + var train_op = graph.get_operation_by_name("group_deps"); + Tensor avg_distance = graph.get_operation_by_name("Mean"); + Tensor cluster_idx = graph.get_operation_by_name("Squeeze_1"); + + with(tf.Session(graph), sess => + { + sess.run(init_vars, new FeedItem(X, full_data_x)); + sess.run(init_op, new FeedItem(X, full_data_x)); + + // Training + foreach(var i in range(1, num_steps + 1)) + { + var result = sess.run(new Tensor[] { avg_distance, cluster_idx }, new FeedItem(X, full_data_x)); + } + }); + return false; } diff --git a/test/TensorFlowNET.Examples/TensorFlowNET.Examples.csproj b/test/TensorFlowNET.Examples/TensorFlowNET.Examples.csproj index c7e22315..ba342e5f 100644 --- a/test/TensorFlowNET.Examples/TensorFlowNET.Examples.csproj +++ b/test/TensorFlowNET.Examples/TensorFlowNET.Examples.csproj @@ -13,6 +13,7 @@ + diff --git a/test/TensorFlowNET.UnitTest/TensorFlowNET.UnitTest.csproj b/test/TensorFlowNET.UnitTest/TensorFlowNET.UnitTest.csproj index 05530031..dd6e6ff6 100644 --- a/test/TensorFlowNET.UnitTest/TensorFlowNET.UnitTest.csproj +++ b/test/TensorFlowNET.UnitTest/TensorFlowNET.UnitTest.csproj @@ -22,6 +22,7 @@ +