В TensorFlow, в чем разница между сессией.run() и Тензор.функция eval()?
TensorFlow имеет два способа оценить часть графика:Session.run
в списке переменных и Tensor.eval
. Есть ли разница между этими двумя?
4 ответа:
если у вас
Tensor
t, вызываюt.eval()
эквивалентно вызовуtf.get_default_session().run(t)
.вы можете сделать сеанс по умолчанию следующим образом:
t = tf.constant(42.0) sess = tf.Session() with sess.as_default(): # or `with sess:` to close on exit assert sess is tf.get_default_session() assert t.eval() == sess.run(t)
самое главное отличие заключается в том, что вы можете использовать
sess.run()
чтобы получить значения многих тензоров на одном шаге:t = tf.constant(42.0) u = tf.constant(37.0) tu = tf.mul(t, u) ut = tf.mul(u, t) with sess.as_default(): tu.eval() # runs one step ut.eval() # runs one step sess.run([tu, ut]) # evaluates both tensors in a single step
обратите внимание, что каждый вызов
eval
иrun
выполнит весь график с нуля. Чтобы кэшировать результат вычисления, назначьте его atf.Variable
.
сеанс FAQ по тензорному потоку имеет ответ на точно такой же вопрос. Я бы просто пошел вперед и оставил его здесь:
если
t
это
eval()
не может обрабатывать объект listtf.reset_default_graph() a = tf.Variable(0.2, name="a") b = tf.Variable(0.3, name="b") z = tf.constant(0.0, name="z0") for i in range(100): z = a * tf.cos(z + i) + z * tf.sin(b - i) grad = tf.gradients(z, [a, b]) init = tf.global_variables_initializer() with tf.Session() as sess: init.run() print("z:", z.eval()) print("grad", grad.eval())
но
Session.run()
можетеprint("grad", sess.run(grad))
поправьте меня, если я ошибаюсь
в tensorflow вы создаете графики и передаете значения на этот график. График выполняет всю тяжелую работу и генерирует выходные данные на основе конфигурации, которую вы сделали в графике. Теперь, когда вы передаете значения на график, сначала вам нужно создать сеанс tensorflow.
tf.Session()
после инициализации сеанса вы должны использовать этот сеанс, потому что все переменные и настройки теперь являются частью сеанса. Таким образом, существует два способа передачи внешних значений граф так, что граф принимает их. Один из них-позвонить .run () во время использования выполняемого сеанса.
другой способ, который в основном является ярлыком для этого, - использовать .оценка.)( Я сказал ярлык, потому что полная форма .eval () is
tf.get_default_session().run(values)
вы можете проверить это сами. На месте
values.eval()
runtf.get_default_session().run(values)
. Вы должны получить такое же поведение.то, что делает eval, использует сеанс по умолчанию, а затем выполняет run().