| @@ -9,8 +9,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TensorFlowNET.Core", "src\T | |||||
| EndProject | EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TensorFlowNET.Examples", "test\TensorFlowNET.Examples\TensorFlowNET.Examples.csproj", "{1FE60088-157C-4140-91AB-E96B915E4BAE}" | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TensorFlowNET.Examples", "test\TensorFlowNET.Examples\TensorFlowNET.Examples.csproj", "{1FE60088-157C-4140-91AB-E96B915E4BAE}" | ||||
| EndProject | EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NumSharp.Core", "..\NumSharp\src\NumSharp.Core\NumSharp.Core.csproj", "{EC622ADF-8DAE-474B-B18E-9598A4F91BA2}" | |||||
| EndProject | |||||
| Global | Global | ||||
| GlobalSection(SolutionConfigurationPlatforms) = preSolution | GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| Debug|Any CPU = Debug|Any CPU | Debug|Any CPU = Debug|Any CPU | ||||
| @@ -29,10 +27,6 @@ Global | |||||
| {1FE60088-157C-4140-91AB-E96B915E4BAE}.Debug|Any CPU.Build.0 = Debug|Any CPU | {1FE60088-157C-4140-91AB-E96B915E4BAE}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| {1FE60088-157C-4140-91AB-E96B915E4BAE}.Release|Any CPU.ActiveCfg = Release|Any CPU | {1FE60088-157C-4140-91AB-E96B915E4BAE}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| {1FE60088-157C-4140-91AB-E96B915E4BAE}.Release|Any CPU.Build.0 = Release|Any CPU | {1FE60088-157C-4140-91AB-E96B915E4BAE}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| {EC622ADF-8DAE-474B-B18E-9598A4F91BA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
| {EC622ADF-8DAE-474B-B18E-9598A4F91BA2}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
| {EC622ADF-8DAE-474B-B18E-9598A4F91BA2}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
| {EC622ADF-8DAE-474B-B18E-9598A4F91BA2}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
| EndGlobalSection | EndGlobalSection | ||||
| GlobalSection(SolutionProperties) = preSolution | GlobalSection(SolutionProperties) = preSolution | ||||
| HideSolutionNode = FALSE | HideSolutionNode = FALSE | ||||
| @@ -15,5 +15,10 @@ namespace Tensorflow | |||||
| { | { | ||||
| return gen_math_ops.mul(x, y); | return gen_math_ops.mul(x, y); | ||||
| } | } | ||||
| public static unsafe Tensor multiply(Tensor x, RefVariable y) | |||||
| { | |||||
| return gen_math_ops.mul(x, y); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -24,6 +24,7 @@ namespace Tensorflow | |||||
| private List<String> _unfetchable_ops = new List<string>(); | private List<String> _unfetchable_ops = new List<string>(); | ||||
| private string _name_stack; | private string _name_stack; | ||||
| public string _graph_key; | |||||
| public Status Status { get; } | public Status Status { get; } | ||||
| public Graph() | public Graph() | ||||
| @@ -36,24 +36,50 @@ namespace Tensorflow | |||||
| foreach (var input_arg in op_def.InputArg) | foreach (var input_arg in op_def.InputArg) | ||||
| { | { | ||||
| var input_name = input_arg.Name; | var input_name = input_arg.Name; | ||||
| if (keywords.ContainsKey(input_name)) | |||||
| switch (keywords[input_name]) | |||||
| { | { | ||||
| inputs.Add(keywords[input_name] as Tensor); | |||||
| } | |||||
| if (!String.IsNullOrEmpty(input_arg.TypeAttr)) | |||||
| { | |||||
| attrs[input_arg.TypeAttr] = (keywords[input_name] as Tensor).dtype; | |||||
| case Tensor value: | |||||
| if (keywords.ContainsKey(input_name)) | |||||
| { | |||||
| inputs.Add(value); | |||||
| } | |||||
| if (!String.IsNullOrEmpty(input_arg.TypeAttr)) | |||||
| { | |||||
| attrs[input_arg.TypeAttr] = value.dtype; | |||||
| } | |||||
| if (input_arg.IsRef) | |||||
| { | |||||
| } | |||||
| else | |||||
| { | |||||
| input_types.Add(value.dtype); | |||||
| } | |||||
| break; | |||||
| case RefVariable value: | |||||
| if (keywords.ContainsKey(input_name)) | |||||
| { | |||||
| inputs.Add(value._initial_value); | |||||
| } | |||||
| if (!String.IsNullOrEmpty(input_arg.TypeAttr)) | |||||
| { | |||||
| attrs[input_arg.TypeAttr] = value._initial_value.dtype; | |||||
| } | |||||
| if (input_arg.IsRef) | |||||
| { | |||||
| } | |||||
| else | |||||
| { | |||||
| input_types.Add(value._initial_value.dtype); | |||||
| } | |||||
| break; | |||||
| } | } | ||||
| if (input_arg.IsRef) | |||||
| { | |||||
| } | |||||
| else | |||||
| { | |||||
| input_types.Add((keywords[input_name] as Tensor).dtype); | |||||
| } | |||||
| } | } | ||||
| // Process remaining attrs | // Process remaining attrs | ||||
| @@ -31,6 +31,17 @@ namespace Tensorflow | |||||
| return new Tensor(_op, 0, _op.OutputType(0)); | return new Tensor(_op, 0, _op.OutputType(0)); | ||||
| } | } | ||||
| public static Tensor mul(Tensor x, RefVariable y) | |||||
| { | |||||
| var keywords = new Dictionary<string, object>(); | |||||
| keywords.Add("x", x); | |||||
| keywords.Add("y", y); | |||||
| var _op = _op_def_lib._apply_op_helper("Mul", name: "mul", keywords: keywords); | |||||
| return new Tensor(_op, 0, _op.OutputType(0)); | |||||
| } | |||||
| public static Tensor mat_mul(Tensor a, Tensor b, bool transpose_a = false, bool transpose_b = false) | public static Tensor mat_mul(Tensor a, Tensor b, bool transpose_a = false, bool transpose_b = false) | ||||
| { | { | ||||
| var keywords = new Dictionary<string, object>(); | var keywords = new Dictionary<string, object>(); | ||||
| @@ -124,25 +124,25 @@ namespace Tensorflow | |||||
| // wired, don't know why we have to start from offset 9. | // wired, don't know why we have to start from offset 9. | ||||
| var bytes = tensor.Data(); | var bytes = tensor.Data(); | ||||
| var output = UTF8Encoding.Default.GetString(bytes, 9, bytes.Length - 9); | var output = UTF8Encoding.Default.GetString(bytes, 9, bytes.Length - 9); | ||||
| result[i] = tensor.NDims == 0 ? output : np.array(output).reshape(ndims); | |||||
| result[i] = fetchValue(tensor, ndims, output); | |||||
| } | } | ||||
| break; | break; | ||||
| case TF_DataType.TF_FLOAT: | case TF_DataType.TF_FLOAT: | ||||
| { | { | ||||
| var output = *(float*)c_api.TF_TensorData(output_values[i]); | var output = *(float*)c_api.TF_TensorData(output_values[i]); | ||||
| result[i] = tensor.NDims == 0 ? output : np.array(output).reshape(ndims); | |||||
| result[i] = fetchValue(tensor, ndims, output); | |||||
| } | } | ||||
| break; | break; | ||||
| case TF_DataType.TF_INT16: | case TF_DataType.TF_INT16: | ||||
| { | { | ||||
| var output = *(short*)c_api.TF_TensorData(output_values[i]); | var output = *(short*)c_api.TF_TensorData(output_values[i]); | ||||
| result[i] = tensor.NDims == 0 ? output : np.array(output).reshape(ndims); | |||||
| result[i] = fetchValue(tensor, ndims, output); | |||||
| } | } | ||||
| break; | break; | ||||
| case TF_DataType.TF_INT32: | case TF_DataType.TF_INT32: | ||||
| { | { | ||||
| var output = *(int*)c_api.TF_TensorData(output_values[i]); | var output = *(int*)c_api.TF_TensorData(output_values[i]); | ||||
| result[i] = tensor.NDims == 0 ? output : np.array(output).reshape(ndims); | |||||
| result[i] = fetchValue(tensor, ndims, output); | |||||
| } | } | ||||
| break; | break; | ||||
| default: | default: | ||||
| @@ -153,6 +153,18 @@ namespace Tensorflow | |||||
| return result; | return result; | ||||
| } | } | ||||
| private object fetchValue<T>(Tensor tensor, int[] ndims, T output) | |||||
| { | |||||
| if (tensor.NDims == 0) | |||||
| { | |||||
| return output; | |||||
| } | |||||
| else | |||||
| { | |||||
| return np.array(output).reshape(ndims); | |||||
| } | |||||
| } | |||||
| /// <summary> | /// <summary> | ||||
| /// If a tensor handle that is fed to a device incompatible placeholder, | /// If a tensor handle that is fed to a device incompatible placeholder, | ||||
| /// we move the tensor to the right device, generate a new tensor handle, | /// we move the tensor to the right device, generate a new tensor handle, | ||||
| @@ -36,15 +36,11 @@ Docs: https://tensorflownet.readthedocs.io</Description> | |||||
| <ItemGroup> | <ItemGroup> | ||||
| <PackageReference Include="Google.Protobuf" Version="3.6.1" /> | <PackageReference Include="Google.Protobuf" Version="3.6.1" /> | ||||
| <PackageReference Include="NumSharp" Version="0.6.3" /> | |||||
| <PackageReference Include="NumSharp" Version="0.6.4" /> | |||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <Content CopyToOutputDirectory="PreserveNewest" Include="./runtimes/win-x64/native/tensorflow.dll" Link="tensorflow.dll" Pack="true" PackagePath="runtimes/win-x64/native/tensorflow.dll" /> | <Content CopyToOutputDirectory="PreserveNewest" Include="./runtimes/win-x64/native/tensorflow.dll" Link="tensorflow.dll" Pack="true" PackagePath="runtimes/win-x64/native/tensorflow.dll" /> | ||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | |||||
| <ProjectReference Include="..\..\..\NumSharp\src\NumSharp.Core\NumSharp.Core.csproj" /> | |||||
| </ItemGroup> | |||||
| </Project> | </Project> | ||||
| @@ -10,17 +10,19 @@ namespace Tensorflow | |||||
| public Tensor _initial_value; | public Tensor _initial_value; | ||||
| public RefVariable(object initial_value, | public RefVariable(object initial_value, | ||||
| TF_DataType trainable, | |||||
| string name = "", | |||||
| TF_DataType trainable = TF_DataType.DtInvalid, | |||||
| bool validate_shape = true) : | bool validate_shape = true) : | ||||
| base(initial_value, trainable, validate_shape) | |||||
| base(initial_value, name, trainable, validate_shape) | |||||
| { | { | ||||
| _init_from_args(initial_value, trainable); | |||||
| _init_from_args(initial_value, name, trainable); | |||||
| } | } | ||||
| private void _init_from_args(object initial_value, | private void _init_from_args(object initial_value, | ||||
| TF_DataType trainable) | |||||
| string name = "", | |||||
| TF_DataType trainable = TF_DataType.DtInvalid) | |||||
| { | { | ||||
| var name = ops.name_scope("", "Variable", initial_value); | |||||
| name = ops.name_scope("", "Variable", initial_value); | |||||
| _initial_value = ops.convert_to_tensor(initial_value, name: "initial_value"); | _initial_value = ops.convert_to_tensor(initial_value, name: "initial_value"); | ||||
| } | } | ||||
| } | } | ||||
| @@ -16,7 +16,7 @@ namespace Tensorflow | |||||
| /// </summary> | /// </summary> | ||||
| public class Variable | public class Variable | ||||
| { | { | ||||
| public Variable(object initial_value, TF_DataType trainable, bool validate_shape = true) | |||||
| public Variable(object initial_value, string name = "", TF_DataType trainable = TF_DataType.DtInvalid, bool validate_shape = true) | |||||
| { | { | ||||
| } | } | ||||
| @@ -12,6 +12,14 @@ namespace Tensorflow | |||||
| { | { | ||||
| case TF_DataType.TF_INT32: | case TF_DataType.TF_INT32: | ||||
| return typeof(int); | return typeof(int); | ||||
| case TF_DataType.TF_INT16: | |||||
| return typeof(short); | |||||
| case TF_DataType.TF_FLOAT: | |||||
| return typeof(float); | |||||
| case TF_DataType.TF_DOUBLE: | |||||
| return typeof(double); | |||||
| case TF_DataType.TF_STRING: | |||||
| return typeof(string); | |||||
| default: | default: | ||||
| throw new NotImplementedException("as_numpy_datatype failed"); | throw new NotImplementedException("as_numpy_datatype failed"); | ||||
| } | } | ||||
| @@ -11,16 +11,18 @@ namespace Tensorflow | |||||
| public static partial class tf | public static partial class tf | ||||
| { | { | ||||
| public static TF_DataType int16 = TF_DataType.TF_INT16; | public static TF_DataType int16 = TF_DataType.TF_INT16; | ||||
| public static TF_DataType float16 = TF_DataType.TF_HALF; | |||||
| public static TF_DataType float32 = TF_DataType.TF_FLOAT; | public static TF_DataType float32 = TF_DataType.TF_FLOAT; | ||||
| public static TF_DataType float64 = TF_DataType.TF_DOUBLE; | |||||
| public static TF_DataType chars = TF_DataType.TF_STRING; | public static TF_DataType chars = TF_DataType.TF_STRING; | ||||
| public static Context context = new Context(); | public static Context context = new Context(); | ||||
| public static Graph g = new Graph(c_api.TF_NewGraph()); | public static Graph g = new Graph(c_api.TF_NewGraph()); | ||||
| public static object Variable<T>(T data, TF_DataType dtype = TF_DataType.DtInvalid) | |||||
| public static RefVariable Variable<T>(T data, string name = "", TF_DataType dtype = TF_DataType.DtInvalid) | |||||
| { | { | ||||
| return new RefVariable(data, dtype); | |||||
| return new RefVariable(data, name, dtype); | |||||
| } | } | ||||
| public static unsafe Tensor placeholder(TF_DataType dtype, TensorShape shape = null) | public static unsafe Tensor placeholder(TF_DataType dtype, TensorShape shape = null) | ||||
| @@ -0,0 +1,38 @@ | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Text; | |||||
| using Tensorflow; | |||||
| namespace TensorFlowNET.Examples | |||||
| { | |||||
| /// <summary> | |||||
| /// Basic introduction to TensorFlow's Eager API. | |||||
| /// https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/1_Introduction/basic_eager_api.py | |||||
| /// </summary> | |||||
| public class BasicEagerApi : IExample | |||||
| { | |||||
| private Tensor a, b, c, d; | |||||
| public void Run() | |||||
| { | |||||
| // Set Eager API | |||||
| Console.WriteLine("Setting Eager mode..."); | |||||
| tf.enable_eager_execution(); | |||||
| // Define constant tensors | |||||
| Console.WriteLine("Define constant tensors"); | |||||
| a = tf.constant(2); | |||||
| Console.WriteLine($"a = {a}"); | |||||
| b = tf.constant(3); | |||||
| Console.WriteLine($"b = {b}"); | |||||
| // Run the operation without the need for tf.Session | |||||
| Console.WriteLine("Running operations, without tf.Session"); | |||||
| c = a + b; | |||||
| Console.WriteLine($"a + b = {c}"); | |||||
| d = a * b; | |||||
| Console.WriteLine($"a * b = {d}"); | |||||
| // Full compatibility with Numpy | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -19,7 +19,7 @@ namespace TensorFlowNET.Examples | |||||
| // Basic constant operations | // Basic constant operations | ||||
| // The value returned by the constructor represents the output | // The value returned by the constructor represents the output | ||||
| // of the Constant op. | // of the Constant op. | ||||
| /*var a = tf.constant(2); | |||||
| var a = tf.constant(2); | |||||
| var b = tf.constant(3); | var b = tf.constant(3); | ||||
| // Launch the default graph. | // Launch the default graph. | ||||
| @@ -50,7 +50,7 @@ namespace TensorFlowNET.Examples | |||||
| // Run every operation with variable input | // Run every operation with variable input | ||||
| Console.WriteLine($"Addition with variables: {sess.run(add, feed_dict)}"); | Console.WriteLine($"Addition with variables: {sess.run(add, feed_dict)}"); | ||||
| Console.WriteLine($"Multiplication with variables: {sess.run(mul, feed_dict)}"); | Console.WriteLine($"Multiplication with variables: {sess.run(mul, feed_dict)}"); | ||||
| }*/ | |||||
| } | |||||
| // ---------------- | // ---------------- | ||||
| // More in details: | // More in details: | ||||
| @@ -0,0 +1,42 @@ | |||||
| using NumSharp.Core; | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Text; | |||||
| using Tensorflow; | |||||
| namespace TensorFlowNET.Examples | |||||
| { | |||||
| /// <summary> | |||||
| /// A linear regression learning algorithm example using TensorFlow library. | |||||
| /// https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/2_BasicModels/linear_regression.py | |||||
| /// </summary> | |||||
| public class LinearRegression : IExample | |||||
| { | |||||
| private NumPyRandom rng = np.random; | |||||
| public void Run() | |||||
| { | |||||
| // Parameters | |||||
| double learning_rate = 0.01; | |||||
| int training_epochs = 1000; | |||||
| int display_step = 50; | |||||
| // Training Data | |||||
| var train_X = np.array(3.3, 4.4, 5.5, 6.71, 6.93, 4.168, 9.779, 6.182, 7.59, 2.167, | |||||
| 7.042, 10.791, 5.313, 7.997, 5.654, 9.27, 3.1); | |||||
| var train_Y = np.array(1.7, 2.76, 2.09, 3.19, 1.694, 1.573, 3.366, 2.596, 2.53, 1.221, | |||||
| 2.827, 3.465, 1.65, 2.904, 2.42, 2.94, 1.3); | |||||
| var n_samples = train_X.shape[0]; | |||||
| // tf Graph Input | |||||
| var X = tf.placeholder(tf.float64); | |||||
| var Y = tf.placeholder(tf.float64); | |||||
| // Set model weights | |||||
| var W = tf.Variable(rng.randn<double>(), name: "weight"); | |||||
| var b = tf.Variable(rng.randn<double>(), name: "bias"); | |||||
| var aa = tf.multiply(X, W); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -6,11 +6,10 @@ | |||||
| </PropertyGroup> | </PropertyGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <PackageReference Include="NumSharp" Version="0.6.3" /> | |||||
| <PackageReference Include="NumSharp" Version="0.6.4" /> | |||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <ProjectReference Include="..\..\..\NumSharp\src\NumSharp.Core\NumSharp.Core.csproj" /> | |||||
| <ProjectReference Include="..\..\src\TensorFlowNET.Core\TensorFlowNET.Core.csproj" /> | <ProjectReference Include="..\..\src\TensorFlowNET.Core\TensorFlowNET.Core.csproj" /> | ||||
| </ItemGroup> | </ItemGroup> | ||||
| @@ -19,11 +19,10 @@ | |||||
| <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" /> | <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" /> | ||||
| <PackageReference Include="MSTest.TestAdapter" Version="1.4.0" /> | <PackageReference Include="MSTest.TestAdapter" Version="1.4.0" /> | ||||
| <PackageReference Include="MSTest.TestFramework" Version="1.4.0" /> | <PackageReference Include="MSTest.TestFramework" Version="1.4.0" /> | ||||
| <PackageReference Include="NumSharp" Version="0.6.3" /> | |||||
| <PackageReference Include="NumSharp" Version="0.6.4" /> | |||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <ProjectReference Include="..\..\..\NumSharp\src\NumSharp.Core\NumSharp.Core.csproj" /> | |||||
| <ProjectReference Include="..\..\src\TensorFlowNET.Core\TensorFlowNET.Core.csproj" /> | <ProjectReference Include="..\..\src\TensorFlowNET.Core\TensorFlowNET.Core.csproj" /> | ||||
| </ItemGroup> | </ItemGroup> | ||||
| @@ -12,7 +12,7 @@ namespace TensorFlowNET.UnitTest | |||||
| [TestMethod] | [TestMethod] | ||||
| public void StringVar() | public void StringVar() | ||||
| { | { | ||||
| var mammal1 = tf.Variable("Elephant", tf.chars); | |||||
| var mammal1 = tf.Variable("Elephant", "var1", tf.chars); | |||||
| var mammal2 = tf.Variable("Tiger"); | var mammal2 = tf.Variable("Tiger"); | ||||
| } | } | ||||