【问题标题】:Why does the global average pooling work in ResNet?为什么全局平均池化在 ResNet 中起作用?
【发布时间】:2020-02-29 13:36:33
【问题描述】:

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

性能和我的预期一样好——93%(是的,没问题)。

但是,由于某些原因,我需要替换全局平均池化层。

我尝试了以下方法:

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

  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])
    
  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)
    
  4. 平均最后一个通道。 [-1, 128, 1, 32] --> [-1, 128],没用。 ^

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

我很困惑,为什么全局平均池可以很好地工作? 还有没有其他方法可以替代?

【问题讨论】:

    标签: python tensorflow deep-learning conv-neural-network resnet


    【解决方案1】:

    与全连接的最终层范例相比,全局平均池具有以下优势:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 2020-09-05
      • 2017-10-13
      • 2019-09-27
      • 2018-11-16
      相关资源
      最近更新 更多