コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
            }
        }