public void SparseCategoricalCrossEntropyBackward2() { // arrange var probs = new Tensor(new double[, , , ] { { { { 5 }, { 2 }, { 3 }, { 1 } } }, { { { 4 }, { 8 }, { 2 }, { 5 } } } }); var truee = new Tensor(new double[, , , ] { { { { 7 }, { 2 }, { 3 }, { 3 } } }, { { { 5 }, { 9 }, { 12 }, { 13 } } } }); var expected = new double[, , , ] { { { { -2 }, { 0 }, { 0 }, { -2 } } }, { { { -1 }, { -1 }, { -10 }, { -8 } } } }; var loss = new SparseCategoricalCrossEntropy(); loss.ForwardPass(probs, truee); // act var actual = loss.BackwardPass(); // assert for (int r = 0; r < 4; r++) { Assert.Equal(expected[0, 0, r, 0], actual[0, 0, r, 0]); } }
public void SparseCategoricalCrossEntropyForward1() { // arrange var probs = new Tensor(new double[, , , ] { { { { 5 }, { 2 }, { 3 }, { 1 } } } }); var truee = new Tensor(new double[, , , ] { { { { 7 }, { 2 }, { 3 }, { 3 } } } }); var expected = -(7 * Math.Log(5) + 2 * Math.Log(2) + 3 * Math.Log(3) + 3 * Math.Log(1)); var loss = new SparseCategoricalCrossEntropy(); // act var actual = loss.ForwardPass(probs, truee); // assert Assert.Equal(expected, actual); }
public void SparseCategoricalCrossEntropyForward2() { // arrange var probs = new Tensor(new double[, , , ] { { { { 5 }, { 2 }, { 3 }, { 1 } } }, { { { 4 }, { 8 }, { 2 }, { 5 } } } }); var truee = new Tensor(new double[, , , ] { { { { 7 }, { 2 }, { 3 }, { 3 } } }, { { { 5 }, { 9 }, { 12 }, { 13 } } } }); var expected = -(7 * Math.Log(5) + 2 * Math.Log(2) + 3 * Math.Log(3) + 3 * Math.Log(1)) - (5 * Math.Log(4) + 9 * Math.Log(8) + 12 * Math.Log(2) + 13 * Math.Log(5)); expected /= 2; var loss = new SparseCategoricalCrossEntropy(); // act var actual = loss.ForwardPass(probs, truee); // assert Assert.Equal(2, probs.BatchSize); Assert.True(probs.BatchSize == truee.BatchSize); Assert.Equal(expected, actual); }