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_test
和y_test
评估模型时,我得到相同的损失和准确度分数。但是当拟合“最佳模型”时,我得到了这个:
但是,与我的真实价值观相比,我的预测看起来非常合理。我应该怎么做才能更好地适应?
【问题讨论】:
【参考方案1】:20 条记录,因为训练数据太小。模型的训练数据没有足够的变化来准确逼近函数,因此您的验证数据可能远小于 20,可能包含一个与训练数据中的 20 个完全不同的示例(即它在训练期间没有看到这种性质的例子)导致损失更高。
【讨论】:
我不应该在我的数据上使用 LSTM 吗?我从模型中得到的预测看起来很有希望,与其他模型(SVM、随机森林等)相比,LSTM 仍然表现更好(RMSE 度量)。 有什么方法可以获得更多数据? scikit-learn.org/stable/tutorial/machine_learning_map/… = "获取更多数据" 不幸的是,我做不到。那么,使用这个数据集有什么意义吗? 我可能会说不,除非您可以访问未标记的数据(这就是重点对吗?- 对未标记的数据进行分类)并且可能可以手动标记更多示例或使用 SpaCy 等标记库以上是关于Keras Lstm中dropout机制的主要内容,如果未能解决你的问题,请参考以下文章
当我给它2时,Keras LSTM需要3个维度,而当我给它3时,它需要4个维度