可变大小输入的小批量训练

Mini batch training for inputs of variable sizes

我有一个 LongTensors 列表和另一个标签列表。我是 PyTorch 和 RNN 的新手,所以我很困惑如何为我拥有的数据实施小批量训练。这些数据还有很多,但我想保持简单,所以我只能了解如何实现小批量训练部分。我正在根据在可变长度输入上训练的 LSTM/GRU 的最终隐藏状态进行多类分类。我设法让它使用批量大小 1(基本上是 SGD),但我正在努力实现小批量。

我是否必须将序列填充到最大尺寸并创建一个更大尺寸的新张量矩阵来容纳所有元素?我的意思是这样的:

inputs = pad(sequences)
train = DataLoader(inputs, batch_size=batch_size, shuffle=True)
for i, data in train:
   #do stuff using LSTM and/or GRU models

这是对自定义数据进行小批量训练的公认方式吗?我找不到任何关于使用 DataLoader 加载自定义数据的教程(但我认为这是使用 pyTorch 创建批处理的方法?)

我的另一个疑问是关于填充。我使用 LSTM/GRU 的原因是因为输入的长度可变。填充不会破坏目的吗?小批量训练是否需要填充?

是的。对具有不同长度的序列进行小批量训练的问题是您不能将不同长度的序列堆叠在一起。

一般一个就可以了。

for e in range(epochs):
    sequences = shuffle(sequences)
    for mb in range(len(sequences)/mb_size):
        batch = torch.stack(sequences[mb*mb_size:(mb+1)*mb_size])

然后你将你的神经网络应用到你的批次上。但是因为你的序列长度不同,所以 torch.stack 会失败。所以实际上你要做的是用零填充你的序列,这样它们都具有相同的长度(至少在一个小批量中)。所以你有两个选择:

1) 在一开始,用初始零填充所有序列,使它们的长度都与所有数据的最长序列相同。

2) 对于每个小批量,在将序列堆叠在一起之前,用初始零填充所有将进入小批量的序列,以便它们的长度都与小批量的最长序列相同。