这似乎是一项非常专业的操作。 最后,它涉及很多乘法和求和,例如全连接层,但尚不清楚如何或为什么我们应该将其转换为GEMM的矩阵乘法。 我将在最后讨论动机,但是这里是如何通过矩阵乘法来表示运算的。
第一步是将来自图像的输入(实际上是3D数组)转换为2D数组,我们可以将其视为矩阵。 应用每个内核的地方是图像中的一个三维三维立方体,因此我们将这些输入值的每个立方体都作为一个单列复制到矩阵中。 我相信这是im2col,用于图像到列,我相信是从原始的Matlab函数得出的,这是我如何将其可视化:
现在,如果您是像我这样的图像处理极客,那么,如果步幅小于内核大小,则在执行此转换时发生的内存大小扩展可能会让您感到震惊。 这意味着包含在重叠内核位置中的像素将在矩阵中复制,这似乎效率很低。 您必须相信我,但是浪费的好处远远超过了浪费。
现在您已经有了矩阵形式的输入图像,您可以对每个内核的权重执行相同的操作,将3D多维数据集序列化为行,作为乘法的第二个矩阵。 最终的GEMM如下所示:
“ k”是每个补丁和内核中值的数量,因此是内核宽度内核高度深度。 结果矩阵的高度为“补丁数量”列,宽为“内核数量”行。 通过将内核数维数作为深度,然后根据补丁在输入图像中的原始位置,将补丁分成行和列,随后的操作实际上将此矩阵视为3D阵列。