对于某些背景,我的数据集大约有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+的验证精度。当我运行测试时,它会得到所有错误的预测。因此,我认为它过度拟合。尽管添加了辍学层,为什么会发生这种情况?我还需要解决什么其他方法?谢谢!
完全不是过度拟合,看看您的损失是否等于nan。这意味着您的梯度在训练过程中爆炸了。要查看实际情况,我建议您查看每次迷你批处理后的损失,并从什么时候开始减少损失。
如果您有数据泄漏,则使保持测试集上的所有预测不正确,同时获得几乎100%的验证准确性的唯一方法是。即您的训练数据必须包含与验证数据相同的图像(或者它们非常相似)。
或者测试集中的数据与训练和验证数据集有很大不同。
要解决此问题,请确保在所有数据集中,没有一个图像存在于多个数据集中。还要确保图像大致相似。也就是说,如果使用手机照片进行训练,请不要使用DSLR拍摄的图像或带有从Google提取水印的图像进行测试。
It is also odd that your loss is
nan
. It may be due to using categorical accuracy. To fix this just put the metric to be 'accuracy'. This will dynamically determine the best accuracy to use. One of[binary, categorical or sparse_categorical]
.希望这可以帮助。