| @@ -13,7 +13,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TensorFlowNET.Utility", "sr | |||||
| EndProject | EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TensorFlowNET.Visualization", "TensorFlowNET.Visualization\TensorFlowNET.Visualization.csproj", "{4BB2ABD1-635E-41E4-B534-CB5B6A2D754D}" | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TensorFlowNET.Visualization", "TensorFlowNET.Visualization\TensorFlowNET.Visualization.csproj", "{4BB2ABD1-635E-41E4-B534-CB5B6A2D754D}" | ||||
| EndProject | EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KerasNET.Core", "..\Keras.NET\src\KerasNET.Core\KerasNET.Core.csproj", "{E2F0C39C-D706-4CF5-AE00-81FB447F949D}" | |||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NumSharp.Core", "..\NumSharp\src\NumSharp.Core\NumSharp.Core.csproj", "{0AB4662E-7E3C-455F-BF0C-23D56CBE74F3}" | |||||
| EndProject | EndProject | ||||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NumSharp.Core", "..\NumSharp\src\NumSharp.Core\NumSharp.Core.csproj", "{62360571-D1F7-473C-B81F-F03CA59E37DD}" | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NumSharp.Core", "..\NumSharp\src\NumSharp.Core\NumSharp.Core.csproj", "{62360571-D1F7-473C-B81F-F03CA59E37DD}" | ||||
| EndProject | EndProject | ||||
| @@ -0,0 +1,15 @@ | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Text; | |||||
| using Tensorflow.Keras; | |||||
| using Tensorflow.Keras.Engine; | |||||
| namespace Tensorflow | |||||
| { | |||||
| public static partial class keras | |||||
| { | |||||
| public static Preprocessing preprocessing => new Preprocessing(); | |||||
| public static Sequence sequence = new Sequence(); | |||||
| public static Sequential Sequential() => new Sequential(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,17 @@ | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Text; | |||||
| namespace Tensorflow.Keras.Engine | |||||
| { | |||||
| /// <summary> | |||||
| /// Base layer class. | |||||
| /// A layer is a class implementing common neural networks operations, such | |||||
| /// as convolution, batch norm, etc. These operations require managing weights, | |||||
| /// losses, updates, and inter-layer connectivity. | |||||
| /// </summary> | |||||
| public class Layer : CheckpointableBase | |||||
| { | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,10 @@ | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Text; | |||||
| namespace Tensorflow.Keras.Engine | |||||
| { | |||||
| internal class Model : Network | |||||
| { | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,10 @@ | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Text; | |||||
| namespace Tensorflow.Keras.Engine | |||||
| { | |||||
| public class Network : Layer | |||||
| { | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,24 @@ | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Text; | |||||
| namespace Tensorflow.Keras.Engine | |||||
| { | |||||
| public class Sequential : Network, IPython | |||||
| { | |||||
| public void Dispose() | |||||
| { | |||||
| throw new NotImplementedException(); | |||||
| } | |||||
| public void __enter__() | |||||
| { | |||||
| throw new NotImplementedException(); | |||||
| } | |||||
| public void __exit__() | |||||
| { | |||||
| throw new NotImplementedException(); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,11 @@ | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Text; | |||||
| namespace Tensorflow.Keras | |||||
| { | |||||
| public class Preprocessing | |||||
| { | |||||
| public Sequence sequence => new Sequence(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,77 @@ | |||||
| using NumSharp.Core; | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Linq; | |||||
| using System.Text; | |||||
| using System.Text.RegularExpressions; | |||||
| using System.Threading.Tasks; | |||||
| namespace Tensorflow.Keras | |||||
| { | |||||
| public class Sequence | |||||
| { | |||||
| /// <summary> | |||||
| /// Pads sequences to the same length. | |||||
| /// https://keras.io/preprocessing/sequence/ | |||||
| /// https://faroit.github.io/keras-docs/1.2.0/preprocessing/sequence/ | |||||
| /// </summary> | |||||
| /// <param name="sequences">List of lists, where each element is a sequence.</param> | |||||
| /// <param name="maxlen">Int, maximum length of all sequences.</param> | |||||
| /// <param name="dtype">Type of the output sequences.</param> | |||||
| /// <param name="padding">String, 'pre' or 'post':</param> | |||||
| /// <param name="truncating">String, 'pre' or 'post'</param> | |||||
| /// <param name="value">Float or String, padding value.</param> | |||||
| /// <returns></returns> | |||||
| public NDArray pad_sequences(NDArray sequences, | |||||
| int? maxlen = null, | |||||
| string dtype = "int32", | |||||
| string padding = "pre", | |||||
| string truncating = "pre", | |||||
| object value = null) | |||||
| { | |||||
| int[] length = new int[sequences.size]; | |||||
| switch (sequences.dtype.Name) | |||||
| { | |||||
| case "Object": | |||||
| for (int i = 0; i < sequences.size; i++) | |||||
| { | |||||
| switch (sequences.Data<object>(i)) | |||||
| { | |||||
| case string data: | |||||
| length[i] = Regex.Matches(data, ",").Count; | |||||
| break; | |||||
| } | |||||
| } | |||||
| break; | |||||
| case "Int32": | |||||
| for (int i = 0; i < sequences.size; i++) | |||||
| length[i] = Regex.Matches(sequences.Data<object>(i).ToString(), ",").Count; | |||||
| break; | |||||
| default: | |||||
| throw new NotImplementedException($"pad_sequences: {sequences.dtype.Name}"); | |||||
| } | |||||
| if (maxlen == null) | |||||
| maxlen = length.Max(); | |||||
| if (value == null) | |||||
| value = 0f; | |||||
| var nd = new NDArray(np.int32, new Shape(sequences.size, maxlen.Value)); | |||||
| for (int i = 0; i < nd.shape[0]; i++) | |||||
| { | |||||
| switch(sequences[i]) | |||||
| { | |||||
| case int[] data: | |||||
| for (int j = 0; j < nd.shape[1]; j++) | |||||
| nd[i, j] = j < data.Length ? data[j] : value; | |||||
| break; | |||||
| default: | |||||
| throw new NotImplementedException("pad_sequences"); | |||||
| } | |||||
| } | |||||
| return nd; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -52,7 +52,7 @@ Docs: https://tensorflownet.readthedocs.io</Description> | |||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <Folder Include="APIs\Keras\" /> | |||||
| <ProjectReference Include="..\..\..\NumSharp\src\NumSharp.Core\NumSharp.Core.csproj" /> | |||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| @@ -0,0 +1,10 @@ | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Text; | |||||
| namespace Tensorflow | |||||
| { | |||||
| public class CheckpointableBase | |||||
| { | |||||
| } | |||||
| } | |||||
| @@ -11,7 +11,6 @@ | |||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <ProjectReference Include="..\..\..\Keras.NET\src\KerasNET.Core\KerasNET.Core.csproj" /> | |||||
| <ProjectReference Include="..\..\..\NumSharp\src\NumSharp.Core\NumSharp.Core.csproj" /> | <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" /> | ||||
| <ProjectReference Include="..\..\src\TensorFlowNET.Utility\TensorFlowNET.Utility.csproj" /> | <ProjectReference Include="..\..\src\TensorFlowNET.Utility\TensorFlowNET.Utility.csproj" /> | ||||
| @@ -1,12 +1,10 @@ | |||||
| using System; | using System; | ||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||
| using System.IO; | using System.IO; | ||||
| using System.Text; | |||||
| using Tensorflow; | using Tensorflow; | ||||
| using NumSharp.Core; | using NumSharp.Core; | ||||
| using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
| using System.Linq; | using System.Linq; | ||||
| using Keras; | |||||
| using System.Text.RegularExpressions; | using System.Text.RegularExpressions; | ||||
| namespace TensorFlowNET.Examples | namespace TensorFlowNET.Examples | ||||
| @@ -24,11 +22,21 @@ namespace TensorFlowNET.Examples | |||||
| // A dictionary mapping words to an integer index | // A dictionary mapping words to an integer index | ||||
| var word_index = GetWordIndex(); | var word_index = GetWordIndex(); | ||||
| train_data = keras.preprocessing.sequence.pad_sequences(train_data, | train_data = keras.preprocessing.sequence.pad_sequences(train_data, | ||||
| value: word_index["<PAD>"], | value: word_index["<PAD>"], | ||||
| padding: "post", | padding: "post", | ||||
| maxlen: 256); | maxlen: 256); | ||||
| test_data = keras.preprocessing.sequence.pad_sequences(test_data, | |||||
| value: word_index["<PAD>"], | |||||
| padding: "post", | |||||
| maxlen: 256); | |||||
| // input shape is the vocabulary count used for the movie reviews (10,000 words) | |||||
| int vocab_size = 10000; | |||||
| var model = keras.Sequential(); | |||||
| } | } | ||||
| private ((NDArray, NDArray), (NDArray, NDArray)) PrepareData() | private ((NDArray, NDArray), (NDArray, NDArray)) PrepareData() | ||||
| @@ -46,42 +54,48 @@ namespace TensorFlowNET.Examples | |||||
| var x_train = ReadData(Path.Join(dir, "x_train.txt")); | var x_train = ReadData(Path.Join(dir, "x_train.txt")); | ||||
| var labels_train = ReadData(Path.Join(dir, "y_train.txt")); | var labels_train = ReadData(Path.Join(dir, "y_train.txt")); | ||||
| var indices_train = ReadData(Path.Join(dir, "indices_train.txt")); | var indices_train = ReadData(Path.Join(dir, "indices_train.txt")); | ||||
| // x_train = x_train[indices_train]; | |||||
| // labels_train = labels_train[indices_train]; | |||||
| x_train = x_train[indices_train]; | |||||
| labels_train = labels_train[indices_train]; | |||||
| var x_test = ReadData(Path.Join(dir, "x_test.txt")); | var x_test = ReadData(Path.Join(dir, "x_test.txt")); | ||||
| var labels_test = ReadData(Path.Join(dir, "y_test.txt")); | var labels_test = ReadData(Path.Join(dir, "y_test.txt")); | ||||
| var indices_test = ReadData(Path.Join(dir, "indices_test.txt")); | var indices_test = ReadData(Path.Join(dir, "indices_test.txt")); | ||||
| // x_test = x_test[indices_test]; | |||||
| // labels_test = labels_test[indices_test]; | |||||
| x_test = x_test[indices_test]; | |||||
| labels_test = labels_test[indices_test]; | |||||
| // not completed | // not completed | ||||
| /*var xs = x_train.hstack(x_test); | |||||
| var xs = x_train.hstack(x_test); | |||||
| var labels = labels_train.hstack(labels_test); | var labels = labels_train.hstack(labels_test); | ||||
| var idx = x_train.size; | var idx = x_train.size; | ||||
| var y_train = labels_train; | var y_train = labels_train; | ||||
| var y_test = labels_test; | var y_test = labels_test; | ||||
| return ((x_train, y_train), (x_test, y_test));*/ | |||||
| throw new NotImplementedException(); | |||||
| return ((x_train, y_train), (x_test, y_test)); | |||||
| } | } | ||||
| private int[][] ReadData(string file) | |||||
| private NDArray ReadData(string file) | |||||
| { | { | ||||
| var lines = new List<int[]>(); | |||||
| var lines = File.ReadAllLines(file); | |||||
| var nd = new NDArray(lines[0].StartsWith("[") ? typeof(object) : np.int32, new Shape(lines.Length)); | |||||
| foreach(var line in File.ReadAllLines(file)) | |||||
| if (lines[0].StartsWith("[")) | |||||
| { | { | ||||
| var matches = Regex.Matches(line, @"\d+,*"); | |||||
| var data = new int[matches.Count]; | |||||
| for (int i = 0; i < data.Length; i++) | |||||
| data[i] = Convert.ToInt32(matches[i].Value.Trim(',')); | |||||
| lines.Add(data.ToArray()); | |||||
| for (int i = 0; i < lines.Length; i++) | |||||
| { | |||||
| var matches = Regex.Matches(lines[i], @"\d+\s*"); | |||||
| var data = new int[matches.Count]; | |||||
| for (int j = 0; j < data.Length; j++) | |||||
| data[j] = Convert.ToInt32(matches[j].Value); | |||||
| nd[i] = data.ToArray(); | |||||
| } | |||||
| } | } | ||||
| return lines.ToArray(); | |||||
| else | |||||
| { | |||||
| for (int i = 0; i < lines.Length; i++) | |||||
| nd[i] = Convert.ToInt32(lines[i]); | |||||
| } | |||||
| return nd; | |||||
| } | } | ||||
| private Dictionary<string, int> GetWordIndex() | private Dictionary<string, int> GetWordIndex() | ||||