56.4_池化层
56.4 池化层
池化处理是缩小垂直方向和水平方向空间的操作。图56-6的例子展示了步幅为2的 的最大池化的处理过程。最大池化是取最大值的运算, 表示池化目标区域的大小。如图所示,此处从 区域取出值最大的元素。另外,在这个例子中,由于步幅被设置为2,所以 窗口的移动间隔是两个元素。一般来说,池化窗口的大小和步幅应设置为相同的值,例如 池化的步幅为3, 池化的步幅为4,以此类推。



图56-6 最大池化的处理步骤


除最大池化之外,还有平均池化。最大池化是从对象区域中取出最大值的计算,平均池化则是计算对象区域的平均值。由于在图像识别领域主要使用的是最大池化,所以本书在提到池化层时指的是最大池化。
以上就是对池化层的介绍。池化层具有以下特点
没有学习参数
与卷积层不同,池化层没有任何学习参数。这是因为池化只取对象区域中的最大值(或平均值)。
通道数量不发生变化
池化计算不改变输入数据和输出数据的通道数量。如图56-7所示,计算是按通道独立进行的。

图56-7 池化的通道数量
对微小的位置变化具有鲁棒性
对于输入数据中的微小差异,池化的结果是相同的。因此,它对输入数据的微小差异具有鲁棒性(健壮性)。例如图56-8中的 池化的情景,从中我们可以看出池化可以吸收输入数据的差异。右图中的输入数据在水平方向上移动了一个元素,但输出是相同的(结果与数据有关,有时候也会出现输出不同的情况)。

图56-8 当输入数据有微小差异时的比较

以上就是对CNN机制的介绍。前面主要探讨了卷积层和池化层。在下一个步骤,我们将把这两个处理实现为DeZero函数。
步骤57
conv2d 函数和 pooling 函数
步骤55和步骤56介绍了卷积层和池化层。如果自己从头实现卷积运算,编写出的代码将会包含多层for语句的嵌套。这样的代码很烦琐,而且在NumPy中使用for语句会使处理速度变慢。所以这里我们不使用for语句,而是使用im2col这个工具函数来实现目标。im2col是image to column的缩写,意思是从图像到列。

在DeZero中,神经网络的转换处理是以函数的形式实现的,而具有参数的层则继承于Layer类来管理参数。这里将卷积层所做的处理以conv2d(或conv2d.simple)函数的形式实现,然后实现继承于Layer类的Conv2d层。另外,由于池化层没有参数,所以我们只实现pooling函数。