我正在玩卷积网络,在 AlexNet 和 ResNet 之间组装一些东西。不是很深,大约 10 次转化。层包括 2 个通过残差连接,最后是 3 个全连接层。Relu 激活,但也尝试了 ELU 和 sigmoid。在 25 个类中取得了很好的结果(top-1 准确率高达 80%),现在在 ImageNet 上尝试了 1000 个类。我得到的往往是接近随机质量的选择(即 1000 个类的准确度为 0.1% 和相应的损失)或提高到 0.5% 的准确度然后回落。
这发生在推荐的 Adam 学习率为 0.001,略小一点,2e-4,以及更小的 l 时。费率,例如 1e-5。有什么奇怪的,带小l。与预期的缓慢但可靠的学习相比,评价一切都更加丑陋。
我发现从中级开始的激活开始减少很多。所以不同的频道看起来像
如果我们通过 epoch 绘制通道的 min-max 变化,我们将看到 这是针对两个不同的图像,虚线和右轴 - 激活的标准偏差。相应的火车损失改善和恶化在这里模糊可见,蓝线:
这是什么?渐变消失?网络太深?批量规范化不应该与之抗争吗?解决方案是什么,不断调整学习率?
一切都发生得很快。我使用 mini-epochs,每个 20000 张图像,所以我的地块上的 1 实际上是正常 epoch 的 1/60。
我能够在 110 个类上训练 4 倍宽的网络变体,获得 42% 的准确率,看起来很合理。在那里我没有看到这么大的下降。没有注意到 SGD 和不同批次大小的改进,但注意到没有增强学习会更快,更不容易出现这个问题。
更新:我能够在较小的网络上重现它:)。它在学习率 5e-4 和批处理 64 下学习得很好,然后是 2e-4,然后在 lr 1-e4 和 384 或更大的批处理上学习得不多,或者在 5e-5 或更少的 lr 下快速降级。我没有提到我使用的技巧之一:挤压和激发。所以它显然会导致大规模的激活变化。并且确实存在按 10-50 顺序激活的激发层,即使一切看起来都很好。现在由于某种原因试图与此作斗争而没有成功。我添加了
def near1Regularizer(activationVector): # <----
return 0.01 * K.mean((1 - activationVector) ** 2)
…
se_feature = Dense(channel // ratio,
activation='relu',
name='dense_exc_%d' % (g_excLayerCount * 2 - 1),
# kernel_initializer='he_normal',
kernel_initializer=My1PlusInitializer(1.0 / 256),
use_bias=True,
bias_initializer='zeros')(se_feature)
assert se_feature._keras_shape[1:] == (1,1,channel//ratio)
se_feature = Dense(channel,
activation='sigmoid',
name='dense_exc_%d' % (g_excLayerCount * 2),
kernel_initializer='he_normal',
use_bias=True,
bias_initializer='zeros',
activity_regularizer=near1Regularizer)(se_feature) # <----
se_feature = keras.layers.multiply([input_feature, se_feature])
并得到
x 在 90 附近应用正则化。在十几个小时代之后,错误也开始增加......
更新 2:在更简单和更小的网络(3 个带有挤压和激励的卷积块和 3 个密集块)和小型 AlexNet(1/16 宽和 110 个类)上重现。非常令人惊讶的是,100 左右的卷积层激活非常典型,即使在预训练的完整 AlexNet 中也存在。