diff --git a/src/TensorFlowNET.Core/Binding.cs b/src/TensorFlowNET.Core/Binding.cs index 34dfbbdb..8fc8a5d4 100644 --- a/src/TensorFlowNET.Core/Binding.cs +++ b/src/TensorFlowNET.Core/Binding.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Dynamic; using System.Text; @@ -7,6 +8,7 @@ namespace Tensorflow { public static partial class Binding { + [DebuggerNonUserCode] public static tensorflow tf { get; } = New(); /// diff --git a/src/TensorFlowNET.Core/Contexts/Context.cs b/src/TensorFlowNET.Core/Contexts/Context.cs index 2234df11..bb34d209 100644 --- a/src/TensorFlowNET.Core/Contexts/Context.cs +++ b/src/TensorFlowNET.Core/Contexts/Context.cs @@ -65,6 +65,7 @@ namespace Tensorflow.Contexts /// Checks whether the current thread has eager execution enabled. /// /// + [DebuggerStepThrough] public bool executing_eagerly() => context_switches.Current().EagerMode; diff --git a/src/TensorFlowNET.Core/Keras/Engine/LossesContainer.cs b/src/TensorFlowNET.Core/Keras/Engine/LossesContainer.cs index 4db7c0b3..7e293ecc 100644 --- a/src/TensorFlowNET.Core/Keras/Engine/LossesContainer.cs +++ b/src/TensorFlowNET.Core/Keras/Engine/LossesContainer.cs @@ -16,7 +16,6 @@ namespace Tensorflow.Keras.Engine Mean _loss_metric; bool _built; Tensor[] _per_output_metrics; - List loss_values; List loss_metric_values; public LossesContainer(ILossFunc losses, string[] output_names = null) @@ -25,7 +24,6 @@ namespace Tensorflow.Keras.Engine _user_losses = losses; _losses = losses; _loss_metric = new Mean(name: "loss"); - loss_values = new List(); loss_metric_values = new List(); _built = false; } @@ -37,15 +35,17 @@ namespace Tensorflow.Keras.Engine /// public Tensor Call(Tensor y_true, Tensor y_pred) { - Build(y_pred); + if (!_built) + Build(y_pred); var loss_value = _losses.Call(y_true, y_pred); var loss_metric_value = loss_value; var batch_dim = array_ops.shape(y_true)[0]; + var loss_values = new List(); + /*if (_losses.Reduction == ReductionV2.SUM_OVER_BATCH_SIZE || _losses.Reduction == ReductionV2.AUTO) loss_value = losses_utils.scale_loss_for_distribution(loss_value);*/ - loss_values.append(loss_value); loss_metric_values.append(loss_metric_value); diff --git a/src/TensorFlowNET.Core/Keras/Optimizers/RMSprop.cs b/src/TensorFlowNET.Core/Keras/Optimizers/RMSprop.cs index 4bd43873..39cc1f4d 100644 --- a/src/TensorFlowNET.Core/Keras/Optimizers/RMSprop.cs +++ b/src/TensorFlowNET.Core/Keras/Optimizers/RMSprop.cs @@ -11,6 +11,8 @@ namespace Tensorflow.Keras.Optimizers public class RMSprop : OptimizerV2 { RMSpropArgs args; + bool centered => args.Centered; + protected override string _name => "RMSprop"; public RMSprop(RMSpropArgs args) : base(args) { @@ -18,5 +20,60 @@ namespace Tensorflow.Keras.Optimizers _set_hyper("rho", args.RHO); _set_hyper("momentum", args.Momentum); } + + protected override void _create_slots(IVariableV1[] var_list) + { + foreach (var var in var_list) + add_slot(var, "rms"); + if (_momentum) + foreach (var var in var_list) + add_slot(var, "momentum"); + if (centered) + foreach (var var in var_list) + add_slot(var, "mg"); + } + + protected override void _prepare_local(DeviceDType device_dtype, Dictionary> _apply_state) + { + base._prepare_local(device_dtype, _apply_state); + var rho = array_ops.identity(_get_hyper("rho", device_dtype.DType)); + _apply_state[device_dtype]["neg_lr_t"] = -_apply_state[device_dtype]["lr_t"]; + _apply_state[device_dtype]["epsilon"] = ops.convert_to_tensor(args.Epsilon, dtype: device_dtype.DType); + _apply_state[device_dtype]["rho"] = rho; + _apply_state[device_dtype]["momentum"] = array_ops.identity(_get_hyper("momentum", device_dtype.DType)); + _apply_state[device_dtype]["one_minus_rho"] = 1.0f - rho; + } + + protected override Operation _resource_apply_dense(IVariableV1 var, Tensor grad, Dictionary> _apply_state) + { + Dictionary coefficients = null; + foreach (var state in _apply_state) + { + if (state.Key.DType == var.dtype.as_base_dtype() + && state.Key.Device == var.Device) + { + coefficients = state.Value; + break; + } + } + + var rms = get_slot(var, "rms"); + if (_momentum) + { + throw new NotImplementedException(""); + } + else + { + var rms_t = coefficients["rho"] * rms.AsTensor() + coefficients["one_minus_rho"] * math_ops.square(grad); + rms_t = state_ops.assign(rms, rms_t, use_locking: _use_locking); + var denom_t = rms_t; + if (centered) + { + throw new NotImplementedException(""); + } + var var_t = var.AsTensor() - coefficients["lr_t"] * grad / (math_ops.sqrt(denom_t) + coefficients["epsilon"]); + return state_ops.assign(var, var_t, use_locking: _use_locking).op; + } + } } } diff --git a/src/TensorFlowNET.Core/Tensorflow.Binding.csproj b/src/TensorFlowNET.Core/Tensorflow.Binding.csproj index 76e80fe5..3e881153 100644 --- a/src/TensorFlowNET.Core/Tensorflow.Binding.csproj +++ b/src/TensorFlowNET.Core/Tensorflow.Binding.csproj @@ -25,7 +25,11 @@ https://tensorflownet.readthedocs.io * Eager Mode is added finally. * tf.keras is partially working. * tf.data is added. -* autograph works partially. +* autograph works partially. + +TensorFlow .NET v0.30 is focused on making more Keras API work including: +* tf.keras.datasets +* Building keras model in subclass, functional and sequential api 0.30.0.0 LICENSE true diff --git a/src/TensorFlowNET.Core/Tensors/Tensor.cs b/src/TensorFlowNET.Core/Tensors/Tensor.cs index 092756db..e6586f26 100644 --- a/src/TensorFlowNET.Core/Tensors/Tensor.cs +++ b/src/TensorFlowNET.Core/Tensors/Tensor.cs @@ -58,7 +58,7 @@ namespace Tensorflow /// The Operation that produces this tensor as an output. /// public Operation op => _op; - public Tensor[] outputs => op.outputs; + public Tensor[] outputs => op?.outputs; /// /// The string name of this tensor.