В TensorFlow, в чем разница между сессией.run() и Тензор.функция eval()?


TensorFlow имеет два способа оценить часть графика:Session.run в списке переменных и Tensor.eval. Есть ли разница между этими двумя?

4 145

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 выполнит весь график с нуля. Чтобы кэшировать результат вычисления, назначьте его a tf.Variable.

сеанс FAQ по тензорному потоку имеет ответ на точно такой же вопрос. Я бы просто пошел вперед и оставил его здесь:


если t это

eval() не может обрабатывать объект list

tf.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() run tf.get_default_session().run(values). Вы должны получить такое же поведение.

то, что делает eval, использует сеанс по умолчанию, а затем выполняет run().