Esempio n. 1
0
            public void CrossEntropyTest()
            {
                var actual   = new Matrix(4, 1);
                var expected = new Matrix(4, 1);

                actual.InRandomize();
                expected.InRandomize();

                var autoErr = new CrossEntropy().Evaluate(actual, expected);
                var error   = 0.0;

                for (var i = 0; i < actual.Rows; i++)
                {
                    for (var j = 0; j < actual.Columns; j++)
                    {
                        error += -expected[i, j] * Math.Log(actual[i, j]) - (1.0 - expected[i, j]) * Math.Log(1.0 - actual[i, j] + double.Epsilon);
                    }
                }
                error /= actual.Rows * actual.Columns;
                Assert.IsTrue(Math.Abs(error - autoErr) < 0.01, new CrossEntropy().Type().ToString() + " Forward!");

                var autoDErr = new CrossEntropy().Backward(actual, expected);
                var dErr     = (actual - expected).HadamardDivision(actual.Hadamard(actual) - (actual + actual.Fill(double.Epsilon)));

                Assert.IsTrue(Math.Abs(dErr.FrobeniusNorm() - autoDErr.FrobeniusNorm()) < 0.01, new CrossEntropy().Type().ToString() + " Backward!");
            }