Tensorflow 建议保存RNN培训的最终状态,以便在测试期间对其进行初始化吗?

Tensorflow 建议保存RNN培训的最终状态,以便在测试期间对其进行初始化吗?,tensorflow,lstm,rnn,Tensorflow,Lstm,Rnn,培训RNN后,保存最终的状态是否有意义,以便它成为测试的初始状态 我正在使用: stacked_lstm=rnn.multirncell([rnn.BasicLSTMCell(n_hidden,state_is_tuple=True)对于u范围内(层数)],state_is_tuple=True)状态具有非常具体的含义和用途。这不是一个“是否明智”的问题,这里有一个正确和错误的答案,这取决于你的数据 考虑数据序列中的每个时间步。在第一个时间步,您的状态应初始化为全零。该值具有特定含义,它告诉网络

培训RNN后,保存最终的
状态
是否有意义,以便它成为测试的初始状态

我正在使用:


stacked_lstm=rnn.multirncell([rnn.BasicLSTMCell(n_hidden,state_is_tuple=True)对于u范围内(层数)],state_is_tuple=True)
状态具有非常具体的含义和用途。这不是一个“是否明智”的问题,这里有一个正确和错误的答案,这取决于你的数据

考虑数据序列中的每个时间步。在第一个时间步,您的
状态
应初始化为全零。该值具有特定含义,它告诉网络这是序列的开始

在每个时间步,RNN都在计算一个新的状态。tensorflow中的MultiRNNCell实现对您隐藏了这一点,但在该函数内部,每个时间步都会计算一个新的隐藏状态并向前传递

第二时间步的
state
值是第一时间步的
state
的输出,依此类推

因此,您的问题的答案是“是”,仅当下一批与前一批在时间上继续时。让我用两个例子来解释这一点,在这两个例子中,您分别执行和不执行此操作

示例1:假设您正在培训角色RNN,这是一个常见的教程示例,您的输入是莎士比亚作品中的每个角色。这个序列中有数百万个字符。你不能在那么长的时间里训练。因此,您将序列分成100段(如果您不知道为什么要这样做,则将序列限制在大约100个时间步)。在本例中,每个训练步骤是100个字符的序列,是最后100个字符的延续。因此,您必须将状态向前推进到下一个训练步骤

示例2:不使用此选项的地方是训练RNN识别MNIST手写数字。在本例中,您将图像分割为28行28像素,每个训练只有28个时间步,图像中每行一个。在这种情况下,每个训练迭代从该图像序列的开始处开始,并完全训练,直到该图像序列的结束。在这种情况下,隐藏状态必须以零开始,以告知系统这是新图像序列的开始,而不是您训练的最后一幅图像的继续

我希望这两个例子能够说明其中的重要区别。要知道,如果序列长度非常长(比如超过100个时间步),则需要将其分解,并仔细考虑适当推进状态的过程。你不能在无限长的序列长度上有效地训练。如果序列长度低于这个粗略的阈值,那么就不用担心这个细节,总是将状态初始化为零


还要知道,即使你一次只训练100个时间步,RNN仍然可以学习在更长序列上运行的模式,Karpath关于“RNN的不合理有效性”的精彩论文/博客完美地证明了这一点。这些字符级RNN可以跟踪数百个字符的重要细节,如引号是否打开,远远超过了一批训练的数量,特别是因为隐藏状态是以适当的方式进行的。

非常感谢您澄清了这个概念性问题。我正在尝试将RNN作为日前能源价格预测工具。输入是天气状况、以前的价格、可再生能源输出、一天中的时间等。我的培训集是一年中每天每小时的价格。测试集是随后的前一天价格事件。希望我使用RNN没有错,根据您的解释,我认为有必要通过培训的输出状态作为测试的初始状态。我仍然想知道序列长度,因为在我的例子中是~8000在训练中,你确实需要将8000的序列长度分成~100的块,在8000的序列长度中,你会有一个消失梯度问题。对于您的测试集,我将简化生命并在序列的开头用0初始化序列,您可能可以在测试集中一次计算所有8000个序列,因此无需继续隐藏状态,但是如果你不能,那么你需要在完成序列的过程中继续执行状态。如果你想变得有趣,你可以从测试数据中去掉最初的几个时间步,并使用它们来预计算隐藏状态。鉴于你没有给网络的任何先验知识为那些最初的几个步骤,你可能会认为他们不合理的测试。但老实说,这可能比实际需要的更挑剔,我可能会忽略它。你不会做的是把状态从训练带到测试,那是没有意义的。国家只与它的特定序列相联系。你给网络喂食的每个序列都有一个独特的状态。我不得不考虑一下。你不应该只使用1个时间步长进行训练,你最终只能从损失函数中得到一个梯度,在这种情况下,如果我想得对的话,你就不能从下一个时间步长中得到第二个倒转的梯度。您希望在每次更新中进行多个时间步的训练,训练越多越好,直到遇到消失梯度,100似乎是合理的(请参阅:)。为了简化生活,我会选择1个批量,每次训练100个时间步。大多数人都会选择合适的批量和大约100个时间步。但在这些情况下,还必须处理可变长度序列(),