LSTM训练期间的训练损失高于验证损失

时间:2020-08-09 23:14:57

标签: 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)
 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,请随附图片。我尝试了很多事情,包括辍学和添加更多的隐藏单元,但并不能解决问题。任何意见的建议表示赞赏 enter image description here

1 个答案:

答案 0 :(得分:-1)

与训练集相比,验证集的性能更好,这表明您的模型过度适合训练数据。听起来您好像已经尝试创建带有和不带有辍学层(可防止过度拟合)的模型体系结构,但是结果是相似的。

一种可能性是data leakage,这是在创建训练数据集时使用训练数据之外的信息的情况。例如,如果您一次标准化或标准化所有数据,而不是分别针对训练和验证集进行标准化或标准化,那么您将隐式使用训练数据中的验证数据,这将导致模型过度拟合。