(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支持是至关重要的
所以:
答案 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)