2

我修改了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?我不禁认为这是某种卷积,但我一直无法理解卷积的样子。

4

1 回答 1

2

啊这样。对于 3x3 dK 数组,我使用 unwrap 将我的 MxN 输入数组转换为两个 MxN 列向量。然后我对两个列向量的移位子集进行 9 个点积。不,这是行不通的,因为班次是二维的。

因此,我需要创建大小为 1 x (MxN) 和 (MxN) x 9 的中间数组,其中后者的每一列都是原始的移位 MxN 窗口,其填充边界为零,大小为 1,然后执行矩阵乘法。

嗯,这需要太多的内存(有时。)所以最终的解决方案是在输出 3x3 上做一个 gfor,并且对于每个循环,做一次展开的 G 和展开的重复 V 的点积。

同意?

于 2016-04-05T17:52:46.960 回答