public void 簡単なoptimizeしてみる() { var x = new Variable(Matrix <float> .Build.DenseOfArray(new float[, ] { { 1, 1, 1 } })); var constant = new Variable(Matrix <float> .Build.DenseOfArray(new float[, ] { { 1, 1, 1 } })); var target = new Variable(Matrix <float> .Build.DenseOfArray(new float[, ] { { 1, 2, 3 } })); const float lr = 0.1f; var convergence = false; for (var i = 0; i < 100; i++) { var loss = MeanSquaredError.ForwardStatic( Add.ForwardStatic(x, constant), target ); x.Grad = null; loss.Backward(); x.Value -= x.Grad * lr; if (loss.Value[0, 0] < 0.1f) { convergence = true; break; } } Assert.IsTrue(convergence); }
public void Backwardがただしい() { var x = new Variable(Matrix <float> .Build.DenseOfArray(new float[, ] { { 1, 2, 3 } })); var y = new Variable(Matrix <float> .Build.DenseOfArray(new float[, ] { { 4, -1, 0.1f } })); var result = Multiply.ForwardStatic( x, y ); var target = new Variable(Matrix <float> .Build.DenseOfArray(new float[, ] { { 0.5f, 0.5f, 0.5f } })); var loss = MeanSquaredError.ForwardStatic( result, target ); UnityEngine.Debug.Log(loss.Value); loss.Backward(); UnityEngine.Debug.Log(result.Grad); Helper.AssertMatrixAlmostEqual( x.Grad, Matrix <float> .Build.DenseOfArray(new float[, ] { { 9.33333397f, 1.66666675f, -0.01333333f } }) // chainer-python ); }
public void Backwardの式が正しい() { var x = new Variable(Matrix <float> .Build.DenseOfArray(new float[, ] { { 1, 2, 3 } })); var W = new Variable(Matrix <float> .Build.DenseOfArray(new float[, ] { { 3, 4, 3 }, { 1, 2, 3 }, { 5, 4, 1 }, })); var b = new Variable(Matrix <float> .Build.DenseOfArray(new float[, ] { { 4, 2, 1 } })); var target = new Variable(Matrix <float> .Build.DenseOfArray(new float[, ] { { 0.5f, 0.5f, 0.5f } })); var loss = MeanSquaredError.ForwardStatic( Linear.ForwardStatic(x, W, b), target ); loss.Backward(); chainer.Helper.AssertMatrixAlmostEqual( x.Grad, Matrix <float> .Build.DenseOfArray(new float[, ] { { 112.33333588f, 127.33333588f, 89f } }) ); }
public void Backardの式が正しい() { var testInput = new Variable(DenseMatrix.OfArray(new float[, ] { { 1, 2, 3 } })); var target = new Variable(DenseMatrix.OfArray(new float[, ] { { 0.5f, 0.5f, 0.5f } })); var loss = MeanSquaredError.ForwardStatic( ReLU.ForwardStatic(testInput), target ); loss.Backward(); chainer.Helper.AssertMatrixAlmostEqual( DenseMatrix.OfArray(new float[, ] { { 0.33333334f, 1f, 1.66666675f } }), // by chainer.py testInput.Grad ); }
public void Backardの式が正しい() { var testInput = new Variable(DenseMatrix.OfArray(new float[, ] { { 1, 2, 3 } })); var target = new Variable(DenseMatrix.OfArray(new float[, ] { { 0.5f, 0.5f, 0.5f } })); var loss = MeanSquaredError.ForwardStatic( Sigmoid.ForwardStatic(testInput), target ); loss.Backward(); chainer.Helper.AssertMatrixAlmostEqual( testInput.Grad, DenseMatrix.OfArray(new float[, ] { { 0.03028592f, 0.02665417f, 0.01363052f } }) // by chainer.py ); }