我是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有所了解吗?
编辑:请其中一些人澄清当前答案,并提出一些剩余疑问
A 。因此,基本上有状态让我们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
的需求(({{1}的最后一行)仅重置状态)。我要指出的是,我们不知道某个时间步生成的每个输出的输入。
因此,您将序列分解为Question 2
的序列,然后使用only one-step
,但随后又如何知道需要一次又一次的操作(必须有一个停止点)为循环)?另外,请说明new_step = model.predict(last_step)
部分(在stateful
的最后一行)。
D 。在Question 2
下的代码中,似乎for循环(手动循环)用于预测下一个单词仅用于测试时间。该模型是在火车时刻本身包含了该东西吗?还是我们One to many with stateful=True
是否需要在火车时刻也使用此循环?
E 。假设我们正在做一些机器翻译工作,我认为在将整个输入(要翻译的语言)输入到输入时间步长然后生成输出(翻译的语言)之后,序列的破坏就会发生)将通过manually
在每个时间步进行,因为现在我们得到了输入,并开始使用迭代在每个时间步产生输出。我说对了吗?
F 。由于LSTM的默认工作方式需要在答案中提到三点,因此在中断序列的情况下,manual loop
和current_input
被馈以相同的向量,因为在没有当前输入可用的情况下它们的值是一样吗?
G 。在预测:部分下的多对有状态=真的情况下,代码为:
previous_output
由于predicted = model.predict(totalSequences)
firstNewStep = predicted[:,-1:]
的手动循环到目前为止尚未使用,我怎么知道finding the very next word in the current sequence
所预测的时间步长中的count
,所以预测(model.predict(totalSequences)
)的最后一步将随后用于生成其余序列?我的意思是,我怎么知道predicted[:,-1:]
之前predicted = model.predict(totalSequences)
中产生的序列数(后来使用)。
编辑2:
我。在manual for loop
答案中,我仍然不知道如何训练模型?我知道在训练过程中使用手动循环可能会很痛苦,但是如果我不使用它,那么在D
的情况下如何训练模型?只需使用we want the 10 future steps, we cannot output them at once because we don't have the necessary 10 input steps
就能解决我的问题吗?
II 。 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
函数是否可以根据需要工作?
III 。我将model.fit()
解释为使用"repeat" option
。使用重复向量不适用于repeat vector
情况,不适用于one to many
情况,因为后者将有很多输入向量可供选择(用作单个重复向量) ?在many to many
情况下,如何使用repeat vector
?