一、池化的好处及具体操作

1、使用池化函数的好处

  • 大大降低特征的维数,避免过拟合
  • 可去除一些冗余信息,得到一个低分辨率的特征图
  • 使得模型更关注是否存在某些特征而不是特征的具体位置,可以容忍一些特征微小的位移

2、具体操作

  • 对输入数据体的每一个深度切片进行操作(深度保持不变)
  • 常用尺寸为 resnet 在flatten前面加一个全局平均池化层_ideresnet 在flatten前面加一个全局平均池化层_池化_02 的滤波器,步长为 resnet 在flatten前面加一个全局平均池化层_ide_03

3、常用池化操作

  • 池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。常用的池化操作有最大池化、平均池化和随机池化, 如下图所示。
  • 现在可以使用 stride convolutional layer 来代替池化层实现下采样,进而构建一个只含卷积操作的网络。
  • 使用 Global Average Pooling 来代替全连接层
  • Global Average Pooling 和 Average Pooling(Local) 的差别就在 “Global” 这个字眼上。Global 和 Local 在字面上都是用来形容 pooling 窗口区域的。Local 是取 Feature Map 的一个子区域求平均值,然后滑动;Global 显然就是对整个 Feature Map 求均值了(kernel 的大小设置成和 Feature Map 的相同)
  • 所以,有多少个 Feature Map 就可以输出多少个节点。一般可将输出的结果直接喂给 softmax 层

二、Max Pooling:计算池化区域中元素的最大值

tf.nn.max_pool(value, ksize, strides, padding, data_format='NHWC', name=None)

输入参数:

  • value: 一般为卷积后的 feature map,形状为[batch, height, width, channels] ,数据类型为 tf.float32
  • ksize: 池化窗口的大小,形状为[1, height, weight, 1],因为我们不想在batch 和 channels 上做池化,所以这两个维度设为了1
  • strides: 窗口在每一个维度上滑动的步长,形状为[1, stride, stride, 1]
  • padding: 'VALID'SAME,和卷积中的 padding 规则相同

输出:

  • 池化降维后的 feature map,数据类型为 tf.float32

三、Average Pooling:计算池化区域中元素的平均值

tf.nn.max_pool(value, ksize, strides, padding, data_format='NHWC', name=None)

输入参数:

  • 仅有输入 value 的数据类型比最大池化多了点,其它都一样
  • value: 一般为卷积后的 feature map,形状为[batch, height, width, channels] ,数据类型为 float32, float64, qint8, quint8, or qint32

输出:

  • 池化降维后的 feature map,数据类型为和 value 保持一致

四、代码示例

  • 注意 feature map 的提取及数据的视角

resnet 在flatten前面加一个全局平均池化层_ide_04


五、参考资料

1、https:///api_docs/python/tf/nn/max_pool2、https://cs231n.github.io/convolutional-networks/3、CNN的近期进展与实用技巧(上)