From c0760ff5b0950b99042e46347e506af8e3d0510f Mon Sep 17 00:00:00 2001 From: Oceania2018 Date: Mon, 29 Apr 2019 06:48:38 -0500 Subject: [PATCH] change TextClassificationWithMovieReviews to BinaryTextClassification. --- README.md | 79 +++++++++++++++--- docs/TIM.jpg | Bin 59292 -> 63093 bytes .../TensorFlowNET.Core.csproj | 2 +- test/TensorFlowNET.Examples/NeuralNetXor.cs | 2 +- ...Reviews.cs => BinaryTextClassification.cs} | 22 +++-- ...views.py => binary_text_classification.py} | 20 +---- .../ExamplesTests/ExamplesTest.cs | 2 +- 7 files changed, 87 insertions(+), 40 deletions(-) rename test/TensorFlowNET.Examples/Text/{TextClassificationWithMovieReviews.cs => BinaryTextClassification.cs} (82%) rename test/TensorFlowNET.Examples/python/{text_classification_with_movie_reviews.py => binary_text_classification.py} (85%) diff --git a/README.md b/README.md index a2a205fd..196a8f76 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Import TF.NET. using Tensorflow; ``` -Add two constants. +Add two constants: ```cs // Create a Constant op var a = tf.constant(4.0f); @@ -50,7 +50,7 @@ using (var sess = tf.Session()) } ``` -Feed placeholder. +Feed placeholder: ```cs // Create a placeholder op var a = tf.placeholder(tf.float32); @@ -59,27 +59,86 @@ var c = tf.add(a, b); using(var sess = tf.Session()) { - var feed_dict = new Dictionary(); - feed_dict.Add(a, 3.0f); - feed_dict.Add(b, 2.0f); - - var o = sess.run(c, feed_dict); + var o = sess.run(c, new FeedItem(a, 3.0f), new FeedItem(b, 2.0f)); } ``` +Linear Regression: + +```c# +// We can set a fixed init value in order to debug +var W = tf.Variable(-0.06f, name: "weight"); +var b = tf.Variable(-0.73f, name: "bias"); + +// Construct a linear model +var pred = tf.add(tf.multiply(X, W), b); + +// Mean squared error +var cost = tf.reduce_sum(tf.pow(pred - Y, 2.0f)) / (2.0f * n_samples); + +// Gradient descent +// Note, minimize() knows to modify W and b because Variable objects are trainable=True by default +var optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost); + +// Initialize the variables (i.e. assign their default value) +var init = tf.global_variables_initializer(); + +// Start training +with(tf.Session(), sess => +{ + // Run the initializer + sess.run(init); + + // Fit all training data + for (int epoch = 0; epoch < training_epochs; epoch++) + { + foreach (var (x, y) in zip(train_X, train_Y)) + sess.run(optimizer, new FeedItem(X, x), new FeedItem(Y, y)); + + // Display logs per epoch step + if ((epoch + 1) % display_step == 0) + { + var c = sess.run(cost, new FeedItem(X, train_X), new FeedItem(Y, train_Y)); + Console.WriteLine($"Epoch: {epoch + 1} cost={c} " + $"W={sess.run(W)} b={sess.run(b)}"); + } + + Console.WriteLine("Optimization Finished!"); + var training_cost = sess.run(cost, new FeedItem(X, train_X), new FeedItem(Y, train_Y)); + Console.WriteLine($"Training cost={training_cost} W={sess.run(W)} b={sess.run(b)}"); + + // Testing example + var test_X = np.array(6.83f, 4.668f, 8.9f, 7.91f, 5.7f, 8.7f, 3.1f, 2.1f); + var test_Y = np.array(1.84f, 2.273f, 3.2f, 2.831f, 2.92f, 3.24f, 1.35f, 1.03f); + Console.WriteLine("Testing... (Mean square loss Comparison)"); + + var testing_cost = sess.run(tf.reduce_sum(tf.pow(pred - Y, 2.0f)) / (2.0f * test_X.shape[0]), new FeedItem(X, test_X), new FeedItem(Y, test_Y)); + Console.WriteLine($"Testing cost={testing_cost}"); + + var diff = Math.Abs((float)training_cost - (float)testing_cost); + Console.WriteLine($"Absolute mean square loss difference: {diff}"); + } +}); +``` + + + Read the docs & book [The Definitive Guide to Tensorflow.NET](https://tensorflownet.readthedocs.io/en/latest/FrontCover.html). ### More examples: * [Hello World](test/TensorFlowNET.Examples/HelloWorld.cs) * [Basic Operations](test/TensorFlowNET.Examples/BasicOperations.cs) -* [Image Recognition](test/TensorFlowNET.Examples/ImageRecognition.cs) * [Linear Regression](test/TensorFlowNET.Examples/LinearRegression.cs) * [Logistic Regression](test/TensorFlowNET.Examples/LogisticRegression.cs) * [Nearest Neighbor](test/TensorFlowNET.Examples/NearestNeighbor.cs) +* [Naive Bayes Classification](test/TensorFlowNET.Examples/NaiveBayesClassifier.cs) +* [Image Recognition](test/TensorFlowNET.Examples/ImageRecognition.cs) +* [K-means Clustering](test/TensorFlowNET.Examples/KMeansClustering.cs) +* [NN XOR](test/TensorFlowNET.Examples/NeuralNetXor.cs) +* [Object Detection](test/TensorFlowNET.Examples/ObjectDetection.cs) * [Text Classification](test/TensorFlowNET.Examples/TextClassificationWithMovieReviews.cs) * [CNN Text Classification](test/TensorFlowNET.Examples/CnnTextClassification.cs) -* [Naive Bayes Classification](test/TensorFlowNET.Examples/NaiveBayesClassifier.cs) + * [Named Entity Recognition](test/TensorFlowNET.Examples/NamedEntityRecognition.cs) ### Contribute: @@ -94,7 +153,7 @@ You can: * Debug one of the unit tests that is marked as Ignored to get it to work (can be challenging) * Debug one of the not yet working examples and get it to work (hard) -How to debug unit tests: +### How to debug unit tests: The best way to find out why a unit test is failing is to single step it in C# and its pendant Python at the same time to see where the flow of execution digresses or where variables exhibit different values. Good Python IDEs like PyCharm let you single step into the tensorflow library code. diff --git a/docs/TIM.jpg b/docs/TIM.jpg index 448e3b6e708de1af65c98e36d2036cb25b82883e..a436aa3012058cddf3dd29148eb4e967ec7a4206 100644 GIT binary patch literal 63093 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 - + diff --git a/test/TensorFlowNET.Examples/NeuralNetXor.cs b/test/TensorFlowNET.Examples/NeuralNetXor.cs index 56dbcd14..dca0aa54 100644 --- a/test/TensorFlowNET.Examples/NeuralNetXor.cs +++ b/test/TensorFlowNET.Examples/NeuralNetXor.cs @@ -76,7 +76,7 @@ namespace TensorFlowNET.Examples var init = tf.global_variables_initializer(); float loss_value = 0; // Start tf session - with(tf.Session(graph), sess => + with(tf.Session(graph), sess => { sess.run(init); var step = 0; diff --git a/test/TensorFlowNET.Examples/Text/TextClassificationWithMovieReviews.cs b/test/TensorFlowNET.Examples/Text/BinaryTextClassification.cs similarity index 82% rename from test/TensorFlowNET.Examples/Text/TextClassificationWithMovieReviews.cs rename to test/TensorFlowNET.Examples/Text/BinaryTextClassification.cs index 2df012ac..c9a1c95a 100644 --- a/test/TensorFlowNET.Examples/Text/TextClassificationWithMovieReviews.cs +++ b/test/TensorFlowNET.Examples/Text/BinaryTextClassification.cs @@ -9,14 +9,19 @@ using NumSharp; namespace TensorFlowNET.Examples { - public class TextClassificationWithMovieReviews : Python, IExample + /// + /// This example classifies movie reviews as positive or negative using the text of the review. + /// This is a binary—or two-class—classification, an important and widely applicable kind of machine learning problem. + /// https://github.com/tensorflow/docs/blob/master/site/en/tutorials/keras/basic_text_classification.ipynb + /// + public class BinaryTextClassification : Python, IExample { public int Priority => 9; - public bool Enabled { get; set; } = false; - public string Name => "Movie Reviews"; - public bool ImportGraph { get; set; } = true; + public bool Enabled { get; set; } = true; + public string Name => "Binary Text Classification"; + public bool ImportGraph { get; set; } = true; - string dir = "text_classification_with_movie_reviews"; + string dir = "binary_text_classification"; string dataFile = "imdb.zip"; NDArray train_data, train_labels, test_data, test_labels; @@ -89,17 +94,18 @@ namespace TensorFlowNET.Examples private NDArray ReadData(string file) { var lines = File.ReadAllLines(file); - var nd = new NDArray(lines[0].StartsWith("[") ? typeof(object) : np.int32, new Shape(lines.Length)); + var nd = new NDArray(lines[0].StartsWith("[") ? typeof(string) : np.int32, new Shape(lines.Length)); if (lines[0].StartsWith("[")) { for (int i = 0; i < lines.Length; i++) { - var matches = Regex.Matches(lines[i], @"\d+\s*"); + /*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(); + nd[i] = data.ToArray();*/ + nd[i] = lines[i].Substring(1, lines[i].Length - 2).Replace(" ", string.Empty); } } else diff --git a/test/TensorFlowNET.Examples/python/text_classification_with_movie_reviews.py b/test/TensorFlowNET.Examples/python/binary_text_classification.py similarity index 85% rename from test/TensorFlowNET.Examples/python/text_classification_with_movie_reviews.py rename to test/TensorFlowNET.Examples/python/binary_text_classification.py index 42824e35..f783327c 100644 --- a/test/TensorFlowNET.Examples/python/text_classification_with_movie_reviews.py +++ b/test/TensorFlowNET.Examples/python/binary_text_classification.py @@ -71,30 +71,12 @@ partial_y_train = train_labels[10000:] history = model.fit(partial_x_train, partial_y_train, - epochs=40, + epochs=20, batch_size=512, validation_data=(x_val, y_val), verbose=1) results = model.evaluate(test_data, test_labels) - -# serialize model to JSON -model_json = model.to_json() -with open("model.json", "w") as json_file: - json_file.write(model_json) -# serialize weights to HDF5 -model.save_weights("model.h5") -print("Saved model to disk") - -# load json and create model -json_file = open('model.json', 'r') -loaded_model_json = json_file.read() -json_file.close() -loaded_model = model_from_json(loaded_model_json) -# load weights into new model -loaded_model.load_weights("model.h5") -print("Loaded model from disk") - print(results) history_dict = history.history diff --git a/test/TensorFlowNET.UnitTest/ExamplesTests/ExamplesTest.cs b/test/TensorFlowNET.UnitTest/ExamplesTests/ExamplesTest.cs index 92177dc2..b93f678b 100644 --- a/test/TensorFlowNET.UnitTest/ExamplesTests/ExamplesTest.cs +++ b/test/TensorFlowNET.UnitTest/ExamplesTests/ExamplesTest.cs @@ -105,7 +105,7 @@ namespace TensorFlowNET.ExamplesTests public void TextClassificationWithMovieReviews() { tf.Graph().as_default(); - new TextClassificationWithMovieReviews() { Enabled = true }.Run(); + new BinaryTextClassification() { Enabled = true }.Run(); } [TestMethod]