TensorFlow hat zwei Möglichkeiten, einen Teil des Graphen zu bewerten: Session.run
in einer Liste von Variablen und Tensor.eval
. Gibt es einen Unterschied zwischen diesen beiden?In TensorFlow, was ist der Unterschied zwischen Session.run() und Tensor.eval()?
Antwort
Wenn Sie eine Tensor
t haben, entspricht der Aufruf t.eval()
dem Aufruf tf.get_default_session().run(t)
.
Sie eine Sitzung die Standard machen können wie folgt:
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)
Der wichtigste Unterschied ist, dass Sie sess.run()
können die Werte vieler Tensoren im gleichen Schritt zu holen:
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
Beachten Sie, dass bei jedem Aufruf von eval
und run
der gesamte Graph von Grund auf neu ausgeführt wird. Um das Ergebnis einer Berechnung zwischenzuspeichern, weisen Sie es einer tf.Variable
zu.
Die FAQ-Sitzung zum Tensorfluss hat eine answer to exactly the same question. Ich würde einfach weiter und lassen Sie es hier:
Wenn t
ein Tensor
Objekt ist, t.eval()
ist eine Abkürzung für sess.run(t)
(wo sess
die aktuelle Standard-Sitzung ist den beiden folgenden Code-Schnipsel sind äquivalent:.
sess = tf.Session()
c = tf.constant(5.0)
print sess.run(c)
c = tf.constant(5.0)
with tf.Session():
print c.eval()
Im zweiten Beispiel fungiert die Sitzung als ein Kontextmanager, der bewirkt, dass er als Standardsitzung für die Lebensdauer des with-Blocks installiert wird.Der Kontextmanager-Ansatz kann zu präziseren Code für einfache Anwendungsfälle führen (wie Unit-Tests), wenn dein Code witzig ist h mehrere Grafiken und Sitzungen, kann es einfacher sein, explizite Aufrufe an Session.run()
.
Ich würde Ihnen empfehlen, zumindest die gesamte FAQ zu überfliegen, da dies viele Dinge klären könnte.
eval() nicht verarbeiten kann die Liste Objekt
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())
aber Session.run() kann
print("grad",sess.run(grad))
korrigiert mich wenn ich falsch bin
Ist es irgendwie möglich, eine füttern Platzhalter? ([meine Frage] (http://stackoverflow.com/questions/33810990/how-to-feed-a-placeholder)) – displayname
Was ist das andere im zweiten Beispiel? Ist es nur, dass Sie bewerten können, um Operationen zu trennen (oder Graphen? Nicht sicher, was der Unterschied ist)? – Pinocchio
warte, läuft dein Beispiel tatsächlich? Ich versuchte: 'a = tf.constant (2.0) b = tf.constant (3.0) ab = tf.matmul (a, b)' und ich habe gerade Beschwerden von Tensorflow, dass die Formen nicht übereinstimmen, denke ich genauer gesagt, dass der Rang mindestens 2 sein muss. – Pinocchio