PyTorch LSTM输入维度

8
我正在尝试使用PyTorch LSTMs训练一个简单的两层神经网络,但我在解释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个回答

10

这是一个老问题,但由于它已经被浏览了80多次且没有回复,让我来试着回答一下。

在一个LSTM网络中用于预测序列。在自然语言处理(NLP)中,可以是一系列单词; 在经济学中,可以是一系列经济指标等等。

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

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

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

  1. 使用空元素填充序列。例如,如果您拥有的最长句子有15个单词,则将上面的句子编码为“[Tom] [has] [a] [black] [and] [ugly] [cat] [EOS] [] [] [] [] [] [] []”,其中EOS表示句子结尾。突然之间,您的所有序列都变成了长度为15,这解决了您的问题。只要找到[EOS]标记,模型就会迅速学习到其后是无限序列的空标记[],并且该方法几乎不会消耗您的网络资源。

  2. 发送相同长度的小批量。例如,训练网络以所有具有2个单词的句子,然后是3个单词,然后是4个单词。当然,seq_len将在每个小批量中增加,并且每个小批量的大小将根据您的数据中有多少长度为N的序列而变化。

最佳效果的方法是将您的数据分成近似大小的小批量,通过近似长度进行分组,并仅添加必要的填充。例如,如果您将长度为6、7和8的句子一起小批量处理,则长度为8的序列将不需要填充,而长度为6的序列将仅需要填充2次。如果您有一个具有广泛变化长度序列的大型数据集,那么这是最好的方法。

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

最后一件事......始终在结尾处填充您的数据,而不是在开头。

希望对你有所帮助。


3
我认为问题是关于数据形状的,即如何解释维度要求并将其应用于 OP 的数据。我有完全相同的问题(似乎每个人都有),但是没有好的答案。大多数尝试在示例中使用随机生成的数据,使这些示例几乎无法理解。那些存在的示例通常是文本序列,并且没有尝试将其推广到不同类型/形状的数据。如果您愿意尝试回答,我会很高兴! - rocksNwaves
好答案,谢谢。为什么只在末尾填充数据? - Diego Alonso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接