一个epoch后的过拟合

8

我正在使用Keras训练模型。

model = Sequential()
model.add(LSTM(units=300, input_shape=(timestep,103), use_bias=True, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(units=536))
model.add(Activation("sigmoid"))
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])

while True:
        history = model.fit_generator( 
            generator = data_generator(x_[train_indices],
                    y_[train_indices], batch = batch, timestep=timestep),
                steps_per_epoch=(int)(train_indices.shape[0] / batch), 
                epochs=1, 
                verbose=1, 
                validation_steps=(int)(validation_indices.shape[0] / batch), 
                validation_data=data_generator(
                    x_[validation_indices],y_[validation_indices], batch=batch,timestep=timestep))

根据scikit-learn.org的定义,这是一个多输出分类问题: 多输出回归为每个样本分配一组目标值。可以将其视为预测每个数据点的几个属性,例如某个位置的风向和大小。 因此,我尝试了不同的时间步长来训练循环神经网络。但结果/问题大多相同。
一个epoch之后,我的训练损失约为0.0X,验证损失约为0.6X。这些值在接下来的10个epoch中保持稳定。
数据集约有680000行。训练数据占9/10,验证数据占1/10。
我想知道背后的原理...
  • 我的模型在一个epoch之后就已经过拟合了吗?
  • 0.6xx作为验证损失是否是一个好的值?
高层次的问题: 因此,这是一个多输出分类任务(而不是多类),我认为使用sigmoid和binary_crossentropy是唯一的方法。您是否建议其他方法?

我不确定,但我认为在你的情况下,binary_crossentropy 的最大值应该是 0.7。因此,“valid” 损失可能非常高。我建议尝试增加“dropout”率并检查这种现象是否仍然存在。 - Marcin Możejko
谢谢,我会尝试增加Dropout。您能指出0.7的最大值吗? - hallo02
我将Dropout和Recurrent_Dropout增加到0.4。但是经过一个epoch后,我得到了类似的结果: 损失:0.0347 - 准确率:0.9885 - 验证损失:0.6998 - 验证准确率:0.9193 - hallo02
尝试使用0.7。如果它没有过度拟合,那么可以使用二分查找来寻找最佳参数。 - Marcin Możejko
使用甚至每个0.9,相同的图片。损失:0.1068 - 准确率:0.9645 - 验证损失:0.4846 - 验证准确率:0.9199。谢谢。 - hallo02
1个回答

9
我曾遇到过这个问题,发现学习率和批大小对学习过程有很大影响。在我的情况下,我做了两件事。
  • 降低学习率(尝试0.00005)
  • 减少批量大小(8、16、32)
此外,您还可以尝试预防过拟合的基本步骤。
  • 降低模型复杂度
  • 增加训练数据,并平衡每个类别的每个样本。
  • 添加更多正则化(Dropout、BatchNorm)

我理解你的观点,但是批大小对这个问题有什么影响? - tschomacker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接