PyTorch LSTM 输入维度

Posted

技术标签:

【中文标题】PyTorch LSTM 输入维度【英文标题】:PyTorch LSTM input dimension 【发布时间】:2019-10-23 16:11:49 【问题描述】:

我正在尝试使用 PyTorch LSTM 训练一个简单的 2 层神经网络,但无法解释 PyTorch 文档。具体来说,我不太确定如何处理我的训练数据的形状。

我想要做的是通过小批量在一个非常大的数据集上训练我的网络,其中每个批次的长度为 100 个元素。每个数据元素将有 5 个特征。文档指出层的输入应该是形状(seq_len、batch_size、input_size)。我应该如何塑造输入?

我一直在关注这个帖子:https://discuss.pytorch.org/t/understanding-lstm-input/31110/3 如果我解释正确,每个小批量应该是形状(100、100、5)。但是在这种情况下,seq_len 和batch_size 有什么区别呢?另外,这是否意味着输入 LSTM 层的第一层应该有 5 个单元?

谢谢!

【问题讨论】:

【参考方案1】:

这是一个老问题,但由于它已经被查看了 80 多次没有回应,让我来破解它。

LSTM 网络用于预测序列。在 NLP 中,这将是一个单词序列;在经济学中,一系列经济指标;等等

第一个参数是这些序列的长度。如果你的序列数据是由句子组成的,那么“汤姆有一只又黑又丑的猫”是一个长度为 7 (seq_len) 的序列,每个单词一个,可能还有一个 8 表示句子的结尾。

当然,您可能会反对“如果我的序列长度不同怎么办?”这是一种常见的情况。

两种最常见的解决方案是:

    用空元素填充序列。例如,如果你最长的句子有 15 个单词,那么将上面的句子编码为“[Tom] [has] [a] [black] [and] [ugly] [cat] [EOS] [] [] [] [] [] [] []",其中 EOS 代表句子的结尾。突然,你所有的序列长度都变成了 15,这就解决了你的问题。一旦找到 [EOS] 代币,模型就会很快了解到它后面跟着无限序列的空代币 [],这种方法几乎不会对您的网络造成负担。

    发送相同长度的小批量。例如,在所有句子上用 2 个词训练网络,然后用 3 个词,然后用 4 个词。当然,seq_len 会在每个小批量增加,每个小批量的大小会根据长度为 N 的序列的数量而变化你有你的数据。

两全其美的方法是将您的数据分成大小大致相等的小批量,按近似长度分组,并仅添加必要的填充。例如,如果您对长度为 6、7 和 8 的句子进行小批量处理,则长度为 8 的序列将不需要填充,而长度为 6 的序列将只需要 2。如果您有一个包含长度变化很大的序列的大型数据集,这是最好的方法。

不过,选项 1 是最简单(也是最懒惰)的方法,并且适用于小型数据集。

最后一件事...始终在末尾而不是开头填充数据。

希望对你有帮助。

【讨论】:

我认为问题是关于数据的形状,即如何解释维度要求并将其应用于 OP 的数据。我有完全相同的问题(似乎每个人都有),但那里没有好的答案。大多数尝试在他们的示例中使用随机生成的数据,使得示例对理解几乎毫无用处。确实存在的那些示例通常是文本序列,并且没有尝试推广到不同类型/形状的数据。如果你能认真回答,我会很高兴的!

以上是关于PyTorch LSTM 输入维度的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch-LSTM

pytorch输出与target维度不同

详解pytorch CNN操作

PyTorch笔记 - LSTM(Long Short-Term Memory) 和 LSTMP(Projection)

PyTorch笔记 - LSTM(Long Short Term Memory) 和 LSTMP(Projection) 网络结构

PyTorch笔记 - LSTM(Long Short Term Memory) 和 LSTMP(Projection) 网络结构