Pytorch:缺失层和压缩序列

时间:2018-07-07 21:18:55

标签: python python-3.x pytorch

(PyTorch 0.4.0)

一个人如何对打包序列(特别是在GPU上的LSTM中)应用手动退出层?直接传递打包序列(来自lstm层)不起作用,因为退出层不知道如何处理它,并返回非打包序列。传递压缩序列的数据似乎应该可以,但是会导致代码示例下方显示属性错误。

    def __init__ (self, ....):
        super(Model1, self).__init__()
        ....
        self.drop = torch.nn.Dropout(p=0.5, inplace=False)

    def forward(self, inputs, lengths):
        pack1 = nn.utils.rnn.pack_padded_sequence(inputs, lengths, batch_first=True)
        out1, self.hidden1 = self.lstm1(pack1, (self.hidden1[0].detach(), self.hidden1[1].detach()))
        out1.data = self.drop(out1.data)

结果是:

 AttributeError: can't set attribute

反过来说,我可以使它成为就地操作(再次直接针对数据,而不是完整的打包序列),并且从技术上讲它可以在CPU上运行(即运行),但是会在GPU上发出警告操作正在修改所需的梯度。这使我不确定CPU版本是否正确运行(是吗?是否缺少警告?这不是我第一次抓到PyTorch默默地做着它应该标记警告的事情),无论如何,GPU支持是至关重要的

所以:

  • CPU和GPU之间的行为是否有所不同?
  • 在GPU上执行此操作的总体正确方法是什么?
  • 在CPU上执行此操作的总体正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用pad_packed_sequence

def forward(self, inputs, lengths):
        pack1 = nn.utils.rnn.pack_padded_sequence(inputs, lengths, batch_first=True)
        out1, self.hidden1 = self.lstm1(pack1, (self.hidden1[0].detach(), self.hidden1[1].detach()))
        out1, _ = nn.utils.rnn.pad_packed_sequence(out1, batch_first=True) 
        out1 = self.drop(out1)