|
|
@@ -1,5 +1,6 @@ |
|
|
|
using Microsoft.VisualStudio.TestTools.UnitTesting; |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using Tensorflow; |
|
|
|
using Tensorflow.UnitTest; |
|
|
@@ -24,6 +25,81 @@ namespace TensorFlowNET.UnitTest.Gradient |
|
|
|
Assert.AreEqual((float)grad, 3.0f); |
|
|
|
} |
|
|
|
|
|
|
|
[Ignore] |
|
|
|
[TestMethod] |
|
|
|
public void SquaredDifference_Constant() |
|
|
|
{ |
|
|
|
// Calcute the gradient of (x1-x2)^2 |
|
|
|
// by Automatic Differentiation in Eager mode |
|
|
|
var x1 = tf.constant(7f); |
|
|
|
var x2 = tf.constant(11f); |
|
|
|
|
|
|
|
// Sanity check |
|
|
|
using (var tape = tf.GradientTape()) |
|
|
|
{ |
|
|
|
tape.watch(x2); |
|
|
|
var loss = tf.multiply((x1 - x2), (x1 - x2)); |
|
|
|
|
|
|
|
var result = tape.gradient(loss, x2); |
|
|
|
// Expected is 2*(11-7) = 8 |
|
|
|
Assert.AreEqual((float)result, 8f); |
|
|
|
} |
|
|
|
|
|
|
|
// Actual test |
|
|
|
using (var tape = tf.GradientTape()) |
|
|
|
{ |
|
|
|
tape.watch(x2); |
|
|
|
var loss = tf.squared_difference(x1, x2); |
|
|
|
|
|
|
|
// Expected is 2*(11-7) = 8 |
|
|
|
var result = tape.gradient(loss, x2); |
|
|
|
Assert.AreEqual((float)result, 8f); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
[Ignore] |
|
|
|
[TestMethod] |
|
|
|
public void SquaredDifference_1D() |
|
|
|
{ |
|
|
|
// Calcute the gradient of (x1-x2)^2 |
|
|
|
// by Automatic Differentiation in Eager mode |
|
|
|
// Expected is 2*(abs(x1-x2)) |
|
|
|
Tensor x1 = new NumSharp.NDArray( new float[] { 1, 3, 5, 21, 19, 17 }); |
|
|
|
Tensor x2 = new NumSharp.NDArray(new float[] { 29, 27, 23, 7, 11, 13 }); |
|
|
|
float[] expected = new float[] { |
|
|
|
(29-1) * 2, |
|
|
|
(27-3) * 2, |
|
|
|
(23-5) * 2, |
|
|
|
(7-21) * 2, |
|
|
|
(11-19) * 2, |
|
|
|
(13-17) * 2 |
|
|
|
}; |
|
|
|
|
|
|
|
// Sanity check |
|
|
|
using (var tape = tf.GradientTape()) |
|
|
|
{ |
|
|
|
tape.watch(x1); |
|
|
|
tape.watch(x2); |
|
|
|
var loss = tf.multiply((x1 - x2), (x1 - x2)); |
|
|
|
|
|
|
|
var result = tape.gradient(loss, x2); |
|
|
|
CollectionAssert.AreEqual(result.ToArray<float>(), expected); |
|
|
|
} |
|
|
|
|
|
|
|
// Actual test |
|
|
|
using (var tape = tf.GradientTape()) |
|
|
|
{ |
|
|
|
tape.watch(x1); |
|
|
|
tape.watch(x2); |
|
|
|
var loss = tf.squared_difference(x1, x2); |
|
|
|
|
|
|
|
var result = tape.gradient(loss, x2); |
|
|
|
CollectionAssert.AreEqual(result.ToArray<float>(), expected); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// Calcute the gradient of w * w * w |
|
|
|
/// 高阶梯度 |
|
|
|