针对可变尺寸输入的微型批量培训

时间:2018-02-14 21:23:33

标签: python neural-network deep-learning pytorch autograd

我有一个LongTensors列表和另一个标签列表。我是PyTorch和RNN的新手,所以我对如何对我拥有的数据实施小批量培训感到很困惑。这些数据还有很多,但我想保持简单,所以我只能理解如何实现minibatch培训部分。我根据在可变长度输入上训练的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的原因是因为输入的长度可变。没有填充失败的目的?是否需要填充培训?

1 个答案:

答案 0 :(得分:2)

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

通常人们会这样做。

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)在最开始时,用初始零填充所有序列,使它们都具有与所有数据的最长序列相同的长度。

OR

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