public void TestGradConditional() { var modT = new CondModel("modT", true); var modF = new CondModel("modF", false); var psT = modT.GetParameters(); Assert.Equal(4, psT.Length); var psF = modF.GetParameters(); Assert.Equal(4, psF.Length); var x = Float32Tensor.RandomN(new long[] { 64, 1000 }, requiresGrad: true); var y = Float32Tensor.RandomN(new long[] { 64, 10 }, requiresGrad: true); modT.Train(); var eval = modT.Forward(x); var loss = MSE(NN.Reduction.Sum); var output = loss(eval, y); modT.ZeroGrad(); output.Backward(); var gradCounts = 0; foreach (var parm in modT.GetParameters()) { var grad = parm.Grad(); gradCounts += grad.Handle == IntPtr.Zero ? 0 : 1; } Assert.Equal(2, gradCounts); //{ "grad can be implicitly created only for scalar outputs (_make_grads at ..\\..\\torch\\csrc\\autograd\\autograd.cpp:47)\n(no backtrace available)"} modF.Train(); eval = modF.Forward(x); output = loss(eval, y); modF.ZeroGrad(); output.Backward(); gradCounts = 0; foreach (var parm in modF.GetParameters()) { var grad = parm.Grad(); gradCounts += grad.Handle == IntPtr.Zero ? 0 : 1; } Assert.Equal(3, gradCounts); }
public void TestGradConditional() { var modT = new CondModel(true); var modF = new CondModel(false); var x = FloatTensor.RandomN(new long[] { 64, 1000 }, device: "cpu:0"); var y = FloatTensor.RandomN(new long[] { 64, 10 }, device: "cpu:0"); modT.Train(); var eval = modT.Forward(x); var loss = NN.LossFunction.MSE(NN.Reduction.None); var output = loss(eval, y); modT.ZeroGrad(); output.Backward(); var gradCounts = 0; foreach (var parm in modT.Parameters()) { var grad = parm.Grad(); gradCounts += grad.Handle == IntPtr.Zero ? 0 : 1; } Assert.Equal(2, gradCounts); modF.Train(); eval = modF.Forward(x); output = loss(eval, y); modF.ZeroGrad(); output.Backward(); gradCounts = 0; foreach (var parm in modF.Parameters()) { var grad = parm.Grad(); gradCounts += grad.Handle == IntPtr.Zero ? 0 : 1; } Assert.Equal(3, gradCounts); }