Fra*_*TEC 9 python backpropagation deep-learning keras
如果我理解正确,要在 keras 中执行 TBPTT,我们必须将我们的序列分成 k 个时间步长的较小部分。根据 keras 的文档,要在序列的所有部分重用 LSTM 的状态,我们必须使用有状态参数:
您可以将 RNN 层设置为“有状态”,这意味着为一个批次中的样本计算的状态将被重新用作下一个批次中样本的初始状态。这假设不同连续批次中的样品之间存在一对一映射。
所以如果我理解正确,第一批的第一个样本是第一个序列的第一个部分,第二批的第一个样本是第一个序列的第二个部分,等等。我有 125973 个长度为 1000 的序列,我分成40 个 k=25 时间步长的序列。所以我的模型应该训练 40 个批次,包含 125973 个 25 个时间步长的序列。我的问题是我的 GPU(quadro K2200,我很穷)的内存,125973 的批量大小似乎太多了。我想知道是否可以将 LSTM 的状态保持在同一批次内并在批次之间重置它,因此我应该将批次大小设为 40 和 125973 批次。
这是我的模型:
model = Sequential()
model.add(Embedding(len(char_to_num), 200, mask_zero=True, batch_input_shape=(batch_size, k)))
model.add(Dropout(0.5))
model.add(LSTM(512, activation='relu', return_sequences=True, stateful=True))
model.add(Dropout(0.5))
model.add(TimeDistributed(Dense(len(char_to_num), activation='softmax')))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam')
model.summary()
Run Code Online (Sandbox Code Playgroud)
EDIT 2021
今年已经有了最近的答案,但这是一个老问题。与此同时,图书馆、DL 和 NLP 的状态发生了很大变化,我已经从 LSTM 转向了 Transformers。我已经很多年没有使用 LSTM 了,我没有计划也没有时间测试发布的答案。
小智 3
到目前为止,您的批量大小是灵活的,它必须除以 P = 125973。如果没有这样的数字(例如,因为 P 是质数),则只需添加每个填充有千个零的虚拟序列。如果添加了虚拟序列,请确保在训练期间通过向 model.fit() 添加适当的“sample_weights”nd 数组来忽略它们(其中真实序列用“1”屏蔽,虚拟序列用“0”屏蔽),并且调用 model.compile(..,sample_weight_mode='temporal')。
然后,要在批次之间重置状态,请使用 keras 回调:
# N must be divisible by batch_size
N = 40*126000 # number of time series snippets (sequences + dummies)
batch_size = 50 # processing 50 sequences at a time
class StateResetter(tf.keras.callbacks.Callback):
def on_train_batch_end(self, batch, logs={}):
# reset states if we processed a set of sequences
if (batch+1) % 40 == 0:
self.model.get_layer('my_lstm_layer').reset_states()
# input_data.shape = (N, 25, num_features)
model.fit(input_data, labels, batch_size=batch_size,
callbacks=[StateResetter], sample_weight=sample_weight)
Run Code Online (Sandbox Code Playgroud)
我想您应该能够弄清楚如何相应地调整 input_data 。