我正在阅读有关RNN/LSTM的本教程,我很难理解有状态的LSTM.我的问题如下:
在关于RNN的Keras文档中,我发现i批次中位于样本中的样本的隐藏状态将作为输入隐藏状态提供i给下一批中的样本.这是否意味着如果我们想要将隐藏状态从样本传递到样本,我们必须使用大小为1的批次,因此执行在线梯度下降?有没有办法在批量> 1的批次中传递隐藏状态并在该批次上执行梯度下降?
在教程的段落中,"一个字符到一个字符映射的状态LSTM"被给出了一个代码,该代码使用batch_size = 1并stateful = True学习在给定字母表字母的情况下预测字母表的下一个字母.在代码的最后部分(第53行到完整代码的结尾),模型以随机字母('K')开始测试并预测'B'然后给出'B'它预测'C'等等除了'K'之外,它似乎运作良好.但是,我尝试了下面的代码调整(最后一部分,我保持52行及以上):
# demonstrate a random starting point
letter1 = "M"
seed1 = [char_to_int[letter1]]
x = numpy.reshape(seed, (1, len(seed), 1))
x = x / float(len(alphabet))
prediction = model.predict(x, verbose=0)
index = numpy.argmax(prediction)
print(int_to_char[seed1[0]], "->", int_to_char[index])
letter2 = "E"
seed2 = [char_to_int[letter2]]
seed = seed2
print("New start: ", letter1, letter2)
for i in range(0, 5):
x = numpy.reshape(seed, …Run Code Online (Sandbox Code Playgroud) 我目前正在编写用于循环网络训练的Keras 教程,但我无法理解有状态 LSTM 概念。为了使事情尽可能简单,序列具有相同的长度seq_length。据我所知,输入数据是有形状的(n_samples, seq_length, n_features),然后我们在n_samples/M批量大小上训练我们的 LSTM M,如下所示:
对于每批:
(seq_length, n_features)输入二维张量,并为每个输入二维张量计算梯度在本教程的示例中,输入 2D 张量是输入seq_length编码为长度向量的字母大小序列n_features。但是,教程说在 LSTM 的 Keras 实现中,在输入整个序列(2D-张量)后不会重置隐藏状态,而是在输入一批序列以使用更多上下文之后。
为什么保持先前序列的隐藏状态并将其用作我们当前序列的初始隐藏状态可以改善我们测试集的学习和预测,因为在进行预测时“先前学习”的初始隐藏状态将不可用?此外,Keras 的默认行为是在每个 epoch 开始时打乱输入样本,以便在每个 epoch 更改批处理上下文。这种行为似乎与通过批处理保持隐藏状态相矛盾,因为批处理上下文是随机的。