Pythorch:漏层和压缩序列

2024-04-25 22:06:51 发布

您现在位置:Python中文网/ 问答频道 /正文

(Pythorch 0.4.0)

如何对压缩序列(特别是在GPU上的LSTM中)应用手动释放层?直接传递压缩序列(来自lstm层)不起作用,因为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)

这将导致:

^{pr2}$

反常的是,我可以使这是一个就地操作(再次,直接对数据,而不是完整的压缩序列),并且它在技术上在CPU上工作(即,它运行),但在GPU上发出警告,说明就地操作正在修改所需的梯度。这让我对CPU版本是否正常工作没有信心(是吗?是不是漏了个警告?这不是我第一次看到Pythorch默默地在做一些它应该发出警告的事情)而且在任何情况下GPU的支持都是至关重要的

所以:

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

Tags: 数据self警告gpuinitdef序列nn
1条回答
网友
1楼 · 发布于 2024-04-25 22:06:51

您可以使用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)

相关问题 更多 >