为什么验证准确率在每个时期都会波动?

问题描述 投票:0回答:3

我正在尝试从枪口图像构建牛识别模型。我有一个包含 268 头牛的 4923 张图像的数据集。我使用了如下

ResNet50()
模型。

超级参数:

Batch size: 16
Learning rate: 0.0002
Epoch: 100
Iteration per Epoch: 150
base_model = ResNet50(include_top=False, weights='imagenet')
for layer in base_model.layers:
    layer.trainable = True

x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(512,activation='relu')(x)
predictions = Dense(268, activation='softmax')(x)
model = Model(inputs=base_model.input, outputs=predictions) 

我的问题是准确度很低并且在每个时期都有波动。

研究论文展示了这种准确性:

tensorflow keras deep-learning conv-neural-network artificial-intelligence
3个回答
1
投票

模型过度拟合,因为您正在相对较小的数据集上训练非常大的未经训练的模型。

您可以尝试克服这个问题:

设置

layer.trainable
等于
False

这将使用经过数千次调整的预训练权重,这样您就不必从头开始重新训练它们。从头开始的训练需要数百万个示例和大量计算资源才能实现。

降低学习率

当训练权重已经预训练得很好的模型时,很可能不需要太多进一步的改进。因此,为了微调模型而不忘记已经学习的模式,请将学习率降低到

1e-5
1e-9

之间

仅训练顶层

因为 ResNet 有很多层,这意味着它也有很多学习模式。通常,输入附近的模式和层会抽象出更大、更一般的信息,通常最好将它们保留原样。然而,靠近输出的顶部层往往具有特定于模型问题案例的更细粒度的细节。这些是您应该调整的层,以便看到训练验证准确性的改进

for layer in base_model.layers:
    layer.trainable = False
for layer in base_model.layers[-5:]:
    layer.trainable = True

此外,使您的输入图像在

[0, 1]
的范围内缩放。这可以通过将图像除以
255.0

来实现

1
投票

看起来你的模型是过度拟合。这意味着某些样本只是随机分类 - 因为准确性只不过是正确分类的样本数量。

要克服这个问题,请尝试:

1)添加更多数据点(如果没有更多训练图像可用,请尝试使用数据增强。在 keras 中,请参阅ImageDataGenerator 或尝试预训练的 ResNet)

2)正确缩放图像

3)将学习率更改为较小的值。

4)尝试 dropout、批量归一化...


0
投票

就像其他人所说的那样,您可能过度拟合了。您可以通过提供更多数据来修复过度拟合,或者选择较小的 ResNet,例如层数较少的 ResNet 18 或 ResNet 34。

我发现的另一个有趣的点: 当我从https://github.com/charlesq34/pointnet/tree/master实现PointNet(它具有卷积、巴赫归一化(BN)和像ResNet一样的relu序列)时,我发现BN导致了波动的验证损失: 从我的 PointNet 模型中删除 BN 后: 所以你可以尝试从 ResNet 中去掉 BN。从理论上讲,BN 应该使学习更加稳定,但我怀疑它在每个批次之后不断调整*尺寸,从而导致不一致并且难以跨批次学习。这种不一致可以解释验证损失的持续波动。

*BN 不仅可以标准化,还可以缩放和移动值:https://towardsdatascience.com/batch-norm-explained-visually-how-it-works-and-why-neural-networks-need-it-b18919692739

© www.soinside.com 2019 - 2024. All rights reserved.