Python Pytorch:退出层和压缩序列
(PyTorch 0.4.0) 如何将手动退出层应用于压缩序列(特别是GPU上的LSTM)?直接传递压缩序列(来自lstm层)不起作用,因为退出层不知道如何处理它,并且返回一些非压缩序列的内容。传递压缩序列的数据似乎应该有效,但会导致代码示例下面显示的属性错误Python Pytorch:退出层和压缩序列,python,python-3.x,pytorch,Python,Python 3.x,Pytorch,(PyTorch 0.4.0) 如何将手动退出层应用于压缩序列(特别是GPU上的LSTM)?直接传递压缩序列(来自lstm层)不起作用,因为退出层不知道如何处理它,并且返回一些非压缩序列的内容。传递压缩序列的数据似乎应该有效,但会导致代码示例下面显示的属性错误 def __init__ (self, ....): super(Model1, self).__init__() .... self.drop = torch.nn.Dropout
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版本是否正常工作没有信心(是吗?它是否缺少警告?这不是我第一次看到Pytork在默默地做它应该标记警告的事情),而且在任何情况下,GPU支持都是至关重要的
因此:
- CPU和GPU之间的行为是否有所不同
- 在GPU上执行此操作的总体正确方法是什么
- 在CPU上执行此操作的总体正确方法是什么
pad\u-packed\u-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)
您可以使用
pad_packeted_sequence
重新填充它,它将返回lstm的填充输出和长度。然后你将退出应用到输出中。@blckbird我可以发誓我试过了,结果很糟糕,但在一次新的调查中,它似乎奏效了。不管怎样,运行时没有错误。仍然似乎太麻烦而不是预期的方法。@blckbird工作得很好,如果你想把它作为一个答案写下来,我会投赞成票,尽管我可能不会马上接受,希望找到一个更简单、更自然的解决方案。重要的补充:辍学层应该被定义为原地踏步,或者这不能正常工作。