public void ReferenceTest() { int length = 27; { float limit = 0.5f; float[] xval = (new float[length]).Select((_, idx) => 0.1f * ((float)idx * 3 - length)).ToArray(); float norm = xval.Select((v) => v * v).Average(); float rate = (float)Math.Sqrt(limit / Math.Max(norm, limit)); float[] yval = xval.Select((v) => v * rate).ToArray(); Tensor x_tensor = new Tensor(Shape.Vector(length), xval); ParameterField x = x_tensor; (Flow flow, _) = Flow.Optimize(x); flow.Execute(); x.AddUpdater(new GradRMSClipping(x, limit)); x.Update(); AssertError.Tolerance(yval, x.GradTensor.State, 1e-7f, 1e-5f); float post_norm = x.GradTensor.State.Select((v) => v * v).Average(); Assert.AreEqual(limit, post_norm, 1e-5f); CollectionAssert.AreEqual(xval, x.ValueTensor.State); } { float limit = 1e+7f; float[] xval = (new float[length]).Select((_, idx) => 0.1f * ((float)idx * 3 - length)).ToArray(); Tensor x_tensor = new Tensor(Shape.Vector(length), xval); ParameterField x = x_tensor; (Flow flow, _) = Flow.Optimize(x); flow.Execute(); x.AddUpdater(new GradRMSClipping(x, limit)); x.Update(); AssertError.Tolerance(xval, x.GradTensor.State, 1e-7f, 1e-5f); CollectionAssert.AreEqual(xval, x.ValueTensor.State); } }
public void ReferenceTest() { int length = 27; float decay = 0.25f; float[] xval = (new float[length]).Select((_, idx) => 0.1f * ((float)idx * 3 - length)).ToArray(); float[] yval = xval.Select((v) => v * (1 - decay)).ToArray(); Tensor x_tensor = new Tensor(Shape.Vector(length), xval); ParameterField x = x_tensor; (Flow flow, _) = Flow.Optimize(x); x.AddUpdater(new Ridge(x, decay)); x.Update(); AssertError.Tolerance(yval, x_tensor.State, 1e-7f, 1e-5f); }
public void ReferenceTest() { int length = 27; float limit = 1; float[] xval = (new float[length]).Select((_, idx) => 0.1f * ((float)idx * 3 - length)).ToArray(); float[] yval = xval.Select((v) => Math.Min(Math.Max(v, -limit), limit)).ToArray(); Tensor x_tensor = new Tensor(Shape.Vector(length), xval); ParameterField x = x_tensor; (Flow flow, _) = Flow.Optimize(x); flow.Execute(); x.AddUpdater(new GradClipping(x, limit)); x.Update(); AssertError.Tolerance(yval, x.GradTensor.State, 1e-7f, 1e-5f); CollectionAssert.AreEqual(xval, x.ValueTensor.State); }
public void ReferenceTest() { int ch = 7, w = 3, h = 5, length = ch * w * h; float decay = 0.25f; float[] xval = (new float[length]).Select((_, idx) => 0.1f * ((float)idx * 3 * (idx % 5) - length)).ToArray(); float[] yval = xval.Select((v) => Math.Sign(v) * Math.Max(Math.Abs(v) - decay, 0)).ToArray(); Tensor x_tensor = new Tensor(Shape.Map2D(ch, w, h), xval); int[] axes = new int[] { Axis.Map2D.Width, Axis.Map2D.Height }; float[] pre_variance = Variance(x_tensor, axes).State; float[] pre_mean = Average(x_tensor, axes).State; ParameterField x = x_tensor; (Flow flow, _) = Flow.Optimize(x); x.AddUpdater(new ZeroMeanShift(x, axes)); x.Update(); float[] post_variance = Variance(x_tensor, axes).State; float[] post_mean = Average(x_tensor, axes).State; AssertError.Tolerance(pre_variance, post_variance, 1e-7f, 1e-5f); foreach (var v in pre_mean) { Assert.AreNotEqual(0, v, 1e-5f); } foreach (var v in post_mean) { Assert.AreEqual(0, v, 1e-5f); } }