Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pytorch:退出层和压缩序列_Python_Python 3.x_Pytorch - Fatal编程技术网

Python Pytorch:退出层和压缩序列

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

(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版本是否正常工作没有信心(是吗?它是否缺少警告?这不是我第一次看到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工作得很好,如果你想把它作为一个答案写下来,我会投赞成票,尽管我可能不会马上接受,希望找到一个更简单、更自然的解决方案。重要的补充:辍学层应该被定义为原地踏步,或者这不能正常工作。