From d78a6616f64a378b56afe03a460b343658d0958c Mon Sep 17 00:00:00 2001 From: Oceania2018 Date: Mon, 24 Dec 2018 00:42:55 -0600 Subject: [PATCH] TF_NewTensor pass. --- README.md | 7 +- .../CH_1 Tensor.md | 25 +++++++ .../INTRO.md | 10 ++- .../assets/column-major order.png | Bin 0 -> 16346 bytes .../assets/row-major order.png | Bin 0 -> 15119 bytes src/TensorFlowNET.Core/Tensor/Tensor.cs | 62 ++++++++++-------- src/TensorFlowNET.Core/c_api.cs | 16 +++++ test/TensorFlowNET.UnitTest/TensorTest.cs | 9 +++ 8 files changed, 100 insertions(+), 29 deletions(-) create mode 100644 The Definitive Guide to Tensorflow.NET/assets/column-major order.png create mode 100644 The Definitive Guide to Tensorflow.NET/assets/row-major order.png diff --git a/README.md b/README.md index 2cd2060b..fdfc6de7 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ TensorFlow.NET provides .NET Standard binding for [TensorFlow](https://www.tensorflow.org/). [![Join the chat at https://gitter.im/publiclab/publiclab](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Tensorflow-NET) +![Tensorflow.NET](https://ci.appveyor.com/api/projects/status/tensorflow-net-p7kmsjyo10ey?svg=true) TensorFlow.NET is a member project of SciSharp stack. @@ -10,11 +11,12 @@ TensorFlow.NET is a member project of SciSharp stack. ### How to use Download the pre-compiled dll [here](tensorflowlib) and place it in the bin folder. +Import tensorflow.net. ```cs -// import tensorflow.net -using using Tensorflow; +using Tensorflow; ``` +Add two constants. ```cs // Create a Constant op var a = tf.constant(4.0f); @@ -27,6 +29,7 @@ using (var sess = tf.Session()) } ``` +Feed placeholder. ```cs // Create a placeholder op var a = tf.placeholder(tf.float32); diff --git a/The Definitive Guide to Tensorflow.NET/CH_1 Tensor.md b/The Definitive Guide to Tensorflow.NET/CH_1 Tensor.md index 17753b29..b499c6ec 100644 --- a/The Definitive Guide to Tensorflow.NET/CH_1 Tensor.md +++ b/The Definitive Guide to Tensorflow.NET/CH_1 Tensor.md @@ -4,3 +4,28 @@ ### 表示一个操作的输出 + + +##### What is Tensor? + +##### Tensor 是什么? + + + + + +TF uses column major order. + +TF 采用的是按列存储模式,如果我们用NumSharp产生一个2 X 3的矩阵,如果按顺序从0到5访问数据的话,是不会得到1-6的数字的,而是得到1,4, 2, 5, 3, 6这个顺序的一组数字。 + +```cs +// generate a matrix:[[1, 2, 3], [4, 5, 6]] +var nd = np.array(1f, 2f, 3f, 4f, 5f, 6f).reshape(2, 3); +// the index will be 0 2 4 1 3 5, it's column-major order. +``` + + + +![1545631998951](assets/column-major order.png) + +![1545631998951](assets/row-major order.png) diff --git a/The Definitive Guide to Tensorflow.NET/INTRO.md b/The Definitive Guide to Tensorflow.NET/INTRO.md index c80c7333..79be7c83 100644 --- a/The Definitive Guide to Tensorflow.NET/INTRO.md +++ b/The Definitive Guide to Tensorflow.NET/INTRO.md @@ -22,4 +22,12 @@ TensorFlow is an open source project for machine learning especially for deep le -为了避免混淆,本书中对TensorFlow中定义的特有类不进行翻译,比如Tensor, Graph, Shape这些词都会保留英文名称。 \ No newline at end of file +为了避免混淆,本书中对TensorFlow中定义的特有类不进行翻译,比如Tensor, Graph, Shape这些词都会保留英文名称。 + + + +术语简称: + +TF: Google TensorFlow + +TF.NET: Tensorflow.NET \ No newline at end of file diff --git a/The Definitive Guide to Tensorflow.NET/assets/column-major order.png b/The Definitive Guide to Tensorflow.NET/assets/column-major order.png new file mode 100644 index 0000000000000000000000000000000000000000..a03a5e0e682b708459e17397a984062032cc685f GIT binary patch literal 16346 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 literal 0 HcmV?d00001 diff --git a/The Definitive Guide to Tensorflow.NET/assets/row-major order.png b/The Definitive Guide to Tensorflow.NET/assets/row-major order.png new file mode 100644 index 0000000000000000000000000000000000000000..92809513a1362841adc7edd1f6e94f4e6c5ffee1 GIT binary patch literal 15119 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 G(EkJZ{34_P literal 0 HcmV?d00001 diff --git a/src/TensorFlowNET.Core/Tensor/Tensor.cs b/src/TensorFlowNET.Core/Tensor/Tensor.cs index 4681e749..142671bb 100644 --- a/src/TensorFlowNET.Core/Tensor/Tensor.cs +++ b/src/TensorFlowNET.Core/Tensor/Tensor.cs @@ -7,50 +7,60 @@ namespace Tensorflow { public class Tensor { - private readonly Operation _op; - public Operation op => _op; - private readonly int _value_index; - public int value_index => _value_index; - private TF_DataType _dtype; - public TF_DataType dtype => _dtype; + public Operation op { get; } + public int value_index { get; } + public TF_DataType dtype { get; } - public Graph graph => _op.graph; + public Graph graph => op.graph; public string name; - - private readonly IntPtr _handle; - public IntPtr handle => _handle; - - private readonly int _ndim; - public int ndim => _ndim; + public IntPtr handle { get; } + public int ndim { get; } + public ulong bytesize { get; } + public ulong dataTypeSize { get;} + public ulong size => bytesize / dataTypeSize; + public IntPtr buffer { get; } public Tensor(IntPtr handle) { - _handle = handle; - _dtype = c_api.TF_TensorType(_handle); - _ndim = c_api.TF_NumDims(_handle); + this.handle = handle; + dtype = c_api.TF_TensorType(handle); + ndim = c_api.TF_NumDims(handle); + bytesize = c_api.TF_TensorByteSize(handle); + buffer = c_api.TF_TensorData(handle); + dataTypeSize = c_api.TF_DataTypeSize(dtype); } public Tensor(Operation op, int value_index, TF_DataType dtype) { - _op = op; - _value_index = value_index; - _dtype = dtype; + this.op = op; + this.value_index = value_index; + this.dtype = dtype; } public TF_Output _as_tf_output() { - return c_api_util.tf_output(_op._c_op, _value_index); + return c_api_util.tf_output(op._c_op, value_index); + } + + public T[] Data() + { + var data = new T[size]; + + for (ulong i = 0; i < size; i++) + { + data[i] = Marshal.PtrToStructure(buffer + (int)(i * dataTypeSize)); + } + + return data; } - public T Data() + public byte[] Data() { - /*var buffer = new byte[6 * sizeof(float)]; - var h1 = c_api.TF_TensorData(handle); - var bytes = Marshal.PtrToStructure(h1); - Marshal.Copy(h1, buffer, 0, 24);*/ + var data = new byte[bytesize]; + Marshal.Copy(buffer, data, 0, (int)bytesize); - return default(T); + return data; } } } diff --git a/src/TensorFlowNET.Core/c_api.cs b/src/TensorFlowNET.Core/c_api.cs index 4cdd0a5d..c1d30a86 100644 --- a/src/TensorFlowNET.Core/c_api.cs +++ b/src/TensorFlowNET.Core/c_api.cs @@ -17,6 +17,14 @@ namespace Tensorflow [DllImport(TensorFlowLibName)] public static unsafe extern void TF_AddInput(TF_OperationDescription desc, TF_Output input); + /// + /// returns the sizeof() for the underlying type corresponding to the given TF_DataType enum value. + /// + /// + /// + [DllImport(TensorFlowLibName)] + public static unsafe extern ulong TF_DataTypeSize(TF_DataType dt); + [DllImport(TensorFlowLibName)] public static unsafe extern void TF_DeleteSessionOptions(IntPtr opts); @@ -104,6 +112,14 @@ namespace Tensorflow [DllImport(TensorFlowLibName)] public static extern unsafe void TF_SetAttrType(TF_OperationDescription desc, string attr_name, TF_DataType value); + /// + /// Return the size of the underlying data in bytes. + /// + /// + /// + [DllImport(TensorFlowLibName)] + public static extern unsafe ulong TF_TensorByteSize(IntPtr tensor); + [DllImport(TensorFlowLibName)] public static extern unsafe IntPtr TF_TensorData(IntPtr tensor); diff --git a/test/TensorFlowNET.UnitTest/TensorTest.cs b/test/TensorFlowNET.UnitTest/TensorTest.cs index aea0b906..f337b583 100644 --- a/test/TensorFlowNET.UnitTest/TensorTest.cs +++ b/test/TensorFlowNET.UnitTest/TensorTest.cs @@ -36,6 +36,15 @@ namespace TensorFlowNET.UnitTest Assert.AreEqual(tensor.ndim, nd.ndim); Assert.AreEqual(nd.shape[0], c_api.TF_Dim(handle, 0)); Assert.AreEqual(nd.shape[1], c_api.TF_Dim(handle, 1)); + Assert.AreEqual(tensor.bytesize, (uint)nd.size * sizeof(float)); + + // Column major order + // https://en.wikipedia.org/wiki/File:Row_and_column_major_order.svg + // matrix:[[1, 2, 3], [4, 5, 6]] + // index: 0 2 4 1 3 5 + // result: 1 4 2 5 3 6 + var array = tensor.Data(); + Assert.IsTrue(Enumerable.SequenceEqual(nd.Data(), array)); } } }