2015-11-09 3 views

ответ

154

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

+2

ли это как-то можно кормить заполнитель? ([мой вопрос] (http://stackoverflow.com/questions/33810990/how-to-feed-a-placeholder)) – displayname

+0

В чем заключается второй пример? Это просто, что вы можете оценить отдельные операции (или графики? Не уверены, какая разница)? – Pinocchio

+1

Подождите, ваш пример действительно работает? Я попробовал: 'a = tf.constant (2.0) b = tf.constant (3.0) ab = tf.matmul (a, b)', и я просто получил жалобы от тензорного потока, что формы не совпадают, я думаю точнее, что ранг должен быть не менее 2. – Pinocchio

28

Сеанс часто задаваемых вопросов о тензорном потоке имеет answer to exactly the same question. Я бы просто идти вперед и оставить его здесь:


Если 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() 

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

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

1

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

поправьте меня, если я ошибаюсь

Смежные вопросы