为什么全局平均池化在 ResNet 中起作用

Yon*_*ang 2 python deep-learning conv-neural-network tensorflow resnet

最近,我开始了一个关于分类的项目,使用了一个非常浅的 ResNet。该模型只有 10 次转换。层,然后在 softmax 层之前连接一个全局平均池化层。

性能符合我的预期 --- 93%(是的,没关系)。

但是,由于某些原因,我需要替换 Global avg pooling 层。

我尝试了以下方法:

(给定这一层的输入形状[-1, 128, 1, 32],tensorflow形式)

  1. 全局最大池化层。但得到了 85% 的 ACC

  2. 指数移动平均线。但得到了 12%(几乎没有用)

    split_list = tf.split(input, 128, axis=1)
    avg_pool = split_list[0]
    beta = 0.5
    for i in range(1, 128):
        avg_pool = beta*split_list[i] + (1-beta)*avg_pool
    avg_pool = tf.reshape(avg_pool, [-1,32])
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将输入分成 4 部分, avg_pool 每个部分,最后将它们连接起来。但得到了 75%

    split_shape = [32,32,32,32]
    split_list = tf.split(input, 
                          split_shape, 
                          axis=1)
    for i in range(len(split_shape)):
        split_list[i] = tf.keras.layers.GlobalMaxPooling2D()(split_list[i])
    avg_pool = tf.concat(split_list, axis=1)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 平均最后一个通道。[-1, 128, 1, 32] --> [-1, 128],没有用 ^

  5. 使用转换 具有 1 个内核的层。这样,输出形状为[-1, 128, 1, 1]。但没有用,25% 左右。

我很困惑为什么全局平均池化可以这么好?有没有其他方法可以替换它?

小智 5

全局平均池化相对于完全连接的最终层范式具有以下优势:

  1. 从模型中删除大量可训练的参数。全连接或密集层有很多参数。一个 7 x 7 x 64 的 CNN 输出被展平并送入一个 500 节点的密集层,产生 156 万个需要训练的权重。删除这些层可以加快模型的训练速度。
  2. 消除所有这些可训练参数也减少了过拟合的趋势,这需要通过使用 dropout 在完全连接的层中进行管理。
  3. 作者在原论文中认为,去除全连接分类层会迫使特征图与分类类别更密切相关——从而使每个特征图成为一种“类别置信度图”。
  4. 最后,作者还认为,由于对特征图的平均操作,这使得模型对数据中的空间转换更加鲁棒。换句话说,只要在特征图中的某处包含/或激活了必需的特征,它仍然会被平均操作“拾取”。