Невозможно воспроизвести случайность в сочетании с тензорным потоком и клочком?

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

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

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

  1. Переменные TF каждый раз инициализируются одним и тем же значением (ОК)
  2. Когда я использую np.random.RandomState() с установленным семенем вместо прямых вызовов 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.

0 ответов

Другие вопросы по тегам