Невозможно воспроизвести случайность в сочетании с тензорным потоком и клочком?
У меня есть проект, в котором я не могу воспроизвести случайные числа, когда я использую numpy в сочетании с тензорным потоком. В начале всех моих тестов я установил
tf.set_random_seed(seed)
np.random.seed(seed)
Я отлаживал, и когда я использую NumPy и без TF, все результаты воспроизводимы. Когда я добавляю код TF, случайные числа перестают быть воспроизводимыми. Когда я использую TF и NumPy, я получаю следующие результаты:
- Переменные TF каждый раз инициализируются одним и тем же значением (ОК)
- Когда я использую
np.random.RandomState()
с установленным семенем вместо прямых вызововnp.random.uniform()
,np.random.normal()
и т. д., результаты воспроизводимы (ОК) - Когда я использую прямые звонки
np.random.uniform()
,np.random.normal()
и т. д., результаты не воспроизводятся (НЕ ОК)
Разница между 2 и 3 заставляет меня думать, что TF должен где-то использовать numpy для генерации случайных чисел. Это звучит немного странно и неожиданно. У меня только 1 основной поток, поэтому разница не обусловлена условиями гонки. Кроме того, даже если TF использует np.random
это не должно изменять случайные числа, которые я наблюдаю между запусками в моем проекте, поскольку последовательность запросов на генерацию случайных чисел всегда одинакова.
Что еще более странно, так это то, что конкретный фрагмент кода TF, который делает результаты невоспроизводимыми, - это вычисление и применение градиентов, и я не ожидал, что потребуется генерация случайных чисел. Обратите внимание, что я сравниваю только выбранные случайные числа, а не результаты из сети (поскольку TF выполняет некоторые недетерминированные операции), и на эти случайные числа никак не влияют результаты, полученные при обучении сети.
Извините, я не могу опубликовать свой код, но он слишком велик, и сокращение его до меньшего размера, скорее всего, решит проблему. Таким образом, любые предложения по дальнейшей отладке приветствуются.
РЕДАКТИРОВАТЬ: я обнаружил, что это происходит только на GPU и не происходит на CPU.