一文掌握 im2col:卷积神经网络中的计算优化技巧

im2col 是一个在计算卷积层时常用的技巧,它可以加速卷积运算。卷积运算本质上是在输入的图像或特征图上,使用一个滑动窗口逐个位置进行局部加权求和,当卷积核大小和步长比较小的时候,这个操作可能会非常耗时。im2col 这个技巧的目的是将卷积运算转化为矩阵乘法,从而利用高效的矩阵计算库来加速。

下面是 im2col 的基本步骤:

  1. 首先,选择一个卷积核的大小,比如 3x3。然后,确定步长和填充。

  2. 遍历输入图像或特征图中的每个局部区域。对于每个局部区域,将其展开成一个列向量,并将这些列向量拼接起来,形成一个大的矩阵。这个矩阵的每一列对应输入中的一个局部区域,而每一列的元素则是那个局部区域内的像素值或特征值。

  3. 将卷积核也展开成一个行向量。

  4. 利用矩阵乘法,将卷积核的行向量与之前构造的大矩阵相乘。这相当于对输入的每个局部区域执行卷积操作。

  5. 最后,将结果重新排列成输出特征图的形状。

举个例子,假设你有一个 5x5 的输入图像,使用一个 3x3 的卷积核,步长为1,不使用填充。通过 im2col,你会得到一个 9x9 的矩阵(因为有 3x3=9 个局部区域,每个区域有 3x3=9 个元素),而卷积核会被展开成一个 1x9 的行向量。通过矩阵乘法,你会得到一个 1x9 的输出向量,这个向量可以被重新排列成 3x3 的输出特征图。

需要注意的是,im2col 通常会增加内存的使用量,因为它需要存储展开后的数据。然而,由于它能够将卷积运算转化为高效的矩阵乘法,通常在计算时间上会有显著的加速。

当处理多通道图像(例如彩色图像)或者一批图像时,输入数据会是3维或4维的。在这种情况下,im2col仍然可以使用,但处理方式会有所不同。

3维情况:

对于3维输入,例如彩色图像,其维度是 (通道数, 高度, 宽度)。卷积核也是3维的,其维度是 (通道数, 卷积核高度, 卷积核宽度)。在这种情况下,im2col要考虑每个通道:

  1. 遍历输入图像的每个局部区域,并包括所有通道。对于每个局部区域,将其展开成一个列向量。所有通道的局部区域会连接在一起,形成更长的列向量。

  2. 将这些列向量拼接起来,形成一个大的矩阵。每一列对应输入的一个局部区域(包括所有通道),而每一列的元素是那个局部区域内的像素值。

  3. 将卷积核也展开成一个行向量,包括所有通道。

  4. 用矩阵乘法来执行卷积操作。

  5. 将结果重新排列成输出特征图的形状。

4维情况:

对于4维输入,比如一批图像,其维度是 (批量大小, 通道数, 高度, 宽度)。这种情况下,你会对批量中的每个图像单独执行im2col,然后将结果组合起来:

  1. 对于批量中的每个图像,执行上述3维情况中的im2col步骤。

  2. 将每个图像的结果拼接在一起,形成一个更大的矩阵。

  3. 将卷积核展开成一个行向量,包括所有通道。

  4. 使用矩阵乘法来执行卷积操作。

  5. 将结果重新排列成输出特征图的形状,包括批量维度。

这样,在3维和4维情况下,im2col允许我们将卷积操作转换为矩阵乘法,从而利用高效的矩阵计算库来加速。不过,与此同时,需要注意增加的内存使用量。