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)
и я только что получил жалобу от tenorflow о том, что формы не совпадают, точнее, я думаю, что ранг должен быть не менее 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)
.
В тензорном потоке вы создаете графики и передаете значения этому графику. Graph выполняет всю тяжелую работу и генерирует выходные данные на основе конфигурации, которую вы сделали в графике. Теперь, когда вы передаете значения в график, сначала вам нужно создать сеанс тензорного потока.
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()
как объяснено здесь