返回主目录
返回 CNN 卷积神经网络目录
上一章:深度篇—— CNN 卷积神经网络(一) 细说 cnn 卷积神经网络
下一章:深度篇—— CNN 卷积神经网络(三) 关于 ROI pooling 和 ROI Align 与 插值
本小节,细说 池化 与 反池化,下一小节细说 关于 ROI 与 插值
二. 池化层 (pooling layer)
1. 池化
(1). 池化层的目的是通过对输入图像进行二次采样以减少计算负载、内存利用率和参数数量(从而降低过拟合的风险)。减小输入图像的大小同样可以使神经网络容忍一定的图像移位(位置不变性)。池化采样法是一个高效的降维采样法。
(2). 池化层的神经元与卷积层的神经元类似,都是连接到上一层输出特征面,只是在池化层是通过池化核 (kernel) 来局部连接。同样,也必须定义池化核 (kernel) 的大小,步幅和填充类型。但是,池化神经元没有权重,它做的所有事情就是使用聚合函数 (比如 max 或 mean) 聚合输出
(3). 池化层可对提取到的特征信息进行降维,一方面特征图(feature map) 变小,简化网络计算复杂度,并在一定程度上避免过拟合的出现;一方面进行特征压缩,提取主要特征。
(4). 池化单元具有平移不变性,即使图像有小的位移,提取到的特征依然会保持不变。由于增强了对位移的鲁棒性,这样可以忽略目标的倾斜,旋转之类的相对位置的变化,以此提高精度。
(5). 池化的方法:
①. 最大池化 (max pooling)
保存池化核一个滑动窗口中的最大值,以达到降维的效果
在二维最大池化函数:
tf.nn.max_pool(value, ksize, strides, padding, name=None)
value: 为输入数据,一般池化层接在卷积层后面,所以,输入的通常是 feature map,依然是 (b, h, w, c) 这样的 shape
ksize: 为池化核窗口大小,取一个四维向量,一般是:[1, height, width, 1],因为不想在 batch 和 channels 上做池化,所以这两个维度设置为 1.
strides: 为池化核的步幅,和卷积核步幅类似,一般也是 [1, h, w, 1]
padding: 为填充,和卷积核类似,可以取 "SAME" 或 "VALID"。在 pooling 中,padding 一般选择 "VALID",因为pooling 本身就是要以丢失数据以达到降维的效果。在这基础上,再多丢一点不是很重要的边缘数据,也是在可接受范围内的。
②. 平均池化 (average pooling)
保存池化核一个滑动窗口中的数值加和后的平均值向下取整。
在二维平均池化函数:
tf.nn.avg_pool(value, ksize, strides, padding, name=None)
参数含义与 max_pool() 中的相同。
2. 反池化
(1). 反池化是池化的逆操作,是无法通过池化的结果还原出全部的原始数据的。因为池化的过程就只保留了主要信息,舍去部分信息。
(2). 如果想从池化后的这些主要信息恢复出全部信息,则存在信息缺失,这时只能通过补位来实现最大程度的信息完整。当然,如果 使用 拉普拉斯 降采样 的思路,还是可以从池化后的信息还原出全部信息的(在拉普拉斯降采样的时候,除了输入图 和 输出图,还有一个拉普拉斯矩阵图,用来记忆和恢复上采样时用的)。
(3). 池化有两种:最大池化 和 平均池化,其反池化也需要与之对应。
①. 平均池化 和 反平均池化
首先还原原来的大小,然后将池化结果中的每一个值都填入其对应原始数据区域中相应位置即可。
②. 最大池化 和 反最大池化
要求在池化过程中记录最大激活值的坐标位置,然后还原原来的大小,在反池化时,只要把池化过程中最大激活值所在位置坐标激活,其他的值设置为 0。当然,这个过程只是一种近似。因为在池化过程中,除了最大值的位置,其他的值也是不全为 0 的。
返回主目录
返回 CNN 卷积神经网络目录
上一章:深度篇—— CNN 卷积神经网络(一) 细说 cnn 卷积神经网络
下一章:深度篇—— CNN 卷积神经网络(三) 关于 ROI pooling 和 ROI Align 与 插值