57.4_pooling函数的实现

57.4 pooling函数的实现

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


图57-4 对输入数据展开池化应用区域( 2×22 \times 2 池化的例子)

如果以这种方式展开数据,之后只要针对展开后的矩阵求出其中每一行的最大值,将结果变形为合适的形状即可。这个过程如图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 y

pooling函数(准确来说是pooling SIMPLE函数)的实现分3步进行:①处展开输入数据,②处计算每一行的最大值,③处变换为合适的输出大小。

在计算最大值时用到了DeZero的max函数。这个max函数指定的参数可以与NumPy的np.max的参数相同。上面的代码通过指定axis参数来计算每个指定的轴上的最大值。

以上就是pooling函数的代码。从代码中可以看出,只要将输入数据展开为易于进行池化的形式,后续的实现就会变得非常简单。

步骤58

具有代表性的CNN(VGG16)

我们在上一个步骤实现了Conv2d层和pooling函数。在本步骤,我们将使用它们来实现一个著名的模型VGG16,同时使用训练后的权重进行推理。