你如何实现可变长度的递归神经网络?

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)?

什么是可变长度的参数,方法重载,递归

如何在 TensorFlow 中实现递归神经网络?

递归神经网络RNN怎样加速?看PyTorch如何进行动态批处理

找出一个可变长度的字符串?