6

我有一个 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 的原因是输入的长度可变。填充不会破坏目的吗?小批量训练需要填充吗?

4

1 回答 1

6

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

通常一个人会做。

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会失败。所以确实你必须做的是用零填充你的序列,以便它们都具有相同的长度(至少在小批量中)。所以你有2个选择:

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

或者

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

于 2018-02-22T08:37:39.840 回答