python - 尽管有 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 层?我还有什么其他选择可以解决这个问题?谢谢!
解决方案
如果您有数据泄漏,那么您将在保留的测试集上获得所有预测错误同时获得几乎 100% 的验证准确度的唯一方法是。即您的训练数据必须包含与您的验证数据相同的图像(或者它们非常相似到相同点)。
或者您的测试集中的数据与您的训练和验证数据集非常不同。
要解决此问题,请确保在所有数据集中,多个数据集中不存在单个图像。还要确保图像通常相似。即,如果使用手机照片进行训练,则不要使用 DSLR 拍摄的图像或从 Google 提取水印的图像进行测试。
你的损失也很奇怪nan
。这可能是由于使用了分类准确性。要解决此问题,只需将指标设为“准确性”。这将动态确定要使用的最佳精度。之一[binary, categorical or sparse_categorical]
。
希望这可以帮助。
推荐阅读
- loops - 根据谷歌应用脚本中的列的总和进行分组和过滤
- javascript - HTML/CSS 中的下拉菜单
- javascript - 使用带有 CSS 网格区域的 JS 在垂直选项卡内创建嵌套的水平选项卡
- html - 如何在悬停时更改按钮中的图像?
- docker - 使用 Docker 时 MongoDB 的 URI 无效
- c++ - 如何告诉编译器 MyCustomType 是equal_comparable_with SomeOtherType?
- javascript - 使用reduce转换一个2 js对象2 1
- arrays - 当我使用多个文件时,为什么 C 将我的全局数组值重置为 0?
- sql - SQLite 根据日期列给出错误的输出
- javascript - javascript从输入中输出随机行