From 3ea81d23e6c1c251ed9b93e0194cc009d552bee2 Mon Sep 17 00:00:00 2001 From: wangdapao666 <583087864@qq.com> Date: Wed, 8 Mar 2023 21:55:47 +0800 Subject: [PATCH 1/2] Fix model.evaluate don't have output --- .../Keras/Engine/ICallback.cs | 2 ++ .../Callbacks/CallbackList.cs | 14 +++++++- src/TensorFlowNET.Keras/Callbacks/History.cs | 23 ++++++++++--- .../Callbacks/ProgbarLogger.cs | 31 ++++++++++++++--- .../Engine/Model.Evaluate.cs | 33 ++++++++++++++++--- 5 files changed, 87 insertions(+), 16 deletions(-) diff --git a/src/TensorFlowNET.Core/Keras/Engine/ICallback.cs b/src/TensorFlowNET.Core/Keras/Engine/ICallback.cs index 1fc5fc842..07b93a75c 100644 --- a/src/TensorFlowNET.Core/Keras/Engine/ICallback.cs +++ b/src/TensorFlowNET.Core/Keras/Engine/ICallback.cs @@ -12,4 +12,6 @@ public interface ICallback void on_predict_batch_begin(long step); void on_predict_batch_end(long end_step, Dictionary logs); void on_predict_end(); + void on_test_begin(); + void on_test_batch_end(long end_step, IEnumerable<(string, Tensor)> logs); } diff --git a/src/TensorFlowNET.Keras/Callbacks/CallbackList.cs b/src/TensorFlowNET.Keras/Callbacks/CallbackList.cs index c64fd7121..ddb1fa7f5 100644 --- a/src/TensorFlowNET.Keras/Callbacks/CallbackList.cs +++ b/src/TensorFlowNET.Keras/Callbacks/CallbackList.cs @@ -20,7 +20,10 @@ public void on_train_begin() { callbacks.ForEach(x => x.on_train_begin()); } - + public void on_test_begin() + { + callbacks.ForEach(x => x.on_test_begin()); + } public void on_epoch_begin(int epoch) { callbacks.ForEach(x => x.on_epoch_begin(epoch)); @@ -60,4 +63,13 @@ public void on_predict_end() { callbacks.ForEach(x => x.on_predict_end()); } + + public void on_test_batch_begin(long step) + { + callbacks.ForEach(x => x.on_train_batch_begin(step)); + } + public void on_test_batch_end(long end_step, IEnumerable<(string, Tensor)> logs) + { + callbacks.ForEach(x => x.on_test_batch_end(end_step, logs)); + } } diff --git a/src/TensorFlowNET.Keras/Callbacks/History.cs b/src/TensorFlowNET.Keras/Callbacks/History.cs index 978cfcd54..b2d3604e2 100644 --- a/src/TensorFlowNET.Keras/Callbacks/History.cs +++ b/src/TensorFlowNET.Keras/Callbacks/History.cs @@ -18,7 +18,11 @@ public void on_train_begin() epochs = new List(); history = new Dictionary>(); } - + public void on_test_begin() + { + epochs = new List(); + history = new Dictionary>(); + } public void on_epoch_begin(int epoch) { @@ -26,7 +30,7 @@ public void on_epoch_begin(int epoch) public void on_train_batch_begin(long step) { - + } public void on_train_batch_end(long end_step, Dictionary logs) @@ -55,16 +59,25 @@ public void on_predict_begin() public void on_predict_batch_begin(long step) { - + } public void on_predict_batch_end(long end_step, Dictionary logs) { - + } public void on_predict_end() { - + + } + + public void on_test_batch_begin(long step) + { + + } + + public void on_test_batch_end(long end_step, IEnumerable<(string, Tensor)> logs) + { } } diff --git a/src/TensorFlowNET.Keras/Callbacks/ProgbarLogger.cs b/src/TensorFlowNET.Keras/Callbacks/ProgbarLogger.cs index a30c60517..6462d3d97 100644 --- a/src/TensorFlowNET.Keras/Callbacks/ProgbarLogger.cs +++ b/src/TensorFlowNET.Keras/Callbacks/ProgbarLogger.cs @@ -22,7 +22,10 @@ public void on_train_begin() _called_in_fit = true; _sw = new Stopwatch(); } - + public void on_test_begin() + { + _sw = new Stopwatch(); + } public void on_epoch_begin(int epoch) { _reset_progbar(); @@ -44,7 +47,7 @@ public void on_train_batch_end(long end_step, Dictionary logs) var progress = ""; var length = 30.0 / _parameters.Steps; for (int i = 0; i < Math.Floor(end_step * length - 1); i++) - progress += "="; + progress += "="; if (progress.Length < 28) progress += ">"; else @@ -84,17 +87,35 @@ public void on_predict_begin() public void on_predict_batch_begin(long step) { - + } public void on_predict_batch_end(long end_step, Dictionary logs) { - + } public void on_predict_end() { - + + } + + public void on_test_batch_begin(long step) + { + _sw.Restart(); } + public void on_test_batch_end(long end_step, IEnumerable<(string, Tensor)> logs) + { + _sw.Stop(); + var elapse = _sw.ElapsedMilliseconds; + var results = string.Join(" - ", logs.Select(x => $"{x.Item1}: {(float)x.Item2.numpy():F6}")); + + Binding.tf_output_redirect.Write($"{end_step + 1:D4}/{_parameters.Steps:D4} - {elapse}ms/step - {results}"); + if (!Console.IsOutputRedirected) + { + Console.CursorLeft = 0; + } + } + } } diff --git a/src/TensorFlowNET.Keras/Engine/Model.Evaluate.cs b/src/TensorFlowNET.Keras/Engine/Model.Evaluate.cs index c9d398339..8e15428eb 100644 --- a/src/TensorFlowNET.Keras/Engine/Model.Evaluate.cs +++ b/src/TensorFlowNET.Keras/Engine/Model.Evaluate.cs @@ -5,6 +5,10 @@ using Tensorflow.Keras.ArgsDefinition; using Tensorflow.Keras.Engine.DataAdapters; using static Tensorflow.Binding; +using Tensorflow.Keras.Layers; +using Tensorflow.Keras.Utils; +using Tensorflow; +using Tensorflow.Keras.Callbacks; namespace Tensorflow.Keras.Engine { @@ -31,6 +35,11 @@ public void evaluate(NDArray x, NDArray y, bool use_multiprocessing = false, bool return_dict = false) { + if (x.dims[0] != y.dims[0]) + { + throw new InvalidArgumentError( + $"The array x and y should have same value at dim 0, but got {x.dims[0]} and {y.dims[0]}"); + } var data_handler = new DataHandler(new DataHandlerArgs { X = x, @@ -46,18 +55,31 @@ public void evaluate(NDArray x, NDArray y, StepsPerExecution = _steps_per_execution }); + var callbacks = new CallbackList(new CallbackParams + { + Model = this, + Verbose = verbose, + Steps = data_handler.Inferredsteps + }); + callbacks.on_test_begin(); + foreach (var (epoch, iterator) in data_handler.enumerate_epochs()) { reset_metrics(); - // callbacks.on_epoch_begin(epoch) + //callbacks.on_epoch_begin(epoch); // data_handler.catch_stop_iteration(); - IEnumerable<(string, Tensor)> results = null; + IEnumerable<(string, Tensor)> logs = null; + foreach (var step in data_handler.steps()) { - // callbacks.on_train_batch_begin(step) - results = test_function(data_handler, iterator); + callbacks.on_train_batch_begin(step); + logs = test_function(data_handler, iterator); + var end_step = step + data_handler.StepIncrement; + callbacks.on_test_batch_end(end_step, logs); } } + GC.Collect(); + GC.WaitForPendingFinalizers(); } public KeyValuePair[] evaluate(IDatasetV2 x) @@ -75,7 +97,8 @@ public KeyValuePair[] evaluate(IDatasetV2 x) reset_metrics(); // callbacks.on_epoch_begin(epoch) // data_handler.catch_stop_iteration(); - + + foreach (var step in data_handler.steps()) { // callbacks.on_train_batch_begin(step) From 4510ade28cfc9ecb6b84848074b3634945718921 Mon Sep 17 00:00:00 2001 From: wangdapao666 <583087864@qq.com> Date: Thu, 9 Mar 2023 09:57:45 +0800 Subject: [PATCH 2/2] Fix model.evaluate don't have output --- src/TensorFlowNET.Core/Keras/Engine/ICallback.cs | 1 + src/TensorFlowNET.Keras/Engine/Model.Evaluate.cs | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/TensorFlowNET.Core/Keras/Engine/ICallback.cs b/src/TensorFlowNET.Core/Keras/Engine/ICallback.cs index 07b93a75c..296c32acb 100644 --- a/src/TensorFlowNET.Core/Keras/Engine/ICallback.cs +++ b/src/TensorFlowNET.Core/Keras/Engine/ICallback.cs @@ -13,5 +13,6 @@ public interface ICallback void on_predict_batch_end(long end_step, Dictionary logs); void on_predict_end(); void on_test_begin(); + void on_test_batch_begin(long step); void on_test_batch_end(long end_step, IEnumerable<(string, Tensor)> logs); } diff --git a/src/TensorFlowNET.Keras/Engine/Model.Evaluate.cs b/src/TensorFlowNET.Keras/Engine/Model.Evaluate.cs index 8e15428eb..5397de47b 100644 --- a/src/TensorFlowNET.Keras/Engine/Model.Evaluate.cs +++ b/src/TensorFlowNET.Keras/Engine/Model.Evaluate.cs @@ -72,12 +72,13 @@ public void evaluate(NDArray x, NDArray y, foreach (var step in data_handler.steps()) { - callbacks.on_train_batch_begin(step); + callbacks.on_test_batch_begin(step); logs = test_function(data_handler, iterator); var end_step = step + data_handler.StepIncrement; callbacks.on_test_batch_end(end_step, logs); } } + Console.WriteLine(); GC.Collect(); GC.WaitForPendingFinalizers(); }