Ich bin ein Neuling bei TensorFlow. Ich bin verwirrt über den Unterschied zwischen tf.placeholder
und tf.Variable
. Wird aus meiner Sicht tf.placeholder
für Eingabedaten und tf.Variable
zum Speichern des Datenstatus verwendet. Das ist alles was ich weiß.
Könnte mir jemand ihre Unterschiede genauer erklären? Insbesondere wann tf.Variable
und wann zu verwenden tf.placeholder
?
tensorflow
J.Doe
quelle
quelle
Variable
s, aber nicht in Bezug aufplaceholder
s (deren Werte immer angegeben werden müssen).Antworten:
Kurz gesagt, Sie verwenden
tf.Variable
für trainierbare Variablen wie Gewichte (W) und Verzerrungen (B) für Ihr Modell.tf.placeholder
wird verwendet, um aktuelle Trainingsbeispiele zu füttern.So füttern Sie die Trainingsbeispiele während des Trainings:
Sie
tf.variables
werden als Ergebnis dieser Schulung geschult (modifiziert).Weitere Informationen finden Sie unter https://www.tensorflow.org/versions/r0.7/tutorials/mnist/tf/index.html . (Beispiele stammen von der Webseite.)
quelle
tensorflow
unddeep learning
undAI
sind.Der Unterschied besteht darin, dass
tf.Variable
Sie bei der Deklaration einen Anfangswert angeben müssen. Mittf.placeholder
Sie müssen einen Anfangswert nicht bieten und Sie es zur Laufzeit mit dem angebenfeed_dict
Argumente innenSession.run
quelle
Da Tensor-Berechnungen aus Graphen bestehen, ist es besser, die beiden in Form von Graphen zu interpretieren.
Nehmen wir zum Beispiel die einfache lineare Regression
wo
W
undB
stehen für die Gewichte und Verzerrungen undX
für die EingabenY
der Beobachtungen und für die Ausgaben der Beobachtungen.Offensichtlich
X
undY
sind von gleicher Natur (Manifestvariablen), die sich von denen vonW
undB
(latente Variablen) unterscheiden.X
undY
sind Werte der Proben (Beobachtungen) und benötigen daher einen zu füllenden Platz , währendW
undB
sind die Gewichte und die Abweichung Variablen (die vorherigen Werte wirken sich auf letztere aus) in der Grafik, die unter Verwendung von verschiedenenX
undY
Paaren trainiert werden sollten . Wir platzieren verschiedene Stichproben in den Platzhaltern , um die Variablen zu trainieren .Wir müssen nur die Variablen (an Prüfpunkten) speichern oder wiederherstellen , um das Diagramm mit dem Code zu speichern oder neu zu erstellen.
Platzhalter sind meist Inhaber für die verschiedenen Datensätze (z. B. Trainingsdaten oder Testdaten). Im Trainingsprozess werden jedoch Variablen für die spezifischen Aufgaben trainiert, dh um das Ergebnis der Eingabe vorherzusagen oder die Eingaben den gewünschten Beschriftungen zuzuordnen. Sie bleiben gleich, bis Sie das Modell mit verschiedenen oder denselben Beispielen neu trainieren oder optimieren , um die Platzhalter häufig durch das Diktat zu füllen . Zum Beispiel:
Platzhalter werden auch als Parameter zum Festlegen von Modellen übergeben.
Wenn Sie während des Trainings die Platzhalter (Hinzufügen, Löschen, Ändern der Form usw.) eines Modells ändern, können Sie den Prüfpunkt weiterhin ohne weitere Änderungen neu laden. Wenn jedoch die Variablen eines gespeicherten Modells geändert werden, sollten Sie den Prüfpunkt entsprechend anpassen, um ihn neu zu laden und das Training fortzusetzen (alle im Diagramm definierten Variablen sollten im Prüfpunkt verfügbar sein).
Zusammenfassend lässt sich sagen, dass Sie, wenn die Werte aus den Stichproben stammen (Beobachtungen, die Sie bereits haben), sicher einen Platzhalter erstellen, um sie zu halten. Wenn Sie einen zu trainierenden Parameter benötigen, nutzen Sie eine Variable (einfach ausgedrückt, stellen Sie die Variablen für die gewünschten Werte ein TF automatisch verwenden).
In einigen interessanten Modellen, wie einem Stilübertragungsmodell, werden die Eingabepixel optimiert und die normalerweise als Modellvariablen bezeichneten Variablen werden festgelegt. Dann sollten wir die Eingabe (normalerweise zufällig initialisiert) als Variable vornehmen, wie in diesem Link implementiert.
Weitere Informationen finden Sie in diesem einfachen und anschaulichen Dokument .
quelle
TL; DR
Variablen
Platzhalter
tf.placeholder_with_default
)quelle
Der offensichtlichste Unterschied zwischen dem tf.Variable und dem tf.placeholder ist der folgende
Die Initialisierung der Variablen erfolgt mit
sess.run(tf.global_variables_initializer())
. Auch beim Erstellen einer Variablen müssen Sie einen Tensor als Anfangswert an denVariable()
Konstruktor übergeben. Wenn Sie eine Variable erstellen, kennen Sie immer deren Form.Andererseits können Sie den Platzhalter nicht aktualisieren. Sie sollten auch nicht initialisiert werden, aber da sie ein Versprechen für einen Tensor sind, müssen Sie den Wert in sie einspeisen
sess.run(<op>, {a: <some_val>})
. Und schließlich kennt der Platzhalter im Vergleich zu einer Variablen möglicherweise nicht die Form. Sie können entweder Teile der Abmessungen oder gar nichts angeben.Es gibt andere Unterschiede:
Interessant ist, dass nicht nur Platzhalter gefüttert werden können. Sie können den Wert einer Variablen und sogar einer Konstanten zuführen.
quelle
Neben den Antworten anderer erklären sie dies auch sehr gut in diesem MNIST-Tutorial auf der Tensoflow-Website:
quelle
x
mit Form[batch size, features]
, wir haben die Gewichte, die von der Eingabe zur ersten Ebene der Größe[features, hidden units]
und den Verzerrungen gehen[hidden units]
. Meine Frage ist also: Wie multiplizieren wir sie miteinander? Wenn wir das tun, werdentf.matmul(x, w)
wir es bekommen[batch size, hidden units]
und wir können es nichtb
, da es Form hat[hidden units]
Tensorflow verwendet drei Arten von Containern, um den Prozess zu speichern / auszuführen
Konstanten: Konstanten enthalten die typischen Daten.
Variablen: Datenwerte werden mit den jeweiligen Funktionen wie cost_function geändert.
Platzhalter: Trainings- / Testdaten werden an die Grafik übergeben.
quelle
Beispielausschnitt:
Wie der Name schon sagt, ist ein Platzhalter ein Versprechen, später einen Wert bereitzustellen, d. H.
Variablen sind einfach die Trainingsparameter (
W
(Matrix),b
(Bias), die den normalen Variablen entsprechen, die Sie in Ihrer täglichen Programmierung verwenden und die der Trainer bei jedem Lauf / Schritt aktualisiert / ändert.Während Platzhalter erfordert keinen Anfangswert, dass , wenn Sie erstellt
x
undy
TF zugeordnet keinen Speicher, anstatt später , wenn Sie die Platzhalter in der Beschickungsess.run()
mitfeed_dict
, TensorFlow den entsprechend dimensionierten Speicher für sie zuweisen (x
undy
) - diese unconstrained- Mit dieser Funktion können wir Daten jeder Größe und Form eingeben.Kurz gesagt :
Variable - ist ein Parameter, den der Trainer (dh GradientDescentOptimizer) nach jedem Schritt aktualisieren soll.
Platzhalter- Demo -
Ausführung:
was zur Ausgabe führt
Im ersten Fall werden 3 und 4.5 an
a
bzw.b
bzw. an adder_node ouputting 7 übergeben. Im zweiten Fall gibt es eine Feed-Liste. Die ersten Schritte 1 und 2 werden hinzugefügt, die nächsten 3 und 4 (a
undb
).Relevante liest:
quelle
Variablen
Eine TensorFlow-Variable ist der beste Weg, um einen von Ihrem Programm manipulierten gemeinsamen, dauerhaften Status darzustellen. Variablen werden über die Klasse tf.Variable bearbeitet. Intern speichert eine tf.Variable einen persistenten Tensor. Mit bestimmten Operationen können Sie die Werte dieses Tensors lesen und ändern. Diese Änderungen sind in mehreren tf.Sessions sichtbar, sodass mehrere Worker dieselben Werte für eine tf.Variable sehen können. Variablen müssen vor der Verwendung initialisiert werden.
Beispiel:
Dadurch wird ein Berechnungsdiagramm erstellt. Die Variablen (x und y) können wie folgt initialisiert und die Funktion (f) in einer Tensorflow-Sitzung ausgewertet werden:
Platzhalter
Ein Platzhalter ist ein Knoten (wie eine Variable), dessen Wert in Zukunft initialisiert werden kann. Diese Knoten geben grundsätzlich den ihnen zur Laufzeit zugewiesenen Wert aus. Ein Platzhalterknoten kann mithilfe der Klasse tf.placeholder () zugewiesen werden, für die Sie Argumente wie den Typ der Variablen und / oder ihre Form angeben können. Platzhalter werden häufig zur Darstellung des Trainingsdatensatzes in einem Modell für maschinelles Lernen verwendet, da sich der Trainingsdatensatz ständig ändert.
Beispiel:
Hinweis: "Keine" für eine Dimension bedeutet "beliebige Größe".
Verweise:
quelle
Variable
Stellen Sie sich in Tensorflow normale Variablen vor, die wir in Programmiersprachen verwenden. Wir initialisieren Variablen, wir können sie auch später ändern. Wobeiplaceholder
kein Anfangswert erforderlich ist. Der Platzhalter weist einfach einen Speicherblock für die zukünftige Verwendung zu. Später können wirfeed_dict
die Daten einspeisenplaceholder
. Standardmäßigplaceholder
hat es eine uneingeschränkte Form, mit der Sie Tensoren unterschiedlicher Form in einer Sitzung füttern können. Sie können eine eingeschränkte Form erstellen, indem Sie die optionale Argumentform -shap übergeben, wie unten beschrieben.Während der maschinellen Lernaufgabe ist uns die Anzahl der Zeilen meistens nicht bekannt, aber (nehmen wir an) wir kennen die Anzahl der Features oder Spalten. In diesem Fall können wir None verwenden.
Jetzt können wir zur Laufzeit jede Matrix mit 4 Spalten und beliebig vielen Zeilen füttern.
Platzhalter werden auch für Eingabedaten verwendet (es handelt sich um Variablen, mit denen wir unser Modell füttern), wobei Variablen Parameter wie Gewichte sind, die wir im Laufe der Zeit trainieren.
quelle
Platzhalter:
Ein Platzhalter ist einfach eine Variable, der wir zu einem späteren Zeitpunkt Daten zuweisen. Es ermöglicht uns, unsere Operationen zu erstellen und unser Berechnungsdiagramm zu erstellen, ohne die Daten zu benötigen. In der TensorFlow-Terminologie geben wir dann Daten über diese Platzhalter in das Diagramm ein.
Anfangswerte sind nicht erforderlich, können aber Standardwerte mit haben
tf.placeholder_with_default)
Wir müssen zur Laufzeit einen Wert liefern wie:
Variable:
Beispiel:
tf.Variable("Welcome to tensorflow!!!")
quelle
Tensorflow 2.0-kompatible Antwort : Das Konzept der Platzhalter ist standardmäßig
tf.placeholder
nicht verfügbarTensorflow 2.x (>= 2.0)
, da der Standardausführungsmodus Eager Execution ist.Wir können sie jedoch verwenden, wenn sie in
Graph Mode
(Disable Eager Execution
) verwendet werden.Entsprechender Befehl für TF Placeholder in Version 2.x ist
tf.compat.v1.placeholder
.Der äquivalente Befehl für die TF-Variable in Version 2.x lautet.
tf.Variable
Wenn Sie den Code von 1.x auf 2.x migrieren möchten, lautet der äquivalente Befehltf.compat.v2.Variable
.Weitere Informationen zu Tensorflow Version 2.0 finden Sie auf dieser Tensorflow-Seite .
Weitere Informationen zur Migration von Version 1.x auf Version 2.x finden Sie im Migrationshandbuch .
quelle
Stellen Sie sich ein Berechnungsdiagramm vor . In einem solchen Diagramm benötigen wir einen Eingabeknoten, um unsere Daten an das Diagramm zu übergeben . Diese Knoten sollten als Platzhalter im Tensorflow definiert werden .
Denken Sie nicht als allgemeines Programm in Python. Sie können ein Python-Programm schreiben und all die Dinge tun, die in anderen Antworten nur durch Variablen erklärt wurden. Für Berechnungsdiagramme im Tensorflow müssen Sie diese Nods jedoch als Platzhalter definieren, um Ihre Daten dem Diagramm zuzuführen.
quelle