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 个表示句子的结尾。
当然,您可能会反对“如果我的序列长度不同怎么办?” 这是一种常见的情况。
两种最常见的解决方案是:
用空元素填充您的序列。例如,如果最长的句子有 15 个单词,则将上面的句子编码为“[Tom] [has] [a] [black] [and] [ugly] [cat] [EOS] [] [] [] [] [] [] []",其中 EOS 代表句尾。突然,您的所有序列长度都变为 15,这解决了您的问题。一旦找到 [EOS] 代币,该模型将很快了解到它后面是无限序列的空代币 [],这种方法几乎不会对您的网络造成负担。
发送等长的小批量。例如,在所有句子上用 2 个单词训练网络,然后用 3 个,然后用 4 个。 当然,seq_len 会在每个 minibatch 时增加,每个 minibatch 的大小将根据长度为 N 的序列的数量而变化你有你的数据。
两全其美的方法是将您的数据分成大小大致相同的小批量,按大致长度对它们进行分组,并仅添加必要的填充。例如,如果您将长度为 6、7 和 8 的句子小批量处理在一起,那么长度为 8 的序列将不需要填充,而长度为 6 的序列只需要 2 个。 如果您有一个包含长度变化很大的序列的大型数据集,这是最好的办法。
不过,选项 1 是最简单(也是最懒惰)的方法,并且在小型数据集上效果很好。
最后一件事......总是在最后填充你的数据,而不是在开始。
我希望这有帮助。
| 归档时间: |
|
| 查看次数: |
2023 次 |
| 最近记录: |