Как выполнить развертывание RNN в pytorch - PullRequest
0 голосов
/ 18 мая 2018

Я обучил RNN (точнее, GRU) быть языковой моделью примерно следующим образом:

inputs = [<start>, tok1, tok2, tok3, . . .]

outputs = [tok1, tok2, tok3, . . .]

h0 = initial state of all-zeros

gru_outputs, hn = gru(inputs, h0)

cost = loss (gru_outputs, outputs)

По существу, во время обучения есть ввод "руководства", где я кормлю в target токен от последнего шага к текущему шагу (учитель заставляет?).

Теперь этот RNN хорошо тренируется и сходится.Но я понятия не имею, как на самом деле использовать для генерации последовательности с нуля.Поскольку gru ожидает явного входного аргумента, как мне сказать, чтобы он использовал свой собственный вывод из последнего шага, не давая ему ввода?

По сути, я хочу

roll_out = gru(h0, step_number = 10)

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

полный код в этой сущности, если он имеет какое-либо применение: https://gist.github.com/evanthebouncy/b5039dc72d3d9fea66dad3306e479e6b

спасибо!

- Эван

1 Ответ

0 голосов
/ 19 мая 2018

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

Вот пример кода, как это может выглядеть:

# Test the model
with torch.no_grad():
    with open('sample.txt', 'w') as f:
        # Set intial hidden ane cell states
        state = (torch.zeros(num_layers, 1, hidden_size).to(device),
                 torch.zeros(num_layers, 1, hidden_size).to(device))

        # Select one word id randomly
        prob = torch.ones(vocab_size)
        input = torch.multinomial(prob, num_samples=1).unsqueeze(1).to(device)

        for i in range(num_samples):
            # Forward propagate RNN 
            output, state = model(input, state)

            # Sample a word id
            prob = output.exp()
            word_id = torch.multinomial(prob, num_samples=1).item()

            # Fill input with sampled word id for the next time step
            input.fill_(word_id)

            # File write
            word = corpus.dictionary.idx2word[word_id]
            word = '\n' if word == '<eos>' else word + ' '
            f.write(word)

            if (i+1) % 100 == 0:
                print('Sampled [{}/{}] words and save to {}'.format(i+1, num_samples, 'sample.txt'))

Полный код также для модели можно найти здесь .

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

...