TensorFlow має два способи оцінювання частини графіка: Session.run
за списком змінних та Tensor.eval
. Чи є різниця між цими двома?
TensorFlow має два способи оцінювання частини графіка: Session.run
за списком змінних та Tensor.eval
. Чи є різниця між цими двома?
Відповіді:
Якщо у вас є 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
.
a = tf.constant(2.0) b = tf.constant(3.0) ab = tf.matmul(a, b)
і мені щойно надійшли скарги від tensorflow, що форми не збігаються, я точніше здогадуюсь, що ранг повинен бути не менше 2.
tf.multiply(t, u)
і це працювало чудово.
Сеанс поширених запитань про тензорний потік дає відповідь на абсолютно те саме питання . Я просто продовжу і залишаю його тут:
Якщо 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, оскільки це може пояснити багато речей.
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))
виправте мене, якщо я помиляюся
Найголовніше, що потрібно пам’ятати:
Єдиний спосіб отримати постійний, змінний (будь-який результат) від 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)
.
У tensorflow ви створюєте графіки і передаєте значення цьому графіку. Графік робить усі важкі роботи та генерує вихід, виходячи з конфігурації, зробленої у графіку. Тепер, коли ви передаєте значення графіку, то спочатку вам потрібно створити сеанс тензоборства.
tf.Session()
Після ініціалізації сеансу ви повинні використовувати цей сеанс, оскільки всі змінні та налаштування зараз є частиною сеансу. Отже, є два способи передавання зовнішніх значень графіку, щоб графік їх приймав. Перший - викликати .run (), коли ви використовуєте сеанс, що виконується.
Інший спосіб, який в основному є ярликом до цього, - це використовувати .eval (). Я сказав ярлик, оскільки повна форма .eval () є
tf.get_default_session().run(values)
Ви можете самі це перевірити. На місці values.eval()
бігу tf.get_default_session().run(values)
. Ви повинні мати таку саму поведінку.
що робить eval - це використовувати сеанс за замовчуванням, а потім виконати run ().
Відповідь 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
tf.Tensor.eval()
іtf.Session.run()
, але пов'язано цеtf.Operation.run()
іtf.Tensor.eval()
як пояснено в тут