验证损失达到最小值然后增加

时间:2020-12-31 15:27:42

标签: python tensorflow machine-learning keras deep-learning

enter image description here

可以看出,在第 60 轮左右,我的验证损失开始增加,而我的验证准确度保持不变。看起来它在那个时候开始过度拟合,但如果它只是记住我的训练数据,训练损失不会继续减少到接近零吗?我的模型看起来也很小,因为它会过度拟合(我正在尝试对 FFT 数据进行分类)。我明显做错了什么吗?

这是我的模型:

model = Sequential()
model.add(Conv1D(filters = 32, kernel_size = 3, activation = 'relu', input_shape = (size, 1)))
model.add(Dropout(dropout))
model.add(GlobalMaxPooling1D())
model.add(Dropout(dropout))
model.add(Dense(64, activation='relu'))
model.add(Dense(1, activation='sigmoid')) #Output layer

我的训练数据形状:

x: (1038, 2206)

y: (1038, 1)

我的参数:

EPOCHS = 300

LR = 1e-3

辍学率 = 0.5

BATCH_SIZE = 128

顺便说一句,我的验证准确率大约为 98%,但是当我在相同的验证数据上测试我的模型时,我得到了错误的输出。我不认为我的验证数据制作不正确,因为我制作的方式与我的训练数据完全相同。

1 个答案:

答案 0 :(得分:2)

你的损失图看起来是经典的过度拟合,考虑到模型的简单性,这很奇怪。我要改变的模型中的一件事是你有

model.add(Dropout(dropout))
model.add(GlobalMaxPooling1D())
model.add(Dropout(dropout))

全局最大池化没有激活函数,所以我认为不需要第二个 dropout 层。实际上,辍学率为 0.5 我也很惊讶你的模型火车 就像它一样。您提到创建验证集,因此我假设您选择了验证数据。通常最好使用 sklearn 的 train_test_split 函数通过从完整数据集中随机选择来创建验证数据。随着您的辍学量,您的模型可能无法达到 100% 的训练准确度。我会尝试的一件事是使用 Keras 回调 ReduceLROnPlateau 使用可调整的学习率。设置它以监控验证损失。如果损失在“耐心”次数的时期内未能减少,则学习率将减少一个“因子”,其中因子的值小于 1.0。文档位于here.下面是我对代码的建议。

lr_adjust= tf.keras.callbacks.ReduceLROnPlateau(
    monitor="val_loss", factor=0.5, patience=2,verbose=1,mode="auto")

现在在 model.fit 中添加 callbacks=[lr_adjust] 您没有显示您的 model.compile 代码,但您可以尝试使用不同的优化器来查看它是否有效果。我推荐亚当优化器。我怀疑正在发生的是您的测试集的概率分布与您的训练和验证集的概率分布显着不同。鉴于您综合创建了后者,而您的测试数据是“现实生活数据”,这使得可能出现不同概率分布的情况。