【发布时间】:2019-05-26 01:49:42
【问题描述】:
我是 LSTM 的新手,并且正在浏览 Understanding Keras LSTMs,并且对 Daniel Moller 的漂亮答案有一些愚蠢的疑问。
以下是我的一些疑问:
-
Achieving one to many部分指定了 2 种方法,其中写道,我们可以使用stateful=True循环获取一个步骤的输出并将其作为下一步的输入(需要 output_features == input_features)。在
One to many with repeat vector图中,重复向量在所有时间步中作为输入提供,而在One to many with stateful=True中,输出在下一个时间步中作为输入提供。那么,我们不是通过使用stateful=True来改变层的工作方式吗?在构建 RNN 时应遵循上述两种方法中的哪一种(使用重复向量或将前一个时间步长输出作为下一个输入)?
-
在
One to many with stateful=True部分下,要改变one to many的行为,在手动循环预测的代码中,我们如何知道steps_to_predict变量,因为我们事先不知道输出序列长度。我也不明白整个模型使用
last_step output生成next_step ouput的方式。它让我对model.predict()函数的工作感到困惑。我的意思是,model.predict()不是同时预测整个输出序列,而不是循环通过要生成的no. of output sequences(我仍然不知道其值)并执行model.predict()来预测特定的时间步长在给定的迭代中输出? 我无法理解整个
Many to many案例。任何其他链接都会有所帮助。-
我了解我们使用
model.reset_states()来确保新批次独立于前一批。但是,我们是否手动创建序列批次,以便一个批次跟随另一批次,或者Keras在stateful=True模式下自动将序列划分为这样的批次。如果是手动完成,为什么会有人将数据集分成这样的批次,其中一个序列的一部分在一个批次中,另一个在下一个批次中?
最后,
stateful=True将被使用的实际实现或示例/用例是什么(因为这似乎很不寻常)?我正在学习 LSTM,这是我第一次被介绍给 Keras 中的stateful。
谁能帮我解释一下我的愚蠢问题,以便我可以清楚地了解 Keras 中的 LSTM 实现吗?
编辑:询问其中一些是为了澄清当前的答案,还有一些是为了解决剩余的疑问
一个。所以,基本上有状态让我们keep OR reset 每批之后的内部状态。那么,如果我们在每批训练后一次又一次地重置内部状态,模型将如何学习?重置真的意味着重置参数(用于计算隐藏状态)吗?
B。在If stateful=False: automatically resets inner state, resets last output step 行中。重置最后一个输出步骤是什么意思?我的意思是,如果每个时间步都产生自己的输出,那么重置最后一个输出步骤意味着什么?也只有最后一个?
C。针对Question 2 和Question 4 的第二点,我仍然没有得到你的manipulate the batches between each iteration 和stateful((Question 2 的最后一行)的需要,它只重置了状态)。我的意思是,我们不知道时间步长中生成的每个输出的输入。
因此,您将序列分解为only one-step 的序列,然后使用new_step = model.predict(last_step),但是您怎么知道您需要一次又一次地执行此操作多长时间(循环必须有一个停止点) ?另外,请解释stateful 部分(在Question 2 的最后一行)。
D。在One to many with stateful=True 下的代码中,似乎 for 循环(手动循环)用于预测下一个单词仅在测试时使用。模型是否在训练时合并了该事物本身,还是我们manually 也需要在训练时使用此循环?
E。假设我们正在做一些 机器翻译 工作,我认为在整个输入(要翻译的语言)被输入到输入时间步然后生成输出(翻译的语言) 在每个时间步将通过manual loop 进行,因为现在我们结束了输入并开始使用迭代在每个时间步产生输出。我做对了吗?
F。由于 LSTM 的默认工作需要答案中提到的 3 件事,所以在序列中断的情况下,current_input 和 previous_output 是否提供相同的向量,因为它们在没有当前输入可用的情况下的值是相同的?
G。在 Predicting: 部分下的 many to many with stateful=True 下,代码如下:
predicted = model.predict(totalSequences)
firstNewStep = predicted[:,-1:]
由于finding the very next word in the current sequence的手动循环到现在都没有用过,我怎么知道model.predict(totalSequences)已经预测的时间步长的count,以便预测的最后一步(predicted[:,-1:]) 稍后将用于生成其余的序列?我的意思是,我怎么知道predicted = model.predict(totalSequences)在manual for loop之前已经产生了多少个序列(后面用到)。
编辑 2:
我。在D 回答中,我仍然没有得到如何训练我的模型?我知道使用手动循环(在训练期间)可能会很痛苦,但是如果我不使用它,模型将如何在we want the 10 future steps, we cannot output them at once because we don't have the necessary 10 input steps 的情况下得到训练?只需使用model.fit() 就能解决我的问题吗?
二。 D 答案的最后一段,You could train step by step using train_on_batch only in the case you have the expected outputs of each step. But otherwise I think it's very complicated or impossible to train.。
你能详细解释一下吗?
step by step 是什么意思?如果我没有或有后面序列的输出,这将如何影响我的训练?在训练期间我还需要手动循环吗?如果没有,那么model.fit() 函数会按预期工作吗?
III。我将"repeat" option 解释为使用repeat vector。使用重复向量对one to many 的情况不是很好,不适合many to many 的情况,因为后者将有许多输入向量可供选择(用作单个重复向量)?您将如何将repeat vector 用于many to many 案例?
【问题讨论】:
-
请查看更新后的答案。
标签: keras deep-learning lstm recurrent-neural-network