在LSTM中,即使使用了正则化器,也会出现过度拟合的情况。

问题描述 投票:0回答:1

我有一个时间序列预测问题,并建立一个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

当我在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)

我得到一个过拟合问题。附上损失图 enter image description here

我不知道为什么当我在Keras模型中使用正则器时,会出现过盈。任何帮助都是感激的。

EDIT:尝试了一下架构

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 

但仍然是过拟合。

python keras deep-learning lstm recurrent-neural-network
1个回答
0
投票

首先删除你所有的正则化器和辍学。你简直是在用所有的技巧在滥竽充数,0.5的dropout太高了。

减少你的LSTM中的单位数量。从那里开始。达到一个点,你的模型停止过拟合。

然后,如果需要的话,添加dropout。

在这之后,下一步是添加的 tf.keras.Bidirectional. 如果还是不满意,那就增加层数。记住要保持 return_sequences 除了最后一层,每一层LSTM都是如此。

我很少遇到网络使用层正则化的情况,尽管可以使用,因为dropout和层正则化的效果是一样的,人们通常会选择dropout(最多的时候,我见过使用0.3)。

© www.soinside.com 2019 - 2024. All rights reserved.