python - 验证损失达到最小值然后增加
问题描述
可以看出,在 epoch 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)
我的参数:
纪元 = 300
LR = 1e-3
辍学 = 0.5
BATCH_SIZE = 128
附带说明一下,我的验证准确率约为 98%,但是当我在相同的验证数据上测试我的模型时,我得到了不正确的输出。我不相信我的验证数据制作不正确,因为我制作它的方式与我的训练数据完全相同。
解决方案
您的损失图看起来是经典的过度拟合,考虑到模型的简单性,这很奇怪。我要改变的模型中的一件事是你有
model.add(Dropout(dropout))
model.add(GlobalMaxPooling1D())
model.add(Dropout(dropout))
全局最大池没有激活函数,所以我认为不需要第二个 dropout 层。实际上,辍学率为 0.5,我很惊讶你的模型火车和它一样。您提到创建验证集,所以我假设您选择了验证数据。通常最好使用 sklearn 的 train_test_split 函数通过从完整数据集中随机选择来创建验证数据。有了 dropout 的数量,你的模型可能无法达到 100% 的训练准确度是有道理的。我会尝试的一件事是使用 Keras 回调 ReduceLROnPlateau 使用可调整的学习率。设置它来监控验证损失。如果损失未能减少“耐心”的时期数,则学习率将减少一个“因子”,其中因子的值小于 1.0。这里。以下是我对代码的建议。
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 代码,但你可以尝试使用不同的优化器来查看它是否有效果。我推荐亚当优化器。我怀疑正在发生的是,您的测试集的概率分布与您的训练和验证集的概率分布明显不同。鉴于您在测试数据是“现实生活数据”时综合创建了后者,这使得不同概率分布的情况很可能发生。
推荐阅读
- django - 带有选择列表的 Django char 字段
- excel - VBA:(运行时错误 424:需要对象)提案自动化
- kdb - kdb - 求解 IRR 的求解器函数
- laravel - laravel Eloquent 关系查询与 whereHas
- pyqt5 - PYQT5 不会将 QPushButton.clicked.connect() 迭代到小部件列表
- excel - 我可以通过减去时间来给出 if 语句吗?
- java - 无限永不失效的热通量
- python - 有没有人对如何使用输入来确定列表中的位置有建议?
- node.js - 什么是相当于“server.js”文件的 TypeScript
- c# - 在 Entity Framework Core 上添加迁移时出现 NET 5 错误