У TensorFlow, яка різниця між Session.run () та Tensor.eval ()?


204

TensorFlow має два способи оцінювання частини графіка: Session.runза списком змінних та Tensor.eval. Чи є різниця між цими двома?


повне простір імен tf.Tensor.eval()і tf.Session.run(), але пов'язано це tf.Operation.run()і tf.Tensor.eval()як пояснено в тут
прости

Відповіді:


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.


чим відрізняється другий приклад? Чи просто ви можете оцінити окремі операції (або графіки? Не впевнені, у чому різниця)?
Буратіно

1
зачекайте, чи справді працює ваш приклад? Я спробував: a = tf.constant(2.0) b = tf.constant(3.0) ab = tf.matmul(a, b) і мені щойно надійшли скарги від tensorflow, що форми не збігаються, я точніше здогадуюсь, що ранг повинен бути не менше 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

У tensorflow ви створюєте графіки і передаєте значення цьому графіку. Графік робить усі важкі роботи та генерує вихід, виходячи з конфігурації, зробленої у графіку. Тепер, коли ви передаєте значення графіку, то спочатку вам потрібно створити сеанс тензоборства.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.