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 @@
+