池化层(Pooling)的实现

池化层的实现与卷积层类似,都使用im2col函数来处理展开输入数据,区别在于,池化层在通道方向上是独立的。
————————————————————————————————
下面对(2X2的池化层)例子进行描述
在这里插入图片描述
在这里插入图片描述
用图片描述,清晰易懂。
代码实现如下:

class Pooling:
#1.展开输入数据。
#2.求各行的最大值。
#3.转换为合适的输出大小。
    def __init__(self, pool_h, pool_w, stride=1, pad=0):
        self.pool_h = pool_h
        self.pool_w = pool_w
        self.stride = stride
        self.pad = pad
        
        self.x = None
        self.arg_max = None

    def forward(self, x):
        N, C, H, W = x.shape
        out_h = int(1 + (H - self.pool_h) / self.stride)
        out_w = int(1 + (W - self.pool_w) / self.stride)

        col = im2col(x, self.pool_h, self.pool_w, self.stride, self.pad)
        col = col.reshape(-1, self.pool_h*self.pool_w)

        arg_max = np.argmax(col, axis=1)
        out = np.max(col, axis=1)
        out = out.reshape(N, out_h, out_w, C).transpose(0, 3, 1, 2)

        self.x = x
        self.arg_max = arg_max

        return out

    def backward(self, dout):
        dout = dout.transpose(0, 2, 3, 1)
        
        pool_size = self.pool_h * self.pool_w
        dmax = np.zeros((dout.size, pool_size))
        dmax[np.arange(self.arg_max.size), self.arg_max.flatten()] = dout.flatten()
        dmax = dmax.reshape(dout.shape + (pool_size,)) 
        
        dcol = dmax.reshape(dmax.shape[0] * dmax.shape[1] * dmax.shape[2], -1)
        dx = col2im(dcol, self.x.shape, self.pool_h, self.pool_w, self.stride, self.pad)
        
        return dx

池化层的反向传播可以参考ReLU层实现max的反向传播。

参考

《深度学习入门:基于Python的理论与实现 》 斋藤康毅


版权声明:本文为m0_46462695原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。