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