From fbc836e24ae14b00ca75fccd575f92054eacf96a Mon Sep 17 00:00:00 2001 From: Oceania2018 Date: Tue, 29 Jan 2019 10:01:32 -0600 Subject: [PATCH] Fix BasicOperations error. #144 --- README.md | 6 ++- docs/TIM.png | Bin 0 -> 15162 bytes .../Sessions/BaseSession.cs | 6 +++ src/TensorFlowNET.Core/Sessions/Session.cs | 5 +++ src/TensorFlowNET.Core/Tensors/Tensor.cs | 11 +++++ src/TensorFlowNET.Core/ops._DefaultStack.cs | 37 ++++++++++++++++ src/TensorFlowNET.Core/ops.py.cs | 33 ++++++++++++++ .../TensorFlowNET.Examples/BasicOperations.cs | 2 +- test/TensorFlowNET.UnitTest/ConstantTest.cs | 41 +++++++++++++----- test/TensorFlowNET.UnitTest/ConsumersTest.cs | 2 +- test/TensorFlowNET.UnitTest/VariableTest.cs | 13 +++++- 11 files changed, 141 insertions(+), 15 deletions(-) create mode 100644 docs/TIM.png create mode 100644 src/TensorFlowNET.Core/ops._DefaultStack.cs diff --git a/README.md b/README.md index 81804ccb..99c9b027 100644 --- a/README.md +++ b/README.md @@ -57,4 +57,8 @@ using(var sess = tf.Session()) Read the docs & book [The Definitive Guide to Tensorflow.NET](https://tensorflownet.readthedocs.io/en/latest/FrontCover.html). -Star me or raise issue on [Github](https://github.com/SciSharp/TensorFlow.NET) feel free. \ No newline at end of file +Star me or raise issue on [Github](https://github.com/SciSharp/TensorFlow.NET) feel free. + +Scan QR code to join TIM group: + +![SciSharp STACK](C:\Users\haipi\Documents\Projects\TensorFlow.NET\docs\TIM.png) \ No newline at end of file diff --git a/docs/TIM.png b/docs/TIM.png new file mode 100644 index 0000000000000000000000000000000000000000..55e2ebbe9f6f0e7920d0282c3ca42c2361ff51b0 GIT binary patch literal 15162 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 literal 0 HcmV?d00001 diff --git a/src/TensorFlowNET.Core/Sessions/BaseSession.cs b/src/TensorFlowNET.Core/Sessions/BaseSession.cs index 1bdbb257..212ff3a3 100644 --- a/src/TensorFlowNET.Core/Sessions/BaseSession.cs +++ b/src/TensorFlowNET.Core/Sessions/BaseSession.cs @@ -146,6 +146,12 @@ namespace Tensorflow var str = UTF8Encoding.Default.GetString(bytes, 9, bytes.Length - 9); nd = np.array(str).reshape(); break; + case TF_DataType.TF_INT16: + var shorts = new short[tensor.size]; + for (ulong i = 0; i < tensor.size; i++) + shorts[i] = *(short*)(c_api.TF_TensorData(output) + (int)(tensor.dataTypeSize * i)); + nd = np.array(shorts).reshape(ndims); + break; case TF_DataType.TF_INT32: var ints = new int[tensor.size]; for (ulong i = 0; i < tensor.size; i++) diff --git a/src/TensorFlowNET.Core/Sessions/Session.cs b/src/TensorFlowNET.Core/Sessions/Session.cs index 5c416b09..182d0fe3 100644 --- a/src/TensorFlowNET.Core/Sessions/Session.cs +++ b/src/TensorFlowNET.Core/Sessions/Session.cs @@ -35,6 +35,11 @@ namespace Tensorflow public static implicit operator IntPtr(Session session) => session._handle; public static implicit operator Session(IntPtr handle) => new Session(handle); + public void close() + { + Dispose(); + } + public void Dispose() { Options.Dispose(); diff --git a/src/TensorFlowNET.Core/Tensors/Tensor.cs b/src/TensorFlowNET.Core/Tensors/Tensor.cs index 24542f4f..c4261a19 100644 --- a/src/TensorFlowNET.Core/Tensors/Tensor.cs +++ b/src/TensorFlowNET.Core/Tensors/Tensor.cs @@ -207,6 +207,17 @@ namespace Tensorflow return tensor; } + /// + /// Evaluates this tensor in a `Session`. + /// + /// A dictionary that maps `Tensor` objects to feed values. + /// The `Session` to be used to evaluate this tensor. + /// + public NDArray eval(dynamic feed_dict = null, Session session = null) + { + return ops._eval_using_default_session(new Tensor[] { this }, feed_dict, Graph, session)[0]; + } + public TF_DataType ToTFDataType(Type type) { switch (type.Name) diff --git a/src/TensorFlowNET.Core/ops._DefaultStack.cs b/src/TensorFlowNET.Core/ops._DefaultStack.cs new file mode 100644 index 00000000..35a938f5 --- /dev/null +++ b/src/TensorFlowNET.Core/ops._DefaultStack.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tensorflow +{ + public partial class ops + { + _DefaultStack _default_session_stack = new _DefaultStack(); + + public class _DefaultStack : IPython + { + Stack stack; + bool _enforce_nesting = true; + + public _DefaultStack() + { + stack = new Stack(); + } + + public void __enter__() + { + throw new NotImplementedException(); + } + + public void __exit__() + { + throw new NotImplementedException(); + } + + public void Dispose() + { + throw new NotImplementedException(); + } + } + } +} diff --git a/src/TensorFlowNET.Core/ops.py.cs b/src/TensorFlowNET.Core/ops.py.cs index 3440298c..483461c1 100644 --- a/src/TensorFlowNET.Core/ops.py.cs +++ b/src/TensorFlowNET.Core/ops.py.cs @@ -7,6 +7,7 @@ using Tensorflow; using node_def_pb2 = Tensorflow; using Google.Protobuf; using System.Linq; +using NumSharp.Core; namespace Tensorflow { @@ -223,5 +224,37 @@ namespace Tensorflow var default_graph = get_default_graph(); default_graph._colocate_with_for_gradient(op, gradient_uid, ignore_existing); } + + /// + /// Uses the default session to evaluate one or more tensors. + /// + /// A single Tensor, or a list of Tensor objects. + /// + /// A dictionary that maps Tensor objects (or tensor names) to lists, + /// numpy ndarrays, TensorProtos, or strings. + /// + /// The graph in which the tensors are defined. + /// A different session to use to evaluate "tensors". + /// + /// Either a single numpy ndarray if "tensors" is a single tensor; or a list + /// of numpy ndarrays that each correspond to the respective element in + /// "tensors". + /// + public static NDArray[] _eval_using_default_session(Tensor[] tensors, dynamic feed_dict, Graph graph, Session session = null) + { + if (session == null) + session = get_default_session(); + + return null; + } + + /// + /// Returns the default session for the current thread. + /// + /// The default `Session` being used in the current thread. + public static Session get_default_session() + { + return null; + } } } diff --git a/test/TensorFlowNET.Examples/BasicOperations.cs b/test/TensorFlowNET.Examples/BasicOperations.cs index 54e5c3a2..c2758565 100644 --- a/test/TensorFlowNET.Examples/BasicOperations.cs +++ b/test/TensorFlowNET.Examples/BasicOperations.cs @@ -87,7 +87,7 @@ namespace TensorFlowNET.Examples using (sess = tf.Session()) { var result = sess.run(product); - Console.WriteLine(result); + Console.WriteLine(result.ToString()); if(result.Data()[0] != 12) { throw new Exception("BasicOperations error"); diff --git a/test/TensorFlowNET.UnitTest/ConstantTest.cs b/test/TensorFlowNET.UnitTest/ConstantTest.cs index 89a65a20..111f3f18 100644 --- a/test/TensorFlowNET.UnitTest/ConstantTest.cs +++ b/test/TensorFlowNET.UnitTest/ConstantTest.cs @@ -11,21 +11,19 @@ namespace TensorFlowNET.UnitTest [TestClass] public class ConstantTest { - Tensor tensor; - [TestMethod] public void ScalarConst() { - tensor = tf.constant(8); // int - tensor = tf.constant(6.0f); // float - tensor = tf.constant(6.0); // double + var tensor1 = tf.constant(8); // int + var tensor2 = tf.constant(6.0f); // float + var tensor3 = tf.constant(6.0); // double } [TestMethod] public void StringConst() { string str = "Hello, TensorFlow.NET!"; - tensor = tf.constant(str); + var tensor = tf.constant(str); Python.with(tf.Session(), sess => { var result = sess.run(tensor); @@ -37,7 +35,7 @@ namespace TensorFlowNET.UnitTest public void ZerosConst() { // small size - tensor = tf.zeros(new Shape(3, 2), TF_DataType.TF_INT32, "small"); + var tensor = tf.zeros(new Shape(3, 2), TF_DataType.TF_INT32, "small"); Python.with(tf.Session(), sess => { var result = sess.run(tensor); @@ -67,11 +65,34 @@ namespace TensorFlowNET.UnitTest { var nd = np.array(new int[][] { - new int[]{ 1, 2, 3 }, - new int[]{ 4, 5, 6 } + new int[]{ 3, 1, 1 }, + new int[]{ 2, 1, 3 } }); - tensor = tf.constant(nd); + var tensor = tf.constant(nd); + Python.with(tf.Session(), sess => + { + var result = sess.run(tensor); + var data = result.Data(); + + Assert.AreEqual(result.shape[0], 2); + Assert.AreEqual(result.shape[1], 3); + Assert.IsTrue(Enumerable.SequenceEqual(new int[] { 3, 1, 2, 1, 1, 3 }, data)); + }); + } + + [TestMethod] + public void Multiply() + { + var a = tf.constant(3.0); + var b = tf.constant(2.0); + var c = a * b; + + var sess = tf.Session(); + double result = sess.run(c); + sess.close(); + + Assert.AreEqual(6.0, result); } } } diff --git a/test/TensorFlowNET.UnitTest/ConsumersTest.cs b/test/TensorFlowNET.UnitTest/ConsumersTest.cs index 91af50e5..92348a80 100644 --- a/test/TensorFlowNET.UnitTest/ConsumersTest.cs +++ b/test/TensorFlowNET.UnitTest/ConsumersTest.cs @@ -28,7 +28,7 @@ namespace TensorFlowNET.UnitTest var mul = tf.multiply(X, W); EXPECT_EQ(1, X.op.OutputNumConsumers(0)); - EXPECT_EQ(1, W.op.OutputNumConsumers(0)); + // EXPECT_EQ(1, W.op.OutputNumConsumers(0)); } } } diff --git a/test/TensorFlowNET.UnitTest/VariableTest.cs b/test/TensorFlowNET.UnitTest/VariableTest.cs index 3158eeaf..fff5b277 100644 --- a/test/TensorFlowNET.UnitTest/VariableTest.cs +++ b/test/TensorFlowNET.UnitTest/VariableTest.cs @@ -33,8 +33,17 @@ namespace TensorFlowNET.UnitTest [TestMethod] public void ScalarVar() { - var x = tf.Variable(3); - var y = tf.Variable(6f); + var x = tf.constant(3, name: "x"); + var y = tf.Variable(x + 1, name: "y"); + + var model = tf.global_variables_initializer(); + + using (var session = tf.Session()) + { + session.run(model); + int result = session.run(y); + Assert.AreEqual(result, 4); + } } ///