即使在使用正则化器后,LSTM 中的过度拟合

Ric*_*cky 2 python deep-learning lstm keras recurrent-neural-network

我有一个时间序列预测问题,正在构建一个如下所示的 LSTM:

def create_model():
    model = Sequential()
    model.add(LSTM(50,kernel_regularizer=l2(0.01), recurrent_regularizer=l2(0.01), bias_regularizer=l2(0.01), input_shape=(train_X.shape[1], train_X.shape[2])))
    model.add(Dropout(0.591))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer='adam')
    return model
Run Code Online (Sandbox Code Playgroud)

当我在 5 个分割上训练模型时,如下所示:

tss = TimeSeriesSplit(n_splits = 5)
X = data.drop(labels=['target_prediction'], axis=1)
y = data['target_prediction'] 
for train_index, test_index in tss.split(X):
   train_X, test_X = X.iloc[train_index, :].values, X.iloc[test_index,:].values
   train_y, test_y = y.iloc[train_index].values, y.iloc[test_index].values
   model=create_model()
   history = model.fit(train_X, train_y, epochs=10, batch_size=64,validation_data=(test_X, test_y), verbose=0, shuffle=False)
Run Code Online (Sandbox Code Playgroud)

我遇到过拟合问题。附上损失图在此处输入图片说明

我不确定为什么在我的 Keras 模型中使用正则化器时会出现过度拟合。任何帮助表示赞赏。

编辑: 尝试架构

def create_model():
    model = Sequential()
    model.add(LSTM(20, input_shape=(train_X.shape[1], train_X.shape[2])))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer='adam')
    return model


def create_model(x,y):
    # define LSTM
    model = Sequential()
    model.add(Bidirectional(LSTM(20, return_sequences=True), input_shape=(x,y)))
    model.add(TimeDistributed(Dense(1, activation='sigmoid')))
    model.compile(loss='mean_squared_error', optimizer='adam')
    return model 
Run Code Online (Sandbox Code Playgroud)

但它仍然是过度拟合。

小智 8

首先删除所有的正则化器和辍学。您实际上是在用所有技巧发送垃圾邮件,而 0.5 辍学率太高了。

减少 LSTM 中的单元数。从那里开始。达到模型停止过度拟合的点。

然后,根据需要添加 dropout。

之后,下一步是添加tf.keras.Bidirectional. 如果仍然不满意,则增加层数。记住对return_sequences除最后一层之外的每个 LSTM 层都保持True。

尽管可用,但我很少遇到使用层正则化的网络,因为 dropout 和层正则化具有相同的效果,人们通常会使用 dropout(我见过最多使用 0.3)。

  • @使用了一个简单的架构,单元较少,并且没有 dropout 仍然过拟合 (3认同)