PyTorch LSTM 输入维度

Shw*_*Cat 7 python machine-learning lstm pytorch

我正在尝试使用 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 个单元?

谢谢!

小智 9

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

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

第一个参数是这些序列的长度。如果你的序列数据是由句子组成的,那么“Tom has a black and beautiful cat”是一个长度为 7 (seq_len) 的序列,每个单词一个,也许第 8 个表示句子的结尾。

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

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

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

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

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

不过,选项 1 是最简单(也是最懒惰)的方法,并且在小型数据集上效果很好。

最后一件事......总是在最后填充你的数据,而不是在开始。

我希望这有帮助。

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