CNN中处理的是4维数据,因此卷积运算的实现看上去会很复杂,但是通过使用下面要介绍的 im2col (image to column)这个技巧,问题就会变得很简单。

im2col 是一个函数,将输入数据展开以适合滤波器(权重)。如图7-17所示,对3维的输入数据应用 im2col 后,数据转换为2维矩阵。

如图7-18所示,对于输入数据,将应用滤波器的区域(3维方块)横向展开为1列。 im2col 会

在所有应用滤波器的地方进行这个展开处理。

在图7-18中,为了便于观察,将步幅设置得很大,以使滤波器的应用区域不重叠。而在实际的卷积运算中,滤波器的应用区域几乎都是重叠的。在滤波器的应用区域重叠的情况下,使用 im2col 展开后,展开后的元素个数会多于原方块的元素个数。因此,使用 im2col 的实现存在比普通的实现消耗更多内存的缺点。

使用 im2col 展开输入数据后,之后就只需将卷积层的滤波器(权重)纵向展开为1列,并计算2个矩阵的乘积即可(参照图7-19)。

如图7-19所示,基于 im2col 方式的输出结果是2维矩阵。因为CNN中数据会保存为4维数组,所以要将2维输出数据转换为合适的形状。以上就是卷积层的实现流程。

池化层的实现和卷积层相同,都使用 im2col 展开输入数据。不过,池化的情况下,在通道方向上是独立的,这一点和卷积层不同。具体地讲,如图7-21所示,池化的应用区域按通道单独展开。

展开之后,只需对展开的矩阵求各行的最大值,并转换为合适的形状即可(图7-22)。

如图7-22所示,池化层的实现按下面3个阶段进行。

1.展开输入数据。

2.求各行的最大值。

3.转换为合适的输出大小