using Microsoft.VisualStudio.TestTools.UnitTesting; using Tensorflow; using static Tensorflow.Binding; namespace TensorFlowNET.UnitTest.ManagedAPI { [TestClass] public class GradientTest { [TestMethod] public void GradientFloatTest() { var x = tf.Variable(3.0, dtype: tf.float32); using var tape = tf.GradientTape(); var y = tf.square(x); var y_grad = tape.gradient(y, x); Assert.AreEqual(9.0f, (float)y); } [TestMethod] public void GradientDefaultTest() { var x = tf.Variable(3.0); using var tape = tf.GradientTape(); var y = tf.square(x); var y_grad = tape.gradient(y, x); Assert.AreEqual(9.0, (double)y); } [TestMethod] public void GradientDoubleTest() { var x = tf.Variable(3.0, dtype: tf.float64); using var tape = tf.GradientTape(); var y = tf.square(x); var y_grad = tape.gradient(y, x); Assert.AreEqual(9.0, (double)y); } [TestMethod] public void GradientOperatorMulTest() { var x = tf.constant(0f); var w = tf.Variable(new float[] { 1, 1 }); using var gt = tf.GradientTape(); var y = x * w; var gr = gt.gradient(y, w); Assert.AreEqual(new float[] { 0, 0 }, gr.numpy()); } [TestMethod] public void GradientSliceTest() { var X = tf.zeros(10); var W = tf.Variable(-0.06f, name: "weight"); var b = tf.Variable(-0.73f, name: "bias"); using var g = tf.GradientTape(); var pred = W * X + b; var test = tf.slice(pred, new[] { 0 }, pred.shape); var gradients = g.gradient(test, (W, b)); Assert.AreEqual((float)gradients.Item1, 0f); Assert.AreEqual((float)gradients.Item2, 10f); } [TestMethod] public void GradientConcatTest() { var X = tf.zeros(10); var W = tf.Variable(-0.06f, name: "weight"); var b = tf.Variable(-0.73f, name: "bias"); var test = tf.concat(new Tensor[] { W, b }, 0); using var g = tf.GradientTape(); var pred = test[0] * X + test[1]; var gradients = g.gradient(pred, (W, b)); Assert.IsNull(gradients.Item1); Assert.IsNull(gradients.Item2); } } }