Pytorch: выпадающие слои и упакованные последовательности

Novak спросил: 13 июня 2018 в 07:38 в: python

(PyTorch 0.4.0)

Как применить ручной отсеивающий слой к упакованной последовательности (в частности, в 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

Извратно, я могу сделать эту операцию inplace (опять же, по данным напрямую, а не по полной упакованной последовательности), и она технически работает (т. е. работает) на CPU, но дает предупреждение на GPU, что операция inplace изменяет необходимый градиент. Это не дает мне уверенности в том, что версия процессора работает правильно (не так ли? Нет ли предупреждения? Не было бы впервые, когда я поймал PyTorch, тихонько перебирая, делая что-то, на что он должен отмечать предупреждение), и в любом случае поддержка GPU vital

Итак:

  • Ожидаются ли разные типы поведения процессора и графического процессора?
  • Каков общий правильный способ сделать это на GPU?
  • Каков общий правильный способ сделать это на процессоре?

1 ответ

blckbird ответил: 15 июня 2018 в 08:36

Вы можете использовать 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)

Дополнительное видео по вопросу: Pytorch: выпадающие слои и упакованные последовательности

21.Python для Начинающих - Использование JSON

Алгоритмы на Python 3. Лекция №1

17.Python для Начинающих - Классы Часть1