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?
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
.
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.
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
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 ().
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()
ettf.Tensor.eval()
obtiennent tous deux des résultats de la session oùtf.Tensor.eval()
est un raccourci pour appelertf.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 appelertf.get_default_session().run(op)
.