第一个时期的验证和训练准确率很高 [Keras]

Swa*_*wal 4 python neural-network keras tensorflow

我正在训练一个具有 2 个类和 53k 图像的图像分类器,并使用 keras 用 1.3k 图像对其进行验证。这是神经网络的结构:

model = Sequential()
model.add(Flatten(input_shape=train_data.shape[1:]))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='adam',
              loss='binary_crossentropy', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)

在第一个 epoch 中,训练准确度从 ~50% 增加到 ~85%,验证准确度为 85%。随后的 epoch 不断提高训练准确度,但是,验证准确度保持在 80-90% 的范围内。

我很好奇,是否有可能在第一个 epoch 中获得高验证和训练准确率?如果我的理解是正确的,它会从小处开始,并随着每个经过的时代稳步增加。

谢谢

编辑:重新缩放后图像大小为 150x150,小批量大小为 16。

ded*_*bed 6

是的,完全有可能在第一个 epoch 中获得高精度,然后仅进行适度的改进。

如果数据中有足够的冗余并且您在第一个时期(即您使用小批量)进行了足够的更新(即模型的复杂性,这似乎很容易优化),那么您完全有可能学习大部分第一个时代的重要内容。当您再次显示数据时,模型将开始过度拟合训练集中特定图像引入的特性(从而提高训练精度),但由于您没有提供任何新样本,因此它不会学习任何关于你的类的基础属性。

您可以将您的训练数据视为无限流(实际上 SGD 想要享受所有收敛定理)。你认为你需要超过 50k 个样本来学习什么是重要的吗?实际上,您可以通过在一些子时代更新后提供更少的数据或报告性能来测试模型的数据饥饿。


Tan*_*wal 1

是的,纪元应该适合模型上的数据。

尝试在最后使用 2 个神经元,并在您的类别标签上使用一个热编码!就像我见过的一种情况,我这样做得到了更好的结果,而不是二进制输出。