良好的训练准确性但验证准确性差
Good training accuracy but poor validation accuracy
我正在尝试实施一个残差网络来对项目的 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 合着的《深度学习》一书,尤其是 this chapter(免费访问),内容非常丰富。
简而言之,您选择的模型(ResNet50 + 默认训练参数)似乎对您的问题和数据容量太大。如果您选择的模型过于简单,您将获得非常接近的训练曲线和评估曲线,但性能会比您所能达到的更差。如果您选择的模型过于复杂(就像这里的情况一样),您可以在训练数据上达到更好的性能,但评估不会处于同一水平,甚至可能非常糟糕。这在训练集上称为 overfitting。
你想要的是最好的中间点:评估数据的最佳性能是在过度拟合之前的模型复杂度中找到的:你希望两条性能曲线彼此接近,但两者应该一样好尽可能。
因此您需要针对您的问题降低模型的容量。有不同的方法可以做到这一点,它们在减少过度拟合和降低训练性能方面都不会同样有效。如果可以的话,最好的方法通常是添加更多的训练数据。如果不能,接下来要添加的好东西是 regularization, such as data augmentation, dropout、L1 或 L2 正则化和提前停止。如果您的验证性能在某个时候开始下降,而不仅仅是停滞不前,最后一个特别有用。这不是你的情况,所以它不应该是你的第一首曲目。
如果正则化还不够,那就试试学习率,或者书中提到的其他参数。你 should be able to make ResNet50 itself work much better than this on Cifar10,但也许这不是那么微不足道。
我正在尝试实施一个残差网络来对项目的 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 合着的《深度学习》一书,尤其是 this chapter(免费访问),内容非常丰富。
简而言之,您选择的模型(ResNet50 + 默认训练参数)似乎对您的问题和数据容量太大。如果您选择的模型过于简单,您将获得非常接近的训练曲线和评估曲线,但性能会比您所能达到的更差。如果您选择的模型过于复杂(就像这里的情况一样),您可以在训练数据上达到更好的性能,但评估不会处于同一水平,甚至可能非常糟糕。这在训练集上称为 overfitting。
你想要的是最好的中间点:评估数据的最佳性能是在过度拟合之前的模型复杂度中找到的:你希望两条性能曲线彼此接近,但两者应该一样好尽可能。
因此您需要针对您的问题降低模型的容量。有不同的方法可以做到这一点,它们在减少过度拟合和降低训练性能方面都不会同样有效。如果可以的话,最好的方法通常是添加更多的训练数据。如果不能,接下来要添加的好东西是 regularization, such as data augmentation, dropout、L1 或 L2 正则化和提前停止。如果您的验证性能在某个时候开始下降,而不仅仅是停滞不前,最后一个特别有用。这不是你的情况,所以它不应该是你的第一首曲目。
如果正则化还不够,那就试试学习率,或者书中提到的其他参数。你 should be able to make ResNet50 itself work much better than this on Cifar10,但也许这不是那么微不足道。