Keras LSTM培训期间的培训损失高于验证损失
我正在训练LSTM来预测时间序列。我试过一个编码器-解码器,没有任何遗漏。我将数据分为70%的培训和30%的验证。训练集和验证集的总分分别约为107分和47分。然而,验证损失总是大于训练损失。下面是代码Keras LSTM培训期间的培训损失高于验证损失,keras,time-series,lstm,encoder-decoder,trainingloss,Keras,Time Series,Lstm,Encoder Decoder,Trainingloss,我正在训练LSTM来预测时间序列。我试过一个编码器-解码器,没有任何遗漏。我将数据分为70%的培训和30%的验证。训练集和验证集的总分分别约为107分和47分。然而,验证损失总是大于训练损失。下面是代码 seed(12346) tensorflow.random.set_seed(12346) Lrn_Rate=0.0005 Momentum=0.8 sgd=SGD(lr=Lrn_Rate, decay = 1e-6, momentum=Momentum, nesterov=True)
seed(12346)
tensorflow.random.set_seed(12346)
Lrn_Rate=0.0005
Momentum=0.8
sgd=SGD(lr=Lrn_Rate, decay = 1e-6, momentum=Momentum, nesterov=True)
adam=Adam(lr=Lrn_Rate, beta_1=0.9, beta_2=0.999, amsgrad=False)
optimizernme=sgd
optimizernmestr='sgd'
callbacks= EarlyStopping(monitor='loss',patience=50,restore_best_weights=True)
train_X1 = numpy.reshape(train_X1, (train_X1.shape[0], train_X1.shape[1], 1))
test_X1 = numpy.reshape(test_X1, (test_X1.shape[0], test_X1.shape[1], 1))
train_Y1 = train_Y1.reshape((train_Y1.shape[0], train_Y1.shape[1], 1))
test_Y1= test_Y1.reshape((test_Y1.shape[0], test_Y1.shape[1], 1))
model = Sequential()
Hiddenunits=240
DenseUnits=100
n_features=1
n_timesteps= look_back
model.add(Bidirectional(LSTM(Hiddenunits, activation='relu', return_sequences=True,input_shape=
(n_timesteps, n_features))))#90,120 worked for us uk
model.add(Bidirectional(LSTM( Hiddenunits, activation='relu',return_sequences=False)))
model.add(RepeatVector(1))
model.add(Bidirectional(LSTM( Hiddenunits, activation='relu',return_sequences=True)))
model.add(Bidirectional(LSTM(Hiddenunits, activation='relu', return_sequences=True)))
model.add(TimeDistributed(Dense(DenseUnits, activation='relu')))
model.add(TimeDistributed(Dense(1)))
model.compile(loss='mean_squared_error', optimizer=optimizernme)
history=model.fit(train_X1,train_Y1,validation_data(test_X1,test_Y1),batch_size=batchsize,epochs=250,
callbacks=[callbacks,TqdmCallback(verbose=0)],shuffle=True,verbose=0)
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss'+ modelcaption)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
培训损失大于验证损失。培训损失=0.02,验证损失约为0.004,请参见附图。我尝试了很多事情,包括辍学和增加更多的隐藏单位,但都没有解决问题。如有任何意见和建议,我们将不胜感激
与训练集相比,验证集的性能更好,这表明您的模型与训练数据拟合过度。听起来您已经尝试过创建模型体系结构,其中包含和不包含辍学层(这可以防止过度拟合),但结果是相似的
一种可能性是,在创建训练数据集时使用训练数据之外的信息。例如,如果一次对所有数据进行规范化或标准化,而不是对训练集和验证集分别进行规范化或标准化,则在训练数据中隐式使用验证数据,这将导致模型过拟合。否,过拟合恰恰相反,在训练集上表现良好,测试/验证集的性能不好。如果我误解了什么,那么我将删除我的答案。但如果验证损失总是大于@Nhqazi所说的培训损失,那么,这难道不意味着在培训集上表现良好,而在测试/验证集上表现相对较差吗?是的,但在这个问题中发生的情况恰恰相反。@Dr.snoppy为什么您认为测试/验证性能较差,因为验证损失少于培训。请参阅附件image@Nhqazi我的观点是如果这不是过度拟合,您不能声称过度拟合,因为它的条件没有发生(低训练损失、高验证损失、大幅度高于训练损失)。在您的绘图中,必须交换训练曲线和测试曲线才能成为有效的过度拟合场景。您说过问题是验证损失大于训练损失,但您的图表显示验证损失较低。thnx用于指向它。这是写错的。