我在进行一个项目,尝试在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))
是什么导致了这种验证平台期?有什么方法可以改进我的模型吗?
提前感谢您的反馈和评论。
回答:
这是一个非常常见的问题,属于过拟合的一种形式。
我建议您阅读Ian Goodfellow、Yoshua Bengio和Aaron Courville合著的《深度学习》一书,尤其是这一章节(免费访问),内容非常有帮助。
简而言之,您似乎选择了一个对您的问题和数据来说容量过大的模型(ResNet50 + 默认训练参数)。如果您选择的模型过于简单,训练和评估曲线会非常接近,但性能会比您能达到的水平差。如果您选择的模型过于复杂(如这里的情况),您可以在训练数据上获得更好的性能,但评估性能不会达到同样的水平,甚至可能相当差。这被称为对训练集的过拟合。
您希望找到最佳的中间点:在评估数据上获得最佳性能的模型复杂度应该刚好在过拟合之前:您希望两条性能曲线彼此接近,但两者都应尽可能好。
因此,您需要为您的问题降低模型的容量。有不同的方法可以做到这一点,它们在减少过拟合和降低训练性能方面的效率不尽相同。通常,最好的方法是增加更多的训练数据,如果可以的话。如果不能,接下来可以添加的是正则化,如数据增强、dropout、L1或L2正则化,以及早停。最后一种方法尤其有用,如果您的验证性能在某个点开始下降,而不是仅仅停滞。这不是您的情况,所以它不应该是您的首选方案。
如果正则化还不够,那么尝试调整学习率或书中提到的其他参数。您应该能够让ResNet50在Cifar10上表现得比这好得多,但这可能不是那么简单。