我修改了http://www.deeplearningbook.org/contents/convnets.html中的方程 9.12以使 MxN 卷积核居中。
假设 1 个输入和 1 个输出通道(为了简化),这给出了梯度的以下表达式(暂时相信它):
dK(krow, kcol) = sum(G(row, col) * V(row+krow-M/2, col+kcol-N/2); row, col)
要阅读上述内容,krow 处的 dK 的单个元素,kcol 等于 G 乘以移位 V 的乘积的所有行和列的总和。注意 G 和 V 具有相同的维度。我们将定义超出 V 以产生零。
例如,在一维上,如果G是[abcd],V是[wxyz],M是3,那么第一个和是dot (G, [0 wxy]),第二个和是dot (G, [wxyz ]),第三个和是点 (G, [xyz 0])。
ArrayFire 有移位操作,但它执行循环移位,而不是插入零的移位。此外,内核大小 MxN 通常很小,例如 7x7,因此似乎更优化的实现将只读取 G 和 V 一次,并在内核上累积。
对于该一维示例,我们将读取 a 和 w,x 并从 [a*0 aw ax] 开始。然后我们读入 b,y 并添加 [bw bx by]。然后读入 c,z 并添加 [cx cy cz]。然后读入d,最后加上[dy dz d*0]。
有没有直接的方法来计算 ArrayFire 中的 dK?我不禁认为这是某种卷积,但我一直无法理解卷积的样子。