Keras Lstm中dropout机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Keras Lstm中dropout机制相关的知识,希望对你有一定的参考价值。

参考技术A 最近发现Lstm中有个比较鸡肋的dropout机制

keras.layers.GRU(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0, implementation=1, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False)

dropout:0~1之间的浮点数,控制输入线性变换的神经元断开比例

recurrent_dropout:0~1之间的浮点数,控制循环状态的线性变换的神经元断开比例

如果单层的LSTM使用dropout,肯定是没有完全学习到输入层传递的信息。如果想要使用dropout机制,直接在层之间加入dropout层不就好了(ps. 一般人也是这么做的)?搞不懂他们为什么会有这样操作。recurrent_drop是在循环层见断开神经元的比例,这还算是比较有用。

出自:世相科技

欢迎点赞支持

Keras LSTM 模型过拟合

【中文标题】Keras LSTM 模型过拟合【英文标题】:Keras LSTM model overfitting 【发布时间】:2021-09-30 16:34:36 【问题描述】:

我在 Keras 中使用 LSTM 模型。在拟合阶段,我添加了 validation_data 参数。当我绘制我的训练与验证损失时,似乎存在严重的过度拟合问题。我的验证损失不会减少。

我的完整数据是一个形状为[50,] 的序列。前 20 条记录用作训练数据,其余用作测试数据。

我已尝试尽可能多地添加 dropout 并降低模型复杂性,但仍然没有成功。

# transform data to be stationary
raw_values = series.values
diff_values = difference_series(raw_values, 1)

# transform data to be supervised learning
# using a sliding window
supervised = timeseries_to_supervised(diff_values, 1)
supervised_values = supervised.values

# split data into train and test-sets
train, test = supervised_values[:20], supervised_values[20:]

# transform the scale of the data
# scale function uses MinMaxScaler(feature_range=(-1,1)) and fit via training set and is applied to both train and test.
scaler, train_scaled, test_scaled = scale(train, test)

batch_size = 1
nb_epoch = 1000
neurons = 1
X, y = train_scaled[:, 0:-1], train_scaled[:, -1]
X = X.reshape(X.shape[0], 1, X.shape[1])
testX, testY = test_scaled[:, 0:-1].reshape(-1,1,1), test_scaled[:, -1]
model = Sequential()
model.add(LSTM(units=neurons, batch_input_shape=(batch_size, X.shape[1], X.shape[2]),
              stateful=True))
model.add(Dropout(0.1))
model.add(Dense(1, activation="linear"))
model.compile(loss='mean_squared_error', optimizer='adam')
history = model.fit(X, y, epochs=nb_epoch, batch_size=batch_size, verbose=0, shuffle=False,
                    validation_data=(testX, testY))

这是改变神经元数量时的样子。我什至尝试使用 Keras Tuner(超频带)来找到最佳参数。

def fit_model(hp):
  batch_size = 1
  model = Sequential()
  model.add(LSTM(units=hp.Int("units", min_value=1,
                              max_value=20, step=1), 
                  batch_input_shape=(batch_size, X.shape[1], X.shape[2]),
                  stateful=True))
  model.add(Dense(units=hp.Int("units", min_value=1, max_value=10),
                                activation="linear"))
  model.compile(loss='mse', metrics=["mse"],
                optimizer=keras.optimizers.Adam(
      hp.Choice("learning_rate", values=[1e-2, 1e-3, 1e-4])))
  return model

X, y = train_scaled[:, 0:-1], train_scaled[:, -1]
X = X.reshape(X.shape[0], 1, X.shape[1])

tuner = kt.Hyperband(
    fit_model,
    objective='mse',
    max_epochs=100,
    hyperband_iterations=2,
    overwrite=True)

tuner.search(X, y, epochs=100, validation_split=0.2)

根据X_testy_test 评估模型时,我得到相同的损失和准确度分数。但是当拟合“最佳模型”时,我得到了这个:

但是,与我的真实价值观相比,我的预测看起来非常合理。我应该怎么做才能更好地适应?

【问题讨论】:

【参考方案1】:

20 条记录,因为训练数据太小。模型的训练数据没有足够的变化来准确逼近函数,因此您的验证数据可能远小于 20,可能包含一个与训练数据中的 20 个完全不同的示例(即它在训练期间没有看到这种性质的例子)导致损失更高。

【讨论】:

我不应该在我的数据上使用 LSTM 吗?我从模型中得到的预测看起来很有希望,与其他模型(SVM、随机森林等)相比,LSTM 仍然表现更好(RMSE 度量)。 有什么方法可以获得更多数据? scikit-learn.org/stable/tutorial/machine_learning_map/… = "获取更多数据" 不幸的是,我做不到。那么,使用这个数据集有什么意义吗? 我可能会说不,除非您可以访问未标记的数据(这就是重点对吗?- 对未标记的数据进行分类)并且可能可以手动标记更多示例或使用 SpaCy 等标记库

以上是关于Keras Lstm中dropout机制的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Keras 功能模型中添加 Dropout?

当我给它2时,Keras LSTM需要3个维度,而当我给它3时,它需要4个维度

Keras LSTM 模型过拟合

如何选择 LSTM Keras 参数?

使用 dropout (TF2.0) 时,可变批量大小不适用于 tf.keras.layers.RNN?

将 gridsearchCV 与 Keras RNN-LSTM 一起使用时出现尺寸错误