Гарантированы ли случайные значения тензорного потока одинаковыми внутри одного прогона? - PullRequest
0 голосов
/ 07 сентября 2018

Для tf.random_uniform и аналогичных случайных операций я понимаю, что «случайные операции с сохранением состояния и создают новые случайные значения каждый раз, когда они оцениваются.», И поэтому я получаю разные значения при вызове session.run() дважды:

# Each time we run these ops, different results are generated
sess = tf.Session()
print(sess.run(norm))
print(sess.run(norm))

Мой вопрос: если мой график ссылается на случайную операцию дважды, гарантируется ли, что два "вызова" увидят одно и то же значение внутри одного run()? Э.Г.

rnd_source = tf.random_normal(...)
x1 = rnd_source + 0.
x2 = rnd_source * 1.
sess.run([x1, x2])

Если не гарантируется, что x1 и x2 будут иметь одинаковые значения, существует ли простой способ сохранить случайное значение в тензоре (а не в переменной tf.Variable), чтобы гарантировать, что случайная операция оценивается только однажды? Если для гарантировано , что x1 будет иметь те же значения, что и x2, существует ли способ принудительной переоценки случайной операции внутри одного прогона для получения новых случайных значений?

1 Ответ

0 голосов
/ 07 сентября 2018

Вы уже сделали это, не осознавая этого. Просто присвойте значение тензору, а затем используйте это значение:

rnd_source = tf.random_normal((1,))
m = rnd_source

Теперь при каждом запуске m оценивается как единое ничье из нормального распределения, а затем вы рисуете из него другие графики:

In [27]: for i in range(10):
    ...:     a, b, c, d, e = sess.run( [m*1, m+0, m+1, m+2, m+3 ]  )
    ...:     print(a, b, c, d, e)

[-2.1935725] [-2.1935725] [-1.1935725] [-0.19357252] [0.8064275]
[-0.5607107] [-0.5607107] [0.43928927] [1.4392893] [2.4392893]
[0.17031813] [0.17031813] [1.1703181] [2.1703181] [3.1703181]
[0.05647242] [0.05647242] [1.0564724] [2.0564723] [3.0564723]
[-0.2119268] [-0.2119268] [0.7880732] [1.7880732] [2.7880733]
[-0.07041783] [-0.07041783] [0.9295822] [1.9295821] [2.929582]
[-0.9486307] [-0.9486307] [0.05136931] [1.0513693] [2.0513692]
[1.3629643] [1.3629643] [2.3629642] [3.3629642] [4.362964]
[1.6997207] [1.6997207] [2.6997209] [3.6997209] [4.699721]
[1.480969] [1.480969] [2.480969] [3.480969] [4.480969]

Теперь, каждый раз, когда вы проходите цикл обучения, вы будете получать новое значение из дистрибутива, но создайте остальную часть графика, используя m, и это будет согласовано ...

Для уточнения, давайте добавим новые узлы ...

In [28]: n = m+0
In [29]: o = m+1

Теперь

In [31]: for i in range(10):
    ...:     a, b = sess.run([n, o])
    ...:     print(a, b)
    ...:
[0.32054538] [1.3205454]
[-0.6587958] [0.34120423]
[-0.8067821] [0.19321787]
[-0.29313084] [0.7068691]
[-1.1867933] [-0.18679333]
[1.4355402] [2.4355402]
[0.45581594] [1.4558159]
[-1.9583491] [-0.9583491]
[-1.2682568] [-0.26825678]
[1.534502] [2.534502] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...