【问题标题】:CNN having high overfitting despite having dropout layers?尽管有 dropout 层,CNN 仍然存在高度过拟合?
【发布时间】:2020-08-24 13:33:33
【问题描述】:

对于某些背景,我的数据集大约是 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 层?我还有什么其他选择可以解决这个问题?谢谢!

【问题讨论】:

  • 损失中的nan值表明存在梯度扩展。但在某些情况下,当输入数据损坏时会看到 nan 值。我遇到过同样的问题。原因是最终密集层中的类数和单元数不匹配。
  • 感谢您的回复,您对我能做什么有什么建议吗?我敢肯定,班级的数量和单位的数量没有不匹配。我正在 Alphabet 上训练,26 个课程 - 这与 26 的 Dense 输出也匹配 @sreagm
  • 如果输入管道没有问题,我认为最好尝试不同的架构。还值得尝试包含一个批量标准化层吗?

标签: python tensorflow deep-learning conv-neural-network dropout


【解决方案1】:

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

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

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

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

希望这会有所帮助。

【讨论】:

  • 我最初将指标设置为准确度,但这给了我结果:Train on 54600 samples, validate on 23400 samples Epoch 1/1 54600/54600 [==============================] - 53s 970us/step - loss: nan - accuracy: 0.0000e+00 - val_loss: nan - val_accuracy: 0.0000e+00 所以这里有人建议我将它切换到现在的样子。我确信我的数据集很好,因为当我在相同但更小的数据集(但使用 10 个输出而不是 26 个)上运行相同的代码时,它可以正常工作。指定我的数据集是美国手语。 26,每个字母一个类。
  • 我相信这是合适的输出。如果你的损失是nan,你的准确率应该是0。正如我在您的其他问题上所说的那样,您需要标准化您的数据(除以 0)。通常,这种类型的事情是管道 w.r.t 错误的结果。数据摄取。
  • 谢谢,我试试看。抱歉,这是我尝试重新创建的第一个 NN,所以我对某些术语有些困惑。当对数据进行归一化时,我们只是对 X_train 和 X_test 进行归一化吗?这就是他们在this tutorial 中所做的事情。他们将其设置为 X_train /=255 .. 等
  • 正确。将您的训练和测试集中的图像除以 255。有关更多详细信息,请参见此处 - stackoverflow.com/questions/29853497/normalization-of-an-image
【解决方案2】:

它完全没有过拟合,看看你的损失它等于 nan。这意味着您的梯度在训练期间已经爆炸。要查看实际发生的情况,我建议您在每个小批量之后查看损失,看看损失在什么时候变为 nan。

【讨论】:

    猜你喜欢
    • 2021-04-30
    • 2018-09-16
    • 1970-01-01
    • 2021-12-04
    • 2016-07-08
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多