训练RNN后,保存最终的state
是否有意义,以便它是测试的初始状态?
我正在使用:
stacked_lstm = rnn.MultiRNNCell([rnn.BasicLSTMCell(n_hidden,state_is_tuple=True) for _ in range(number_of_layers)], state_is_tuple=True)
答案 0 :(得分:3)
state
具有非常明确的含义和目的。这不是一个可取的问题"或不,这里有正确和错误的答案,这取决于您的数据。
考虑数据序列中的每个时间步长。在第一次执行时,您的state
应初始化为全零。该值具有特定含义,它告诉网络这是序列的开始。
在每个时间步,RNN正在计算新状态。张量流中的MultiRNNCell实现隐藏了这一点,但在该函数内部,每个时间步计算一个新的隐藏状态并向前传递。
第二时间步state
的值是第一时间步state
的输出,依此类推。
因此,如果下一批次从上一批次继续进行,那么您的问题的答案是肯定的 。让我用你做的几个例子来解释这个,并且不要分别执行这个操作。
示例1:让我们假设您正在训练角色RNN,这是一个常见的教程示例,其中您的输入是莎士比亚作品中的每个角色。这个序列中有100万个字符。你不能训练一个很长的序列。因此,您将序列分成100段(如果您不知道为什么要这样做,否则将序列限制为大约100个时间步长)。在此示例中,每个训练步骤是100个字符的序列,并且是最后100个字符的延续。所以你必须将状态推进到下一个训练步骤。
示例2:此处不使用的是训练RNN识别MNIST手写数字。在这种情况下,您将图像分成28行28像素,每个训练只有28个时间步长,图像中每行一个。在这种情况下,每个训练迭代在该图像的序列的开始处开始并且完全训练直到该图像的序列的结束。在这种情况下,你不会向前隐藏状态,你的隐藏状态必须从零开始告诉系统这是新图像序列的开始,而不是你训练的最后一个图像的延续。 / p>
我希望这两个例子说明那里的重要区别。要知道如果你的序列长度非常长(例如超过~100次步长),你需要将它们分解并考虑适当地推进状态的过程。您无法有效地训练无限长的序列长度。如果您的序列长度低于此粗略阈值,那么您不必担心此细节,并始终将您的状态初始化为零。
同样要知道,即使你一次只训练100次,RNN仍然可以学习在更长的序列上运行的模式,Karpathy的神话般的论文/博客"不合理的有效性RNNs"很好地展示了这一点。这些角色级别的RNN可以跟踪重要的细节,例如报价是否打开数百个字符,远远超过一批中训练过的,特别是因为隐藏状态以适当的方式继续进行。