- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在长字符序列中标记字母。数据的固有结构要求我使用双向方法。
此外基于on this idea我需要在每个时间步访问隐藏状态,而不仅仅是最后一个。
为了尝试这个想法,我使用了固定长度的方法。我目前在更长的序列中使用一批随机的片段,每个片段都是 60 个字符,并使用 zero_state
运行我手工制作的双向分类器。正在initial_state
每 60 个字母。
这工作得很好,但显然并不完美,因为实际上序列更长,并且我从原始来源随机剪切的片段的左右信息丢失了。
现在为了推进,我想处理整个序列。但它们的长度差异很大,我无法将整个序列(进一步批处理)放入 GPU。
我在 dynamic_rnn documentation 中找到了 swap_memory - 参数.那会有帮助吗?
我没有找到任何有助于我理解的进一步文档。而且我自己真的不能轻易尝试这个,因为我需要在每个时间步访问隐藏状态,因此我在不使用任何更高级别的包装器(例如 dynamic_rnn)的情况下对当前图进行了编码。尝试这个需要我从包装器中获取所有中间状态,据我所知,这是很多工作要做。
在经历尝试这个的麻烦之前,我很想确定这确实能解决我的内存问题。谢谢你的任何提示!
最佳答案
TL;博士: swap_memory
不会让您使用伪无限序列,但它会帮助您在内存中容纳更大(更长、更宽或更大批量)的序列。伪无限序列有一个单独的技巧,但它仅适用于单向 RNN。
交换内存
在训练过程中,NN(包括 RNN)通常需要在内存中保存一些激活——它们需要用于计算梯度。
什么 swap_memory
确实是它告诉您的 RNN 将它们存储在主机 (CPU) 内存而不是设备 (GPU) 内存中,并在需要它们时将它们流回 GPU。
实际上,这可以让您假装您的 GPU 拥有比实际更多的内存(以 CPU 内存为代价,而 CPU 内存往往更充足)
您仍然需要支付计算使用非常长的序列的成本。更不用说您可能会耗尽主机内存。
要使用它,只需为该参数指定值 True
.
序列长度
如果您的序列长度不同,请使用此参数。 sequence_length
有一个误导性的名字——它实际上是一个序列长度的数组 s .
如果所有序列的长度相同(max_time
参数),您仍然需要尽可能多的内存
tf.nn.bidirectional_dynamic_rnn
TF 包括双向 RNN 的现成实现,因此使用它而不是自己的可能更容易。
有状态的 RNN
训练时处理很长的序列单向 RNN,人们做 别的 : 他们保存了 最后 每个批次的隐藏状态,并将它们用作 初始 下一批的隐藏状态(为此,下一批必须由前一批序列的延续组成)
这些线程讨论了如何在 TF 中完成此操作:
TensorFlow: Remember LSTM state for next batch (stateful LSTM)
How do I set TensorFlow RNN state when state_is_tuple=True?
关于tensorflow - dynamic_rnn 中的swap_memory 允许准无限序列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44049192/
我是一名优秀的程序员,十分优秀!