Зацикливаясь на pytorch LSTM - PullRequest
0 голосов
/ 03 июля 2019

Я тренирую модель seq2seq для машинного перевода в pytorch.Я хотел бы собирать состояние ячейки на каждом временном шаге, сохраняя при этом гибкость нескольких слоев и двунаправленность, которую вы можете найти, например, в модуле LSTM pytorch.

Для этого у меня есть следующий кодер и метод пересылки, где я зацикливаюсь на модуле LSTM.Проблема в том, что модель не очень хорошо тренируется.Сразу после завершения цикла вы можете увидеть нормальный способ использования модуля LSTM, и с этим модель тренируется.

Итак, не является ли цикл правильным способом сделать это?

class encoder(nn.Module):
    def __init__(self, input_dim, emb_dim, hid_dim, n_layers, dropout):
        super().__init__()

        self.input_dim = input_dim
        self.emb_dim = emb_dim
        self.hid_dim = hid_dim
        self.n_layers = n_layers
        self.dropout = dropout

        self.embedding = nn.Embedding(input_dim, emb_dim)

        self.rnn = nn.LSTM(emb_dim, hid_dim, n_layers, dropout = dropout)

        self.dropout = nn.Dropout(dropout)

    def forward(self, src):

        #src = [src sent len, batch size]

        embedded = self.dropout(self.embedding(src))

        #embedded = [src sent len, batch size, emb dim]
        hidden_all = []

        for i in range(len(embedded[:,1,1])):
            outputs, hidden = self.rnn(embedded[i,:,:].unsqueeze(0))
            hidden_all.append(hidden)



        #outputs, hidden = self.rnn(embedded)

        #outputs = [src sent len, batch size, hid dim * n directions]
        #hidden = [n layers * n directions, batch size, hid dim]
        #cell = [n layers * n directions, batch size, hid dim]
        None
        #outputs are always from the top hidden layer

        return hidden

1 Ответ

0 голосов
/ 03 июля 2019

Хорошо, поэтому исправление очень простое, вы можете просто запустить первый шаг времени снаружи, чтобы получить скрытый кортеж для ввода в модуль LSTM.

...