diff --git a/src/TensorFlowNET.Keras/Engine/DataAdapters/TensorLikeDataAdapter.cs b/src/TensorFlowNET.Keras/Engine/DataAdapters/TensorLikeDataAdapter.cs index d2e47966..13f634dd 100644 --- a/src/TensorFlowNET.Keras/Engine/DataAdapters/TensorLikeDataAdapter.cs +++ b/src/TensorFlowNET.Keras/Engine/DataAdapters/TensorLikeDataAdapter.cs @@ -21,7 +21,7 @@ namespace Tensorflow.Keras.Engine.DataAdapters this.args = args; _process_tensorlike(); num_samples = args.X.shape[0]; - var batch_size = args.BatchSize; + var batch_size = args.BatchSize == -1 ? 32 : args.BatchSize; _batch_size = batch_size; _size = Convert.ToInt32(Math.Ceiling(num_samples / (batch_size + 0f))); num_full_batches = num_samples / batch_size; diff --git a/src/TensorFlowNET.Keras/Engine/Model.Evaluate.cs b/src/TensorFlowNET.Keras/Engine/Model.Evaluate.cs new file mode 100644 index 00000000..7097670c --- /dev/null +++ b/src/TensorFlowNET.Keras/Engine/Model.Evaluate.cs @@ -0,0 +1,84 @@ +using NumSharp; +using System; +using System.Collections.Generic; +using System.Linq; +using Tensorflow.Keras.ArgsDefinition; +using Tensorflow.Keras.Engine.DataAdapters; +using static Tensorflow.Binding; + +namespace Tensorflow.Keras.Engine +{ + public partial class Model + { + /// + /// Returns the loss value & metrics values for the model in test mode. + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public void evaluate(NDArray x, NDArray y, + int batch_size = -1, + int verbose = 1, + int steps = -1, + int max_queue_size = 10, + int workers = 1, + bool use_multiprocessing = false, + bool return_dict = false) + { + data_handler = new DataHandler(new DataHandlerArgs + { + X = x, + Y = y, + BatchSize = batch_size, + StepsPerEpoch = steps, + InitialEpoch = 0, + Epochs = 1, + MaxQueueSize = max_queue_size, + Workers = workers, + UseMultiprocessing = use_multiprocessing, + Model = this, + StepsPerExecution = _steps_per_execution + }); + + Console.WriteLine($"Testing..."); + foreach (var (epoch, iterator) in data_handler.enumerate_epochs()) + { + // reset_metrics(); + // callbacks.on_epoch_begin(epoch) + // data_handler.catch_stop_iteration(); + IEnumerable<(string, Tensor)> results = null; + foreach (var step in data_handler.steps()) + { + // callbacks.on_train_batch_begin(step) + results = test_function(iterator); + } + Console.WriteLine($"iterator: {epoch + 1}, " + string.Join(", ", results.Select(x => $"{x.Item1}: {(float)x.Item2}"))); + } + } + + IEnumerable<(string, Tensor)> test_function(OwnedIterator iterator) + { + var data = iterator.next(); + var outputs = test_step(data[0], data[1]); + tf_with(ops.control_dependencies(new object[0]), ctl => _test_counter.assign_add(1)); + return outputs; + } + + List<(string, Tensor)> test_step(Tensor x, Tensor y) + { + (x, y) = data_handler.DataAdapter.Expand1d(x, y); + var y_pred = Apply(x, is_training: false); + var loss = compiled_loss.Call(y, y_pred); + + compiled_metrics.update_state(y, y_pred); + + return metrics.Select(x => (x.Name, x.result())).ToList(); + } + } +} diff --git a/src/TensorFlowNET.Keras/Engine/Model.Fit.cs b/src/TensorFlowNET.Keras/Engine/Model.Fit.cs index f549e61d..526940ab 100644 --- a/src/TensorFlowNET.Keras/Engine/Model.Fit.cs +++ b/src/TensorFlowNET.Keras/Engine/Model.Fit.cs @@ -54,6 +54,7 @@ namespace Tensorflow.Keras.Engine stop_training = false; _train_counter.assign(0); bool first_step = true; + Console.WriteLine($"Training..."); foreach (var (epoch, iterator) in data_handler.enumerate_epochs()) { // reset_metrics(); diff --git a/src/TensorFlowNET.Keras/Engine/Model.Save.cs b/src/TensorFlowNET.Keras/Engine/Model.Save.cs new file mode 100644 index 00000000..58f2be1a --- /dev/null +++ b/src/TensorFlowNET.Keras/Engine/Model.Save.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using Tensorflow.Keras.Metrics; + +namespace Tensorflow.Keras.Engine +{ + public partial class Model + { + public void save(string path) + { + + } + } +} diff --git a/tensorflowlib/README.md b/tensorflowlib/README.md index a3732a8b..eb957b46 100644 --- a/tensorflowlib/README.md +++ b/tensorflowlib/README.md @@ -5,6 +5,8 @@ PM> Install-Package TensorFlow.NET PM> Install-Package SciSharp.TensorFlow.Redist ``` +Add `win-x64` to a `PropertyGroup` in your `.csproj` when targeting `.NET 472`. + ### Run in Linux Download Linux pre-built library and unzip `libtensorflow.so` and `libtensorflow_framework.so` into current running directory.