首页 > 解决方案 > 尽管有 dropout 层,CNN 仍然存在高度过拟合?

问题描述

对于某些背景,我的数据集大约是 75000 多张图像,200x200 灰度,有 26 个类别(字母表中的字母)。我的模型是:

model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(200, 200, 1))) 
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.2))
model.add(Conv2D(64, (3, 3), activation='relu')) 
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.2))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(26, activation='softmax'))


model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=[tf.keras.metrics.CategoricalAccuracy()]) 

model.fit(X_train, y_train, epochs=1, batch_size=64, verbose=1, validation_data=(X_test, y_test))

model.fit 的输出是:

Train on 54600 samples, validate on 23400 samples
Epoch 1/1
54600/54600 [==============================] - 54s 984us/step - loss: nan - categorical_accuracy: 0.9964 - val_loss: nan - val_categorical_accuracy: 0.9996

99.9+ 验证准确度。当我运行测试时,它得到的所有预测都不正确。所以,我认为它是过拟合的。为什么会发生这种情况,尽管添加了 dropout 层?我还有什么其他选择可以解决这个问题?谢谢!

标签: pythontensorflowdeep-learningconv-neural-networkdropout

解决方案


如果您有数据泄漏,那么您将在保留的测试集上获得所有预测错误同时获得几乎 100% 的验证准确度的唯一方法是。即您的训练数据必须包含与您的验证数据相同的图像(或者它们非常相似到相同点)。

或者您的测试集中的数据与您的训练和验证数据集非常不同。

要解决此问题,请确保在所有数据集中,多个数据集中不存在单个图像。还要确保图像通常相似。即,如果使用手机照片进行训练,则不要使用 DSLR 拍摄的图像或从 Google 提取水印的图像进行测试。

你的损失也很奇怪nan。这可能是由于使用了分类准确性。要解决此问题,只需将指标设为“准确性”。这将动态确定要使用的最佳精度。之一[binary, categorical or sparse_categorical]

希望这可以帮助。


推荐阅读