it-swarm.com.de

Was ist in TensorFlow der Unterschied zwischen Session.run () und Tensor.eval ()?

TensorFlow hat zwei Möglichkeiten, einen Teil des Diagramms auszuwerten: Session.run in einer Liste von Variablen und Tensor.eval. Gibt es einen Unterschied zwischen diesen beiden?

167
Geoffrey Irving

Wenn Sie eine Tensor t haben, entspricht der Aufruf von t.eval() dem Aufruf von tf.get_default_session().run(t).

Sie können eine Sitzung wie folgt als Standard festlegen:

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() verwenden können, um die Werte vieler Tensoren in demselben Schritt abzurufen:

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 ausgeführt wird. Um das Ergebnis einer Berechnung zwischenzuspeichern, weisen Sie es einem tf.Variable zu.

209
mrry

Die FAQ -Sitzung zum Tensorfluss hat eine Antwort auf genau dieselbe Frage . Ich würde einfach weitermachen und es hier lassen:


Wenn t ein Tensor-Objekt ist, ist t.eval() die Abkürzung für sess.run(t) (wobei sess die aktuelle Standardsitzung ist. Die beiden folgenden Codeausschnitte sind gleichwertig:

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 Kontextmanager, der die Installation als Standardsitzung für die gesamte Lebensdauer des with-Blocks bewirkt. Der Kontext-Manager-Ansatz kann zu einfacheren Codes für einfache Anwendungsfälle führen (wie z. B. Komponententests). Wenn Ihr Code mehrere Diagramme und Sitzungen verarbeitet, ist es möglicherweise einfacher, explizite Aufrufe von Session.run() zu erhalten.

Ich würde dir empfehlen, zumindest die gesamte FAQ zu überfliegen, da dies eine Menge Dinge klären könnte.

37
Salvador Dali

eval() kann das Listenobjekt nicht verarbeiten

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

korrigiere mich, wenn ich falsch liege

2
Yushin Liu

Im Tensorflow erstellen Sie Diagramme und übergeben die Werte an dieses Diagramm. Der Graph erledigt die ganze Arbeit und generiert die Ausgabe basierend auf der Konfiguration, die Sie im Graph vorgenommen haben .. Jetzt Wenn Sie dem Graph Werte übergeben, müssen Sie zuerst eine Tensorflow-Sitzung erstellen.

tf.Session()

Sobald die Sitzung initialisiert ist, sollten Sie diese Sitzung verwenden, da nun alle Variablen und Einstellungen Teil der Sitzung sind. Es gibt also zwei Möglichkeiten, externe Werte an das Diagramm zu übergeben, damit das Diagramm sie akzeptiert. Zum einen rufen Sie .run () auf, während Sie die gerade ausgeführte Sitzung verwenden.

Eine andere Möglichkeit, die im Grunde eine Abkürzung dafür darstellt, ist die Verwendung von .eval (). Ich sagte Abkürzung, weil die volle Form von .eval () ist 

tf.get_default_session().run(values)

Sie können das selbst überprüfen. An der Stelle von values.eval() führen Sie tf.get_default_session().run(values) aus. Sie müssen das gleiche Verhalten bekommen.

was eval macht, verwendet die Standardsitzung und führt dann run () aus.

0
Sudeep K Rana

Das Wichtigste, das Sie sich merken sollten:

Die einzige Möglichkeit, eine konstante Variable (jedes Ergebnis) von TenorFlow zu erhalten, ist die Sitzung.

Dies alles zu wissen, ist easy :

Sowohl tf.Session.run() als auch tf.Tensor.eval() erhalten Ergebnisse aus der Sitzung, wobei tf.Tensor.eval() eine Abkürzung für den Aufruf von tf.get_default_session().run(t) ist.


Ich würde auch die Methode tf.Operation.run() wie in hier beschreiben:

Nachdem der Graph in einer Sitzung gestartet wurde, kann ein Vorgang ausgeführt werden, indem er an tf.Session.run() übergeben wird. op.run() ist eine Verknüpfung zum Aufruf von tf.get_default_session().run(op).

0
prosti