diff --git a/src/TensorFlowNET.Core/Train/Distribute.cs b/src/TensorFlowNET.Core/Train/Distribute.cs new file mode 100644 index 00000000..0e632998 --- /dev/null +++ b/src/TensorFlowNET.Core/Train/Distribute.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tensorflow +{ + public static class Distribute + { + public static VariableAggregationType get_loss_reduction() + { + return VariableAggregationType.MEAN; + } + } +} diff --git a/src/TensorFlowNET.Core/Train/GateGradientType.cs b/src/TensorFlowNET.Core/Train/GateGradientType.cs new file mode 100644 index 00000000..12c8a559 --- /dev/null +++ b/src/TensorFlowNET.Core/Train/GateGradientType.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tensorflow +{ + public enum GateGradientType + { + GATE_NONE = 0, + GATE_OP = 1, + GATE_GRAPH = 2 + } +} diff --git a/src/TensorFlowNET.Core/Train/GradientDescentOptimizer.cs b/src/TensorFlowNET.Core/Train/GradientDescentOptimizer.cs new file mode 100644 index 00000000..39c93e62 --- /dev/null +++ b/src/TensorFlowNET.Core/Train/GradientDescentOptimizer.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tensorflow +{ + public class GradientDescentOptimizer : Optimizer + { + public GradientDescentOptimizer(double learning_rate, bool use_locking = false, string name = "GradientDescent") + : base(learning_rate, use_locking, name) + { + LearningRate = learning_rate; + LearningRateTensor = null; + } + } +} diff --git a/src/TensorFlowNET.Core/Train/Optimizer.cs b/src/TensorFlowNET.Core/Train/Optimizer.cs new file mode 100644 index 00000000..83c2e4d9 --- /dev/null +++ b/src/TensorFlowNET.Core/Train/Optimizer.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Text; +using distribute_lib = Tensorflow.Distribute; + +namespace Tensorflow +{ + /// + /// Base class for optimizers. + /// This class defines the API to add Ops to train a model. You never use this + /// class directly, but instead instantiate one of its subclasses such as + /// `GradientDescentOptimizer`, `AdagradOptimizer`, or `MomentumOptimizer`. + /// + public abstract class Optimizer + { + public string Name { get; set; } + public double LearningRate { get; set; } + public Tensor LearningRateTensor { get; set; } + + public Optimizer(double learning_rate, bool use_locking, string name = "") + { + if (String.IsNullOrEmpty(name)) + throw new NotImplementedException("Must specify the optimizer name"); + + Name = name; + } + + /// + /// Add operations to minimize `loss` by updating `var_list` + /// + /// + /// + public Optimizer minimize(Tensor loss, GateGradientType gate_gradients = GateGradientType.GATE_OP) + { + compute_gradients(loss, gate_gradients); + return this; + } + + /// + /// Compute gradients of `loss` for the variables in `var_list`. + /// + /// + /// + public List> compute_gradients(Tensor loss, GateGradientType gate_gradients = GateGradientType.GATE_OP) + { + int num_towers = 1; + if(distribute_lib.get_loss_reduction() == VariableAggregationType.MEAN) + { + + } + + return null; + } + } +} diff --git a/src/TensorFlowNET.Core/Train/VariableAggregationType.cs b/src/TensorFlowNET.Core/Train/VariableAggregationType.cs new file mode 100644 index 00000000..4a256ae1 --- /dev/null +++ b/src/TensorFlowNET.Core/Train/VariableAggregationType.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tensorflow +{ + public enum VariableAggregationType + { + NONE = 0, + SUM = 1, + MEAN = 2, + ONLY_FIRST_TOWER = 3 + } +} diff --git a/src/TensorFlowNET.Core/Train/tf.optimizers.cs b/src/TensorFlowNET.Core/Train/tf.optimizers.cs new file mode 100644 index 00000000..00fe846b --- /dev/null +++ b/src/TensorFlowNET.Core/Train/tf.optimizers.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Tensorflow +{ + public static partial class tf + { + public static class train + { + public static Optimizer GradientDescentOptimizer(double learning_rate) + { + return new GradientDescentOptimizer(learning_rate); + } + } + } +} diff --git a/test/TensorFlowNET.Examples/LinearRegression.cs b/test/TensorFlowNET.Examples/LinearRegression.cs index 19effb6f..b4535572 100644 --- a/test/TensorFlowNET.Examples/LinearRegression.cs +++ b/test/TensorFlowNET.Examples/LinearRegression.cs @@ -47,7 +47,7 @@ namespace TensorFlowNET.Examples // radient 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); + var optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost); } } }