57.4_pooling函数的实现
57.4 pooling函数的实现
最后实现pooling函数。与conv2d.simple函数一样,这个函数也使用im2col展开输入数据。不过与卷积层不同的是,在池化时各通道方向是独立的。也就是说,池化的应用区域按通道单独展开。具体如图57-4所示。

图57-4 对输入数据展开池化应用区域( 池化的例子)
如果以这种方式展开数据,之后只要针对展开后的矩阵求出其中每一行的最大值,将结果变形为合适的形状即可。这个过程如图57-5所示。

图57-5 pooling函数的实现流程(池化应用区域中数值最大的元素用阴影表示)
以上就是pooling函数的实现流程。代码如下所示
dezero/functions_conv.py
def pooling.simple(x, kernel_size, stride=1, pad=0):
x = as_variable(x)
N, C, H, W = x.shape
KH, KW = pair(kernel_size)
PH, PW = pairPAD)
SH, SW = pair(stride)
OH = get_conv_outsize(H, KH, SH, PH)
OW = get_conv_outsize(W, KW, SW, PW)
col = im2col(x, kernel_size, stride, pad, to_matrix=True) # ①展开
col = col.reshape(-1, KH * KW)}
y = col.max(axis=1) # ②最大值
y = y.reshape(N, OH, OW, C).transpose(θ, 3, 1, 2) # ③变换
return ypooling函数(准确来说是pooling SIMPLE函数)的实现分3步进行:①处展开输入数据,②处计算每一行的最大值,③处变换为合适的输出大小。

在计算最大值时用到了DeZero的max函数。这个max函数指定的参数可以与NumPy的np.max的参数相同。上面的代码通过指定axis参数来计算每个指定的轴上的最大值。
以上就是pooling函数的代码。从代码中可以看出,只要将输入数据展开为易于进行池化的形式,后续的实现就会变得非常简单。
步骤58
具有代表性的CNN(VGG16)
我们在上一个步骤实现了Conv2d层和pooling函数。在本步骤,我们将使用它们来实现一个著名的模型VGG16,同时使用训练后的权重进行推理。