Как воспроизвести результаты RNN на нескольких прогонах? - PullRequest
2 голосов
/ 17 мая 2019

Я вызываю одну и ту же модель на одном и том же входе дважды подряд, и я не получаю тот же результат, у этой модели есть nn.GRU слои, поэтому я подозреваю, что у нее есть какое-то внутреннее состояние, которое должно быть выпущено до второго запуска?

Как сбросить скрытое состояние RNN, чтобы оно стало таким же, как если бы модель была изначально загружена?

ОБНОВЛЕНИЕ:

Некоторый контекст:

Я пытаюсь запустить модель отсюда:

https://github.com/erogol/WaveRNN/blob/master/models/wavernn.py#L93

Я звоню generate:

https://github.com/erogol/WaveRNN/blob/master/models/wavernn.py#L148

Здесьна самом деле есть некоторый код, использующий генератор случайных чисел в pytorch:

https://github.com/erogol/WaveRNN/blob/master/models/wavernn.py#L200

https://github.com/erogol/WaveRNN/blob/master/utils/distribution.py#L110

https://github.com/erogol/WaveRNN/blob/master/utils/distribution.py#L129

Я разместил (I 'm выполняющегося кода на ЦП):

torch.manual_seed(0)
torch.cuda.manual_seed_all(0)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
np.random.seed(0)

в

https://github.com/erogol/WaveRNN/blob/master/utils/distribution.py

после всех импортов.

Я проверил веса GRU между запусками иони одинаковы:

https://github.com/erogol/WaveRNN/blob/master/models/wavernn.py#L153

Также я проверил logits и sample между прогонами и logits одинаковы, но sample нет, поэтому @AndrewКажется, Нагиб был прав насчет случайного посева, ноЯ не уверен, где должен быть размещен код, который исправляет случайное начальное число?

https://github.com/erogol/WaveRNN/blob/master/models/wavernn.py#L200

ОБНОВЛЕНИЕ 2:

Я поместил начальное числоинициализация внутри generate и теперь результаты соответствуют:

https://github.com/erogol/WaveRNN/blob/master/models/wavernn.py#L148

Ответы [ 2 ]

3 голосов
/ 18 мая 2019

Я полагаю, что это может быть тесно связано с Случайным посевом . Чтобы обеспечить воспроизводимые результаты ( как указано ), вы должны посеять torch, как показано ниже:

import torch
torch.manual_seed(0)

А также модуль CuDNN.

torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False

Если вы используете numpy, вы также можете сделать:

import numpy as np
np.random.seed(0)

Однако они предупреждают вас:

Детерминированный режим может влиять на производительность в зависимости от вашей модели.


Рекомендованный скрипт, который я регулярно использую и который очень хорошо работал для воспроизведения результатов:

# imports
import numpy as np
import random
import torch
# ...
""" Set Random Seed """
if args.random_seed is not None:
    """Following seeding lines of code are to ensure reproducible results 
       Seeding the two pseudorandom number generators involved in PyTorch"""
    random.seed(args.random_seed)
    np.random.seed(args.random_seed)
    torch.manual_seed(args.random_seed)
    # https://pytorch.org/docs/master/notes/randomness.html#cudnn
    if not args.cpu_only:
        torch.cuda.manual_seed(args.random_seed)
        cudnn.deterministic = True
        cudnn.benchmark = False
0 голосов
/ 18 мая 2019

Вы можете использовать model.init_hidden() для сброса скрытого состояния RNN.

def init_hidden(self):
     # Initialize hidden and cell states
     return Variable(torch.zeros(num_layers, batch_size, hidden_size))

Таким образом, прежде чем вызывать ту же модель для тех же данных в следующий раз, вы можете вызвать model.init_hidden (), чтобы сбросить скрытое состояние и состояние ячейки к начальным значениям.

Это очистит историю, то есть, в порядке слов, веса, изученные моделью после первого запуска данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...