コード例 #1
0
        public void ConvolveGradientBatch()
        {
            // 3x3x3x2
            var input = new Single.Volume(new float[27 * 2].Populate(1.0f), new Shape(3, 3, 3, 2),
                                          GpuContext.Default);

            // 2x2x3x2
            var filter = new Single.Volume(
                new float[12].Populate(1.0f).Concat(new float[12].Populate(2.0f)).ToArray(),
                new Shape(2, 2, 3, 2),
                GpuContext.Default);

            var outputGradient = new Single.Volume(new[]
            {
                2.0f, 3.0f,
                4.0f, 5.0f
            }, new Shape(1, 1, 2, 2),
                                                   GpuContext.Default);

            var inputGradient = BuilderInstance <float> .Volume.SameAs(input.Storage, input.Shape);

            var filterGradient = BuilderInstance <float> .Volume.SameAs(filter.Storage, filter.Shape);

            input.ConvolveGradient(filter, outputGradient, inputGradient, filterGradient, 0, 2);

            // input gradient
            Assert.AreEqual(8.0f, inputGradient.Get(0, 0, 0, 0));
            Assert.AreEqual(0f, inputGradient.Get(2, 2, 2, 0));
            Assert.AreEqual(0f, inputGradient.Get(2, 2, 1, 0));
            Assert.AreEqual(14.0f, inputGradient.Get(0, 0, 0, 1));
            Assert.AreEqual(0.0f, inputGradient.Get(2, 2, 2, 1));
            Assert.AreEqual(0.0f, inputGradient.Get(2, 2, 1, 1));

            // filter gradient
            Assert.AreEqual(1.0f, filter.Get(0, 0, 0, 0));
            Assert.AreEqual(1.0f, filter.Get(0, 0, 1, 0));
            Assert.AreEqual(1.0f, filter.Get(0, 0, 2, 0));
            Assert.AreEqual(2.0f, filter.Get(0, 0, 0, 1));
            Assert.AreEqual(2.0f, filter.Get(0, 0, 1, 1));
            Assert.AreEqual(2.0f, filter.Get(0, 0, 2, 1));
        }