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

204

TensorFlow bietet zwei Möglichkeiten, um einen Teil des Diagramms auszuwerten: Session.runeine Liste von Variablen und Tensor.eval. Gibt es einen Unterschied zwischen diesen beiden?

Geoffrey Irving
quelle
vollständiger Namespace tf.Tensor.eval()und tf.Session.run(), aber verbunden ist tf.Operation.run()und tf.Tensor.eval()wie in erklärte hier
prosti

Antworten:

243

Wenn Sie ein Tensort haben, t.eval()entspricht das Anrufen dem Anrufen tf.get_default_session().run(t).

Sie können eine Sitzung wie folgt zum Standard machen:

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 besteht darin, dass Sie sess.run()die Werte vieler Tensoren im selben Schritt abrufen können:

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 jeder Aufruf evalund rundie gesamte grafische Darstellung von Grund auf neu ausgeführt wird. Um das Ergebnis einer Berechnung zwischenzuspeichern, weisen Sie es a zu tf.Variable.

mrry
quelle
Was ist der Unterschied im zweiten Beispiel? Ist es nur so, dass Sie separate Operationen (oder Diagramme? Nicht sicher, was der Unterschied ist) auswerten können?
Pinocchio
1
Warten Sie, läuft Ihr Beispiel tatsächlich? Ich habe es versucht: a = tf.constant(2.0) b = tf.constant(3.0) ab = tf.matmul(a, b) und ich habe gerade Beschwerden von Tensorflow bekommen, dass die Formen nicht übereinstimmen, genauer gesagt, dass der Rang mindestens 2 sein muss.
Pinocchio
@Pinocchio Ich denke, die API hat sich geändert, als die ursprüngliche Antwort vor 4 Jahren veröffentlicht wurde. Ich habe verwendet tf.multiply(t, u)und es hat gut funktioniert.
Yuqli
42

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


Wenn tes sich um ein TensorObjekt handelt, t.eval()ist es eine Abkürzung für sess.run(t)(wobei sesssich die aktuelle Standardsitzung befindet. Die beiden folgenden Codeausschnitte 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 Kontextmanager, wodurch sie als Standardsitzung für die Lebensdauer des withBlocks installiert wird . Der Kontextmanager-Ansatz kann zu einem präziseren Code für einfache Anwendungsfälle (wie Unit-Tests) führen. Wenn Ihr Code mehrere Diagramme und Sitzungen enthält, ist es möglicherweise einfacher, explizite Aufrufe an Session.run().

Ich würde empfehlen, dass Sie zumindest die gesamten FAQ überfliegen, da dies viele Dinge klären könnte.

Salvador Dali
quelle
2

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

Session.run()kann aber

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

korrigiere mich, wenn ich falsch liege

Yushin Liu
quelle
1

Das Wichtigste, an das Sie sich erinnern sollten:

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

Das alles zu wissen ist einfach :

Beides tf.Session.run()und tf.Tensor.eval()Ergebnisse aus der Sitzung erhalten, in der tf.Tensor.eval()sich eine Verknüpfung zum Aufrufen befindettf.get_default_session().run(t)


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

Nachdem das Diagramm in einer Sitzung gestartet wurde, kann eine Operation ausgeführt werden, indem es an übergeben wird tf.Session.run(). op.run()ist eine Abkürzung zum Anrufen tf.get_default_session().run(op).

Prosti
quelle
0

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

tf.Session()

Sobald die Sitzung initialisiert wurde, sollten Sie diese Sitzung verwenden, da jetzt 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. Eine besteht darin, die .run () aufzurufen, während Sie die ausgeführte Sitzung verwenden.

Eine andere Möglichkeit, die im Grunde eine Abkürzung dazu ist, ist die Verwendung von .eval (). Ich sagte Verknüpfung, weil die vollständige Form von .eval () ist

tf.get_default_session().run(values)

Sie können das selbst überprüfen. Am Ort des values.eval()Laufens tf.get_default_session().run(values). Sie müssen das gleiche Verhalten erhalten.

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

Sudeep K Rana
quelle
0

Tensorflow 2.x-kompatible Antwort : Konvertieren des mrry-Codes in Tensorflow 2.x (>= 2.0)zum Nutzen der Community.

!pip install tensorflow==2.1
import tensorflow as tf

tf.compat.v1.disable_eager_execution()    

t = tf.constant(42.0)
sess = tf.compat.v1.Session()
with sess.as_default():   # or `with sess:` to close on exit
    assert sess is tf.compat.v1.get_default_session()
    assert t.eval() == sess.run(t)

#The most important difference is that you can use sess.run() to fetch the values of many tensors in the same step:

t = tf.constant(42.0)
u = tf.constant(37.0)
tu = tf.multiply(t, u)
ut = tf.multiply(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
Tensorflow-Unterstützung
quelle