训练准确性好,但验证准确性差

时间:2020-03-27 15:50:23

标签: python performance tensorflow machine-learning deep-residual-networks

我正在尝试实现一个残差网络以对一个项目的CIFAR10数据集上的图像进行分类,并且我有一个工作模型,该模型的对数精度不断提高,但验证精度却达到了平稳状态。我在大多数层之后使用批处理规范化和relu,最后使用softmax。

这是我的数据拆分:

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()

这是我用来编译和训练模型的代码

resNet50.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])
resNet50.fit(train_images, train_labels, epochs=EPOCHS, validation_data=(test_images, test_labels))

enter image description here

enter image description here

什么可能导致此验证平稳期,什么可以改善我的模型?

非常感谢您的反馈和评论。

1 个答案:

答案 0 :(得分:1)

这是一个非常普遍的问题,是一种过拟合的问题。

我邀请您阅读Ian Goodfellow,Yoshua Bengio和Aaron Courville撰写的《深度学习》一书,尤其是this chapter(免费),该书非常有用。

简而言之,您似乎选择的模型(ResNet50 +默认训练参数)对问题和数据的处理能力太大。如果选择的模型过于简单,则训练和评估曲线会非常接近,但性能却差强人意。如果您选择的模型过于复杂(如此处所示),则可以在训练数据上获得更好的性能,但是评估将不会处于同一水平,甚至可能会很糟糕。在训练集上称为overfitting

您想要的是最好的中间点:在过拟合之前,通过模型复杂性找到评估数据上的最佳性能:您希望两条性能曲线彼此接近,但两者都应尽可能地好

因此,您需要减少解决问题的模型容量。有多种方法可以做到这一点,就减少过度拟合或降低火车性能而言,它们的效率均不相同。如果可以的话,最好的方法通常是添加更多的训练数据。如果不能,那么接下来要添加的好东西是regularization,例如数据增强,dropout,L1或L2正则化以及提前停止。如果您的验证性能在某个时候开始下降,而不仅仅是稳定,那么最后一个特别有用。这不是您的情况,所以它不应该是您的第一条曲目。

如果正则化还不够,请尝试以学习率或本书中提到的其他参数为准。您should be able to make ResNet50 itself work much better than this on Cifar10,但也许并不那么琐碎。