Ich bin neu bei TensorFlow. Während ich die vorhandene Dokumentation lese, fand ich den Begriff tensor
wirklich verwirrend. Aus diesem Grund muss ich die folgenden Fragen klären:
tensor
und Variable
, tensor
tf.constant
, 'tensor' vs. tf.placeholder
?TensorFlow verfügt nicht über erstklassige Tensor-Objekte. Dies bedeutet, dass im zugrunde liegenden Diagramm, das von der Laufzeitumgebung ausgeführt wird, keine Ahnung von Tensor
vorhanden ist. Stattdessen besteht der Graph aus miteinander verbundenen Op-Knoten, die Operationen darstellen. Eine Operation reserviert Speicher für ihre Ausgaben, die auf den Endpunkten :0
, :1
usw. verfügbar sind, und Sie können sich jeden dieser Endpunkte als Tensor
vorstellen. Wenn tensor
nodename:0
entspricht, können Sie den Wert als sess.run(tensor)
oder sess.run('nodename:0')
abrufen. Die Ausführungsgranularität findet auf der Operationsebene statt. Daher führt die run
-Methode op aus, das alle Endpunkte berechnet, nicht nur den :0
-Endpunkt. Es ist möglich, einen Op - Knoten ohne Ausgaben (wie tf.group
) zu haben. In diesem Fall sind keine Tensoren zugeordnet. Es ist nicht möglich, Tensoren ohne einen darunter liegenden Op - Knoten zu haben.
Sie können untersuchen, was im darunter liegenden Diagramm geschieht, indem Sie so etwas tun
tf.reset_default_graph()
value = tf.constant(1)
print(tf.get_default_graph().as_graph_def())
Mit tf.constant
erhalten Sie also einen einzelnen Operationsknoten, den Sie mit sess.run("Const:0")
oder sess.run(value)
abrufen können.
In ähnlicher Weise erstellt value=tf.placeholder(tf.int32)
einen regulären Knoten mit dem Namen Placeholder
, und Sie können ihn als feed_dict={"Placeholder:0":2}
oder feed_dict={value:2}
eingeben. Sie können einen Platzhalter nicht mit demselben session.run
-Aufruf füttern und abrufen. Sie können das Ergebnis jedoch sehen, indem Sie einen tf.identity
-Knoten oben anhängen und dieses abrufen.
Für Variable
tf.reset_default_graph()
value = tf.Variable(tf.ones_initializer()(()))
value2 = value+3
print(tf.get_default_graph().as_graph_def())
Sie werden sehen, dass zwei Knoten Variable
und Variable/read
erstellt werden. Der :0
-Endpunkt ist ein gültiger Wert, der auf diesen beiden Knoten abgerufen werden kann. Variable:0
hat jedoch einen speziellen ref
-Typ, was bedeutet, dass er als Eingabe für mutierende Operationen verwendet werden kann. Das Ergebnis des Python-Aufrufs tf.Variable
ist ein Python Variable
-Objekt, und es gibt etwas Python-Magie, um Variable/read:0
oder Variable:0
zu ersetzen, je nachdem, ob eine Mutation erforderlich ist. Da die meisten Operationen nur einen Endpunkt haben, wird :0
gelöscht. Ein anderes Beispiel ist Queue
- close()
. Die Methode erstellt einen neuen Close
-Op-Knoten, der eine Verbindung zu Queue
-Op herstellt. Zusammenfassend können Operationen auf Python-Objekten wie Variable
und Queue
abhängig von der Verwendung unterschiedlichen TensorFlow-Op-Knoten zugeordnet werden.
Bei Operationen wie tf.split
oder tf.nn.top_k
, die Knoten mit mehreren Endpunkten erstellen, umschließt der session.run
-Aufruf von Python die Ausgabe automatisch in Tuple
- oder collections.namedtuple
von Tensor
-Objekten, die einzeln abgerufen werden können.
Aus dem Glossar :
Ein Tensor ist ein typisiertes multidimensionales Array. Zum Beispiel ein 4-D-Array von Fließkommazahlen, das einen Mini-Stapel von Bildern mit Abmessungen [Stapel, Höhe, Breite, Kanal] darstellt.
Grundsätzlich ist jedes data ein Tensor in TensorFlow (daher der Name):
feed_dict
in sess.run()
).var.assign()
). Technisch gesehen ist tf.Variable
jedoch keine Unterklasse von tf.Tensor
tf.constant
ist nur der einfachste Tensor, der einen festen Wert enthält, der beim Erstellen angegeben wirdIn der Grafik ist jedoch jeder Knoten eine Operation, die Tensors als Ein- oder Ausgänge haben kann.
Wie schon von anderen erwähnt, sind sie ja alle Tensoren.
Ich verstand dies so, dass ich zunächst 1D-, 2D-, 3D-, 4D-, 5D- und 6D-Tensoren wie in der Abbildung unten visualisieren und verstehen sollte. (Quelle: knoldus)
Nun können Sie sich im Zusammenhang mit TensorFlow einen Berechnungsgraphen wie den folgenden vorstellen:
Hier nehmen die Op
s zwei Tensoren a
und b
als input an; multipliziert die Tensoren mit sich selbst und dann addiert das Ergebnis dieser Multiplikationen, um den Ergebnistensor t3
zu erzeugen. Und diese Multiplikationen und AdditionOp
s kommen an den Knoten im Berechnungsgraphen vor.
Diese Tensoren a
und b
können konstante Tensoren, variable Tensoren oder Platzhalter sein. Es spielt keine Rolle, solange sie den gleichen Datentyp und kompatible Formen (oder broadcast
able) haben, um die Operationen auszuführen.
Der zentrale Datentyp von TensorFlow ist der Tensor. Tensoren sind die grundlegenden Komponenten der Berechnung und eine grundlegende Datenstruktur in TensorFlow. Ohne komplexe mathematische Interpretationen zu verwenden, können wir sagen, dass ein Tensor (in TensorFlow) ein mehrdimensionales numerisches Array mit null- oder n-dimensionaler Sammlung von Daten beschreibt, die durch Rang, Form und Typ bestimmt werden.Weiterlesen: Was sind Tensoren in TensorFlow ?