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