你如何实现可变长度的递归神经网络?
Posted
技术标签:
【中文标题】你如何实现可变长度的递归神经网络?【英文标题】:How do you implement variable-length recurrent neural networks? 【发布时间】:2017-11-22 09:36:37 【问题描述】:什么是循环神经网络 (RNN) 中可变长度序列输入的完整工作示例(不是 sn-ps)?
例如,据称 PyTorch 可以实现可变长度序列作为 RNN 的输入,但似乎没有完整工作代码的示例。
相关: https://github.com/pytorch/pytorch/releases/tag/v0.1.10 https://discuss.pytorch.org/t/about-the-variable-length-input-in-rnn-scenario/345
【问题讨论】:
【参考方案1】:遗憾的是,没有“可变长度”神经网络这样的东西。这是因为网络无法“知道”哪些权重用于未经过训练的额外输入节点。
但是,您在该页面上看到“可变长度”的原因是因为它们处理:
a b c d e
a b c d e f g h
a b c d
a b
作为
a b c d e 0 0 0
a b c d e f g h
a b c d 0 0 0 0
a b 0 0 0 0 0 0
它们将所有“空”变量转换为0
。这是有道理的,因为0
不会在网络隐藏层中添加任何东西,无论权重如何,如anything*0 = 0
。
所以基本上,您可以有“可变长度”输入,但您必须定义某种最大尺寸;所有小于该大小的输入都应该用零填充。
另一方面,如果您要对句子进行分类,则可以使用 LSTM/GRU 网络按顺序处理输入。
【讨论】:
你写的部分不正确。 RNN 旨在处理可变输入。它不是网络的限制,而是张量的限制(由 pytorch 设计)。如果您在每个训练步骤中执行单个样本(通过使批量大小 = 1),您仍然可以将变量输入传递给 pytorch 中的 RNN,而无需任何填充。如果你想处理一个小批量,填充就会发挥作用,因为从技术上讲,张量的任何维度都不能具有可变大小,所以你必须求助于填充。 这没有回答问题。显然,RNN 支持可变长度序列,根据网站:“nn.RNN、nn.LSTM、nn.GRU 现在支持序列长度可变的小批量。” 循环神经网络中的可变长度输入并不是指每个样本的大小可变,而是等长输入序列的大小可变。想象一下学习单词序列——你需要在切换到一个新句子时重新设置权重。句子可以是可变长度的以上是关于你如何实现可变长度的递归神经网络?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UITableView 中优雅地处理来自网络的可变长度文本?
TensorFlow:如何使用具有可变输入长度的 CudnnLSTM(如 dynamic_rnn)?