首页 文章

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

提问于
浏览
2

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

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

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 回答

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

    要么

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

相关问题