Тензор потока: разные результаты с одним и тем же случайным начальным числом - PullRequest
0 голосов
/ 05 января 2019

Я запускаю программу обучения с подкреплением в тренажерном зале (BipedalWalker-v2), реализованную в тензорном потоке. Я установил случайное начальное значение окружения, tenorflow и numpy вручную следующим образом

os.environ['PYTHONHASHSEED']=str(42)
random.seed(42)
np.random.seed(42)
tf.set_random_seed(42)

env = gym.make('BipedalWalker-v2')
env.seed(0)

config = tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1)
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)
# run the graph with sess

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


Обновление:

Единственные места, которые я могу придумать, могут ввести случайность (кроме нейронных сетей):

  1. Я использую tf.truncated_normal для генерации случайного шума epsilon, чтобы реализовать шумовой слой
  2. Я использую np.random.uniform для случайного выбора сэмплов из буфера воспроизведения

Я также замечаю, что результаты, которые я получаю, довольно постоянны в первых 10 эпизодах, но затем начинают различаться. Другие вещи, такие как потери, также показывают аналогичную тенденцию, но не совпадают в числовом.

Обновление 2

Я также установил «PYTHONHASHSEED» и использую однопоточный процессор, как описано в @ jaypops96, но все еще не могу воспроизвести результат. Код был обновлен в вышеуказанном кодовом блоке

1 Ответ

0 голосов
/ 05 января 2019

Кажется, что тензорные нейронные сети вводят случайность во время обучения, которая не контролируется случайным начальным числом. Кажется, что случайность, возможно, происходит от хэш-операций python и параллельных операций, выполняемых в неконтролируемом порядке, по крайней мере.

Я добился успеха в получении 100% воспроизводимости с использованием keras-tenorflow NN, выполнив шаги по настройке в этом ответе: Как получить воспроизводимые результаты в керасе

В частности, я использовал формулировку, предложенную @Poete Maudit в этой ссылке.

Ключом было установить случайные начальные значения UP FRONT для numpy, python и tenorflow, а затем запустить тензорный поток на однопоточном ЦП в специально сконфигурированном сеансе.

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

print('Running in 1-thread CPU mode for fully reproducible results training a CNN and generating numpy randomness.  This mode may be slow...')
# Seed value
# Apparently you may use different seed values at each stage
seed_value= 1

# 1. Set `PYTHONHASHSEED` environment variable at a fixed value
import os
os.environ['PYTHONHASHSEED']=str(seed_value)
seed_value += 1

# 2. Set `python` built-in pseudo-random generator at a fixed value
import random
random.seed(seed_value)
seed_value += 1

# 3. Set `numpy` pseudo-random generator at a fixed value
import numpy as np
np.random.seed(seed_value)
seed_value += 1

# 4. Set `tensorflow` pseudo-random generator at a fixed value
import tensorflow as tf
tf.set_random_seed(seed_value)

# 5. Configure a new global `tensorflow` session
session_conf = tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1)
sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
tf.keras.backend.set_session(sess)

#rest of code...
...