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)); }
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); }