关闭。这个问题需要更多 focused .它目前不接受答案。
想改进这个问题?更新问题,使其仅关注一个问题 editing this post .
1年前关闭。
Improve this question
我正在经历这个tutorial在 RNN/LSTM 上,我很难理解有状态的 LSTM。我的问题如下:
1.训练批量大小
在 RNNs 上的 Keras 文档中,我发现i
中样本的隐藏状态批处理中的第 - 个位置将作为 i
中样本的输入隐藏状态提供- 下一批中的第一个位置。这是否意味着如果我们想将隐藏状态从一个样本传递到另一个样本,我们必须使用大小为 1 的批处理,从而执行在线梯度下降?有没有办法在大小>1的批处理中传递隐藏状态并对该批处理执行梯度下降?
2. 单字符映射问题
在教程的段落“单字符到单字符映射的有状态 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, (1, len(seed), 1))
x = x / float(len(alphabet))
prediction = model.predict(x, verbose=0)
index = numpy.argmax(prediction)
print(int_to_char[seed[0]], "->", int_to_char[index])
seed = [index]
model.reset_states()
and these outputs:
M -> B
New start: M E
E -> C
C -> D
D -> E
E -> F
It looks like the LSTM did not learn the alphabet but just the positions of the letters, and that regardless of the first letter we feed in, the LSTM will always predict B since it's the second letter, then C and so on.
因此,将先前的隐藏状态作为当前隐藏状态的初始隐藏状态如何帮助我们学习,因为在测试期间,如果我们以字母“K”开头,例如,字母 A 到 J 之前不会被输入并且初始隐藏状态不会与训练期间相同?
3. 在一本书上训练一个 LSTM 来生成句子
我想在一整本书上训练我的 LSTM 以学习如何生成句子,也许还学习作者的风格,我怎样才能自然地在该文本上训练我的 LSTM(输入整个文本并让 LSTM 找出单词之间的依赖关系) 而不是自己“人为地”从那本书中创建成批的句子来训练我的 LSTM?我相信我应该使用有状态的 LSTM 会有所帮助,但我不确定如何。
最佳答案
reset_states()
)。另一方面,无状态模型将在每次处理批处理时使用初始零状态,因此就好像您总是在 reset_states()
、 train_on_batch
和 test_on_batch
之后调用 predict_on_batch
。关于状态被重用于下一批有状态模型的解释就是与无状态模型的区别。当然,状态将始终在批处理中的每个序列中流动,并且您不需要有大小为 1 的批处理来发生这种情况。我看到有状态模型有用的两种情况:return_sequences=True
和TimeDistributed layers)。如果您想确定作者,您的输出可能是 softmax Dense layer 。希望有帮助。
关于deep-learning - 理解有状态的 LSTM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41695117/