web-dev-qa-db-fra.com

Dans TensorFlow, quelle est la différence entre Session.run () et Tensor.eval ()?

TensorFlow a deux manières d'évaluer une partie du graphique: Session.run sur une liste de variables et Tensor.eval. Y a-t-il une différence entre ces deux?

167
Geoffrey Irving

Si vous avez une Tensor t, appeler t.eval() équivaut à appeler tf.get_default_session().run(t).

Vous pouvez définir une session par défaut comme suit:

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)

La différence la plus importante est que vous pouvez utiliser sess.run() pour récupérer les valeurs de nombreux tenseurs dans la même étape:

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

Notez que chaque appel à eval et run exécute le graphe entier à partir de zéro. Pour mettre en cache le résultat d'un calcul, affectez-le à un tf.Variable .

209
mrry

La session FAQ sur le flux de tenseurs a un réponse à exactement la même question . Je voudrais juste aller de l'avant et le laisser ici:


Si t est un objet Tensor, t.eval() est un raccourci pour sess.run(t) (où sess est la session par défaut en cours. Les deux extraits de code suivants sont équivalents:

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

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

Dans le deuxième exemple, la session agit en tant que gestionnaire de contexte, ce qui a pour effet de l'installer en tant que session par défaut pour la durée de vie du bloc with. L'approche du gestionnaire de contexte peut conduire à un code plus concis pour des cas d'utilisation simples (comme des tests unitaires); Si votre code traite plusieurs graphiques et sessions, il peut être plus simple de passer des appels explicites à Session.run().

Je vous recommande de parcourir au moins toute la FAQ, car cela pourrait clarifier beaucoup de choses.

37
Salvador Dali

eval() ne peut pas gérer l'objet liste

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

mais Session.run() peut

print("grad", sess.run(grad))

corrigez-moi si je me trompe

2
Yushin Liu

Dans tensorflow, vous créez des graphiques et transmettez des valeurs à ce graphique. Graph effectue tout le travail et génère le résultat en fonction de la configuration que vous avez définie dans le graphique . Maintenant Lorsque vous transmettez des valeurs au graphique, vous devez d'abord créer une session tensorflow.

tf.Session()

Une fois la session initialisée, vous êtes censé utiliser cette session car toutes les variables et tous les paramètres font maintenant partie de la session. Il existe donc deux façons de transmettre des valeurs externes au graphique afin que ce dernier les accepte. L'une consiste à appeler le .run () pendant que vous utilisez la session en cours d'exécution.

Une autre manière de créer un raccourci consiste à utiliser .eval (). J'ai dit raccourci parce que la forme complète de .eval () est 

tf.get_default_session().run(values)

Vous pouvez vérifier que vous-même . À l'emplacement de values.eval(), exécutez tf.get_default_session().run(values). Vous devez avoir le même comportement.

eval utilise la session par défaut puis exécute run ().

0
Sudeep K Rana

La chose la plus importante à retenir:

La seule façon d'obtenir une constante, une variable (tout résultat) de TenorFlow est la session.

Sachant que tout le reste est facile :

tf.Session.run() et tf.Tensor.eval() obtiennent tous deux des résultats de la session où tf.Tensor.eval() est un raccourci pour appeler tf.get_default_session().run(t).


Je voudrais également décrire la méthode tf.Operation.run() comme dans ici :

Une fois le graphe lancé dans une session, une opération peut être exécutée en la passant à tf.Session.run(). op.run() est un raccourci pour appeler tf.get_default_session().run(op).

0
prosti