示例#1
0
        public void DropoutTest1()
        {
            const float P = 0.6f;

            Session session = new Session(false);

            Tensor x = new Tensor(null, 1024);

            x.Randomize(random);
            float xsum = x.Weights.Sum();

            Tensor y1 = NeuralOperations.Dropout(session, x, this.random, P);
            Tensor y2 = NeuralOperations.Dropout(session, x, this.random, P);

            Assert.AreEqual(P * xsum, y1.Weights.Sum(), 0.01f * xsum);
            Assert.AreEqual(P * xsum, y2.Weights.Sum(), 0.01f * xsum);

            Tensor dy1 = session.GetGradient(y1);
            Tensor dy2 = session.GetGradient(y2);

            dy1.Randomize(random);
            dy2.Randomize(random);
            session.Unroll();

            Assert.IsTrue(session.GetGradient(x).Weights.All(w => w == 0.0f));
        }
示例#2
0
        public void DropoutTest2()
        {
            const float P = 0.6f;

            Session session = new Session();

            Tensor x = new Tensor(null, new[] { 1024 });

            x.Randomize(this.random);
            float xsum = x.Weights.Sum();

            Tensor y1 = NeuralOperations.Dropout(session, x, this.random, P);
            Tensor y2 = NeuralOperations.Dropout(session, x, this.random, P);

            Assert.AreEqual(P * xsum, y1.Weights.Sum(), 0.02f * xsum);
            Assert.AreEqual(P * xsum, y2.Weights.Sum(), 0.02f * xsum);

            y1.RandomizeGradient(this.random);
            y2.RandomizeGradient(this.random);
            session.Unroll();

            Helpers.AreArraysEqual(
                y1.Length,
                y1.Weights.Take(y1.Length)
                .Zip(y1.Gradient, (yw, dyw) => yw == 0.0f ? 0.0f : dyw)
                .Zip(y2.Weights.Zip(y2.Gradient, (yw, dyw) => yw == 0.0f ? 0.0f : dyw), (a, b) => a + b)
                .ToArray(),
                x.Gradient);
        }