深度学习入门--卷积神经网络-池化层
2019-04-23 本文已影响2人
爱吃西瓜的番茄酱
池化是一种缩小空间大小的运算,池化有Max池化
和Averae池化
两种。Max池化
是取出目标区域的最大值;Averae池化
是计算目标区域的平均值。在图像识别领域,主要使用Max池化
。因此下文所提及的池化均是Max池化
。
下图是一个Max池化
处理的示意图:
这个例子中,步幅为2,所以2 x 2的窗口的移动间隔为2个元素,每次从2 x 2的区域取出最大值。
一般来说,池化的窗口大小会和步幅设定成相同的值。比如,3 x 3的窗口的步幅会设定为3;4 x 4 的窗口的步幅会设定为4。
池化层的特点:
- 没有要学习的参数: 池化知识从目标区域取出最大值或平均值,所以不存在要学习的参数。
- 通道数不会变化: 池化计算是按通道独立进行的。
- 对微小的位置变化具有鲁棒性(健壮性):输入数据发生微小的变化时,池化仍会返回相同的结果。
池化层的实现
池化层的实现和卷积层相同,都使用im2col函数
展开输入数据:
class Pooling:
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) # im2col函数的逆操作
return dx
池化层的实现按下面三个阶段进行:
- 展开输入数据
- 求各行的最大值
- 转换为合适的输出大小
每天学习一点点,每天进步一点点。