gpt4 book ai didi

python - Pytorch:丢失层和打包序列

转载 作者:行者123 更新时间:2023-12-01 09:16:19 26 4
gpt4 key购买 nike

(PyTorch 0.4.0)

如何将手动 dropout 层应用于打包序列(特别是在 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)

这会导致:

 AttributeError: can't set attribute

反常的是,我可以将其设为就地操作(同样,直接对数据进行操作,而不是完整打包的序列),并且从技术上讲,它可以在 CPU 上运行(即运行),但会在 GPU 上发出警告,表明就地操作操作是修改所需的梯度。这让我对 CPU 版本能否正常工作没有信心(是吗?它是否缺少警告?这不是我第一次发现 PyTorch 默默地做一些它应该标记警告的事情),并且在任何情况下 GPU 支持都是至关重要

所以:

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

最佳答案

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

关于python - Pytorch:丢失层和打包序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51227017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com