Phi*_*ock 6 lstm tensorflow recurrent-neural-network
我试图用长字符序列标记字母.数据的固有结构要求我使用双向方法.
此外,基于这个想法,我需要在每个时间步进入隐藏状态,而不仅仅是最后一个.
为了尝试这个想法,我采用了固定长度的方法.我目前使用随机件的批量说每60个字符了我更长的时间序列,并且运行我的手工双向分类zero_state作为initial_state每个60封件.
这工作得很好,但显然不是很完美,因为实际上序列更长,并且从我从原始源中随机剪切的部分左右的信息丢失了.
现在为了推进我想要使用整个序列.它们的长度差异很大,我无法将整个序列(进一步批量)放到GPU上.
我在dynamic_rnn文档中找到了swap_memory - 参数.那会有帮助吗?
我没有找到任何有助于我理解的文档.而且我不能轻易地自己尝试这个,因为我需要在每个时间步都访问隐藏状态,因此我编写了当前图形而不使用任何更高级别的包装器(例如dynamic_rnn).尝试这一点需要我从包装器中获取所有中间状态,据我所知,这是很多工作要实现的.
在经历尝试这个问题的麻烦之前,我很想确定这确实会解决我的记忆问题.Thx任何提示!
TL; DR: swap_memory不允许您使用伪无限序列,但是它将帮助您在内存中容纳更大(更长或更宽,或者更大批量)的序列。伪无限序列有一个单独的技巧,但仅适用于单向RNN。
swap_memory
在训练期间,NN(包括RNN)通常需要在内存中保存一些激活-计算梯度需要它们。
是什么swap_memory做的是,它会告诉你RNN将它们存储在主机(CPU),存储器替代装置(GPU)的内存,并需要他们的时候流他们回到GPU。
有效地,这可以让您假装您的GPU拥有比其实际更多的内存(以CPU内存为代价,这往往更丰富)
您仍然必须支付使用非常长的序列的计算成本。更不用说您可能会用完主机内存。
要使用它,只需为该参数赋予value即可True。
sequence_length
如果序列长度不同,请使用此参数。sequence_length名称具有误导性-实际上是序列长度s的数组。
如果所有序列的长度都相同(max_time参数),则仍然需要与所需的内存一样多的内存
tf.nn.bidirectional_dynamic_rnn
TF包含双向RNN的现成实现,因此使用此RNN而不是自己的RNN可能会更容易。
有状态的RNN
为了在训练单向 RNN 时处理很长的序列,人们需要做其他事情:他们保存每个批次的最终隐藏状态,并将它们用作下一个批次的初始隐藏状态(要正常工作,下一个批次必须是由先前批次顺序的延续组成)
这些线程讨论了如何在TF中完成此操作:
TensorFlow:记住下一批的LSTM状态(有状态LSTM)
当state_is_tuple = True时如何设置TensorFlow RNN状态?
| 归档时间: |
|
| 查看次数: |
905 次 |
| 最近记录: |