Soweit ich weiß, Variable
ist dies die Standardoperation zum Erstellen einer Variablen und get_variable
wird hauptsächlich zum Teilen von Gewichten verwendet.
Auf der einen Seite schlagen einige Leute vor, get_variable
anstelle der primitiven Variable
Operation zu verwenden, wann immer Sie eine Variable benötigen. Andererseits sehe ich lediglich eine Verwendung get_variable
in den offiziellen Dokumenten und Demos von TensorFlow.
Daher möchte ich einige Faustregeln zur korrekten Verwendung dieser beiden Mechanismen kennen. Gibt es "Standard" -Prinzipien?
python
tensorflow
Lifu Huang
quelle
quelle
Antworten:
Ich würde empfehlen, immer zu verwenden
tf.get_variable(...)
- es erleichtert die Umgestaltung Ihres Codes, wenn Sie Variablen jederzeit gemeinsam nutzen müssen, z. B. in einer Multi-GPU-Einstellung (siehe das Multi-GPU-CIFAR-Beispiel). Es gibt keinen Nachteil.Rein
tf.Variable
ist niedriger; Irgendwanntf.get_variable()
existierte es nicht mehr, so dass einige Codes immer noch den Low-Level-Weg verwenden.quelle
tf.Variable
mittf.get_variable
überall. Wenn ich dann eine Variable mit einem Numpy-Array initialisieren möchte, kann ich keine saubere und effiziente Methode finden, wie ich es tuetf.Variable
. Wie lösen Sie es? Vielen Dank.tf.Variable ist eine Klasse, und es gibt verschiedene Möglichkeiten, tf.Variable einschließlich
tf.Variable.__init__
und zu erstellentf.get_variable
.tf.Variable.__init__
: Erstellt eine neue Variable mit initial_value .tf.get_variable
: Ruft eine vorhandene Variable mit diesen Parametern ab oder erstellt eine neue. Sie können auch den Initialisierer verwenden.Es ist sehr nützlich, Initialisierer wie die folgenden zu verwenden
xavier_initializer
:Weitere Informationen hier .
quelle
Variable
eigentlich meine ich es zu benutzen__init__
. Da diesget_variable
so praktisch ist, frage ich mich, warum die meisten TensorFlow-Codes, die ich gesehen habe,Variable
stattdessen verwendet wurdenget_variable
. Gibt es Konventionen oder Faktoren, die bei der Auswahl berücksichtigt werden müssen? Danke dir!tf.Variable()
als Zufallswert aus einer abgeschnittenen Normalverteilung initialisieren. Hier ist mein Beispielw1 = tf.Variable(tf.truncated_normal([5, 50], stddev = 0.01), name = 'w1')
. Was wäre das Äquivalent dazu? Wie kann ich sagen, dass ich eine abgeschnittene Normalität möchte? Soll ich es einfach tunw1 = tf.get_variable(name = 'w1', shape = [5,50], initializer = tf.truncated_normal, regularizer = tf.nn.l2_loss)
?tf.truncated_normal_initializer()
Sie das gewünschte Ergebnis erzielen .Ich kann zwei Hauptunterschiede zwischen dem einen und dem anderen finden:
Erstens
tf.Variable
wird immer eine neue Variable erstellt, währendtf.get_variable
eine vorhandene Variable mit angegebenen Parametern aus dem Diagramm abgerufen wird. Wenn diese nicht vorhanden ist, wird eine neue Variable erstellt.tf.Variable
erfordert die Angabe eines Anfangswertes.Es ist wichtig zu verdeutlichen, dass die Funktion
tf.get_variable
dem Namen den aktuellen Variablenbereich voranstellt, um Wiederverwendungsprüfungen durchzuführen. Beispielsweise:Der letzte Assertionsfehler ist interessant: Zwei Variablen mit demselben Namen im selben Bereich sollen dieselbe Variable sein. Wenn Sie jedoch die Namen von Variablen testen
d
unde
feststellen, dass Tensorflow den Namen der Variablen geändert hate
:quelle
d.name
unde.name
bin ich gerade auf dieses TensorFlow-Dokument über die Benennung von TensordiagrammenIf the default graph already contained an operation named "answer", the TensorFlow would append "_1", "_2", and so on to the name, in order to make it unique.
Ein weiterer Unterschied besteht darin, dass einer in der
('variable_store',)
Sammlung ist, der andere jedoch nicht.Bitte beachten Sie den Quellcode :
Lassen Sie mich das veranschaulichen:
Die Ausgabe:
quelle