Понимание Tensorflow initialize_all_variables - PullRequest
0 голосов
/ 23 мая 2019

Почему следующий код печатает 4 разных числа?

# Random seed for reproducibility
tf.set_random_seed(1234)
# Random variable
foo = tf.Variable(tf.random_uniform(shape=(1,1)),name = 'foo')
# Operation to initialize variables
init = tf.initialize_all_variables()
# Run Operations in session
with tf.Session() as sess:
    # Loop 
    for i in range(1,5):
        # Initialize variables
        sess.run(init)
        # Print foo value
        print(sess.run(foo))

Я ожидал, что оно напечатает одно и то же случайное значение 4 раза, так как я запускаю инициализатор в начале каждой из четырех итераций.

Ответы [ 3 ]

1 голос
/ 23 мая 2019

Функция tf.set_random_seed() обеспечивает воспроизводимость. Каждый раз, когда вы запускаете программу, она генерирует одну и ту же последовательность.

Пример

# Run1
[[0.96046877]]
[[0.8362156]]
[[0.510509]]
[[0.7130234]]

# Run2
[[0.96046877]]
[[0.8362156]]
[[0.510509]]
[[0.7130234]]

Это гарантирует, что ваш код воспроизводим. Документация по Tensorflow

0 голосов
/ 23 мая 2019

Хорошо, прочитав документацию и ответ @skillsmuggler, я понял, что tf.set_random_seed(1234) обеспечивает воспроизводимость для всех сессий .Я попытаюсь объяснить это на примере:

Если вы запускаете инициализатор переменных sess1.run(init) несколько раз в одном сеансе, он будет создавать случайное число каждый раз, когда вы его запускаете, так как каждый раз, когда он инициализируется,он создает случайное число.

# Run Operations in session
with tf.Session() as sess1:
# Loop 
for i in range(1,5):
    # Initialize variables
    sess1.run(init)
    # Print foo value
    print(sess1.run(foo))

[[0.7720382]]
[[0.8953308]]
[[0.22609258]]
[[0.07619083]]

Случайное начальное число гарантирует, что если мы запустим предыдущий код в другом сеансе, сгенерированные числа будут одинаковыми (воспроизводимость).

# Run Operations in session
with tf.Session() as sess2:
# Loop 
for i in range(1,5):
    # Initialize variables
    sess2.run(init)
    # Print foo value
    print(sess2.run(foo))

[[0.7720382]]
[[0.8953308]]
[[0.22609258]]
[[0.07619083]]

Так что, это действительно, обеспечивает воспроизводимость.

0 голосов
/ 23 мая 2019

Я думаю, что когда вы запускаете sess.run(init), он инициализирует новое случайное число для сеанса.

Функция initialize_all_variables() просто инициализирует все числа в целом, но sess.run(init) - это код, в котором эта сессия получает свой собственный номер.

Я не уверен, хотя. Я не могу повторить код, чтобы лучше понять.

...