TensorFlow bietet zwei Möglichkeiten, um einen Teil des Diagramms auszuwerten: Session.run
eine Liste von Variablen und Tensor.eval
. Gibt es einen Unterschied zwischen diesen beiden?
TensorFlow bietet zwei Möglichkeiten, um einen Teil des Diagramms auszuwerten: Session.run
eine Liste von Variablen und Tensor.eval
. Gibt es einen Unterschied zwischen diesen beiden?
Antworten:
Wenn Sie ein Tensor
t 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 eval
und run
die gesamte grafische Darstellung von Grund auf neu ausgeführt wird. Um das Ergebnis einer Berechnung zwischenzuspeichern, weisen Sie es a zu tf.Variable
.
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.
tf.multiply(t, u)
und es hat gut funktioniert.
Die FAQ-Sitzung zum Tensorfluss hat eine Antwort auf genau dieselbe Frage . Ich werde einfach weitermachen und es hier lassen:
Wenn t
es sich um ein Tensor
Objekt handelt, t.eval()
ist es eine Abkürzung für sess.run(t)
(wobei sess
sich 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 with
Blocks 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.
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
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()
undtf.Tensor.eval()
Ergebnisse aus der Sitzung erhalten, in dertf.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 Anrufentf.get_default_session().run(op)
.
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.
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
tf.Tensor.eval()
undtf.Session.run()
, aber verbunden isttf.Operation.run()
undtf.Tensor.eval()
wie in erklärte hier