【问题标题】:Mini batch training for inputs of variable sizes可变大小输入的小批量训练
【发布时间】:2018-07-25 13:46:40
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

一般情况下会这样。

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) 在运行中,对于每个 minibatch,在将序列堆叠在一起之前,用初始零填充将进入 minibatch 的所有序列,以便它们都具有与 minibatch 的最长序列相同的长度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-17
    • 2017-10-25
    • 1970-01-01
    • 2018-02-21
    • 2016-11-15
    • 2012-03-15
    • 1970-01-01
    • 2018-09-26
    相关资源
    最近更新 更多