В чем разница между Session.run () и Tensor.eval () в TensorFlow?

204

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

Джеффри Ирвинг
источник
полное пространство имен tf.Tensor.eval()и tf.Session.run(), но связанные tf.Operation.run()и есть, tf.Tensor.eval()как объяснено здесь
prosti

Ответы:

243

Если у вас есть Tensort, вызов 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.

mrry
источник
чем отличается во втором примере? Это просто, что вы можете оценить отдельные операции (или графики? Не уверен, в чем разница)?
Буратино
1
подождите, ваш пример действительно работает? Я попробовал: a = tf.constant(2.0) b = tf.constant(3.0) ab = tf.matmul(a, b) и я только что получил жалобу от tenorflow о том, что формы не совпадают, точнее, я думаю, что ранг должен быть не менее 2.
Буратино
@Pinocchio Я думаю, что API изменился, так как оригинальный ответ опубликован 4 года назад. Я использовал, tf.multiply(t, u)и это работало нормально.
yuqli
42

Сессия часто задаваемых вопросов о тензорном потоке имеет ответ на точно такой же вопрос . Я просто продолжу и оставлю это здесь:


Если tэто Tensorобъект, t.eval()это сокращение от sess.run(t)(где sessтекущий сеанс по умолчанию. Два следующих фрагмента кода эквивалентны:

sess = tf.Session()
c = tf.constant(5.0)
print sess.run(c)

c = tf.constant(5.0)
with tf.Session():
  print c.eval()

Во втором примере сеанс выступает в качестве диспетчера контекста, который позволяет установить его в качестве сеанса по умолчанию для всего времени жизни withблока. Подход менеджера контекста может привести к более лаконичному коду для простых случаев использования (например, модульных тестов); если ваш код имеет дело с несколькими графиками и сессиями, это может быть проще для явных вызовов Session.run().

Я бы порекомендовал вам хотя бы просмотреть весь FAQ, так как это может многое прояснить.

Сальвадор Дали
источник
2

eval() не может обработать объект списка

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))

поправь меня если я не прав

Юшин Лю
источник
1

Самое главное помнить:

Единственный способ получить константу, переменную (любой результат) из TenorFlow - это сеанс.

Зная это, все остальное легко :

Обе tf.Session.run()и tf.Tensor.eval()получить результаты от сеанса, где tf.Tensor.eval()есть ярлык для вызоваtf.get_default_session().run(t)


Я бы также изложил метод, tf.Operation.run()как здесь :

После того, как график был запущен в сеансе, Операция может быть выполнена, передав ее tf.Session.run(). op.run()это ярлык для звонка tf.get_default_session().run(op).

прости
источник
0

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

tf.Session()

После инициализации сеанса вы должны использовать этот сеанс, потому что все переменные и настройки теперь являются частью сеанса. Таким образом, существует два способа передачи внешних значений в граф, чтобы граф мог их принимать. Одним из них является вызов .run (), когда вы используете выполняемый сеанс.

Другой способ, который по сути является быстрым, заключается в использовании .eval (). Я сказал ярлык, потому что полная форма .eval ()

tf.get_default_session().run(values)

Вы можете проверить это сами. На месте values.eval()бега tf.get_default_session().run(values). Вы должны получить такое же поведение.

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

Судип К Рана
источник
0

Совместимый ответ Tensorflow 2.x : Преобразование кода mrry Tensorflow 2.x (>= 2.0)в интересах сообщества.

!pip install tensorflow==2.1
import tensorflow as tf

tf.compat.v1.disable_eager_execution()    

t = tf.constant(42.0)
sess = tf.compat.v1.Session()
with sess.as_default():   # or `with sess:` to close on exit
    assert sess is tf.compat.v1.get_default_session()
    assert t.eval() == sess.run(t)

#The most important difference is that you can use sess.run() to fetch the values of many tensors in the same step:

t = tf.constant(42.0)
u = tf.constant(37.0)
tu = tf.multiply(t, u)
ut = tf.multiply(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
Поддержка Tensorflow
источник