Невозможно воспроизвести случайность в сочетании с тензорным потоком и numpy? - PullRequest
0 голосов
/ 25 апреля 2018

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

tf.set_random_seed(seed)
np.random.seed(seed)

Я выполнял отладку, и когда я использую NumPy и без TF, все результаты воспроизводимы.Когда я добавляю код TF, случайные числа перестают быть воспроизводимыми.Когда я использую и TF, и numpy, я получаю следующие результаты:

  1. Переменные TF каждый раз инициализируются одним и тем же значением (ОК)
  2. Когда я использую np.random.RandomState() сустановить seed вместо прямых вызовов на np.random.uniform(), np.random.normal() и т. д., результаты воспроизводимы (ОК)
  3. Когда я использую прямые вызовы на np.random.uniform(), np.random.normal() и т. д., результаты не воспроизводятся (НЕ ОК)

Разница между 2 и 3 заставляет меня думать, что TF должен где-то использовать numpy для генерации случайных чисел.Это звучит немного странно и неожиданно.У меня только 1 основной поток, поэтому разница не обусловлена ​​условиями гонки.Более того, даже если TF использует np.random, это не должно изменять случайные числа, которые я наблюдаю между запусками в моем проекте, поскольку последовательность запросов на генерацию случайных чисел всегда одинакова.

Что еще более страннозаключается в том, что конкретный фрагмент кода TF, который делает результаты невоспроизводимыми, - это вычисление и применение градиентов, где я не ожидал бы, что потребуется какое-либо генерирование случайных чисел.Обратите внимание, что я сравниваю только выбранные случайные числа, а не результаты из сети (поскольку TF выполняет некоторые недетерминированные операции), и на эти случайные числа никак не влияют результаты, полученные при обучении сети.

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

РЕДАКТИРОВАТЬ: я обнаружил, что это происходит только на GPU и не происходит на CPU.

...