У меня есть проект, в котором я не могу воспроизводить случайные числа, когда использую numpy в сочетании с tensorflow. В начале всех моих тестов я устанавливал
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 есть некоторые недетерминированные операции), и на эти случайные числа никоим образом не влияют результаты, полученные при обучении сети.
Извините, я не могу опубликовать свой код, но он слишком велик, и его уменьшение до меньшего образца, вероятно, устранит проблему. Таким образом, приветствуются любые предложения по дальнейшей отладке.
РЕДАКТИРОВАТЬ: я обнаружил, что это происходит только на графическом процессоре и не происходит на процессоре.
random.seed
на всякий случай? :/ - person jdehesa   schedule 25.04.2018random.seed
. Я попытался установить семя numpy перед импортом тензорного потока, но у меня все еще возникает та же проблема. Просто чтобы подтвердить, я все еще могу ожидать, чтоnp.random.seed
будет генерировать числа детерминировано, если я установлю его в одном файле проекта и вызовуnp.random.uniform
в другом файле, верно? - person niko   schedule 25.04.2018np.random.seed
устанавливает начальное значение для глобального NumPyRandomState
. Насколько я работал с ним, я никогда не обнаруживал удивительного поведения в RNG NumPy (просто нужно быть осторожным с многопроцессорностью). - person jdehesa   schedule 25.04.2018