webentwicklung-frage-antwort-db.com.de

Tensorflow: Verwenden des Adam-Optimierers

Ich experimentiere mit ein paar einfachen Modellen im Tensorflow, einschließlich eines Modells, das dem ersten MNIST für ML-Einsteiger-Beispiel sehr ähnelt, jedoch mit einer etwas größeren Dimension. Ich kann den Steigungsabstiegsoptimierer problemlos verwenden, um eine gute Konvergenz zu erreichen. Wenn ich versuche, den ADAM-Optimierer zu verwenden, erhalte ich folgende Fehler:

tensorflow.python.framework.errors.FailedPreconditionError: Attempting to use uninitialized value Variable_21/Adam
     [[Node: Adam_2/update_Variable_21/ApplyAdam = ApplyAdam[T=DT_FLOAT, use_locking=false, _device="/job:localhost/replica:0/task:0/cpu:0"](Variable_21, Variable_21/Adam, Variable_21/Adam_1, beta1_power_2, beta2_power_2, Adam_2/learning_rate, Adam_2/beta1, Adam_2/beta2, Adam_2/epsilon, gradients_11/add_10_grad/Tuple/control_dependency_1)]]

wobei sich die spezifische Variable, die sich über die Nichtinitialisierung beschwert, je nach Lauf ändert. Was bedeutet dieser Fehler? Und was ist falsch? Es scheint unabhängig von der Lernrate, die ich verwende, aufzutreten.

42

Die AdamOptimizer-Klasse erstellt zusätzliche Variablen, die als "Slots" bezeichnet werden und Werte für die Akkumulatoren "m" und "v" enthalten.

Wenn Sie neugierig sind, lesen Sie die Quelle hier: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/training/adam.py#L39 . Andere Optimierer wie Momentum und Adagrad verwenden ebenfalls Slots.

Diese Variablen müssen initialisiert werden, bevor Sie ein Modell trainieren können.

Die normale Art, Variablen zu initialisieren, besteht darin, tf.initialize_all_variables() aufzurufen, das ops hinzufügt, um die im Diagramm vorhandenen Variablen zu initialisieren wenn es aufgerufen wird.

(Abgesehen davon: Im Gegensatz zu seinem Namen initialisiert initialize_all_variables () nichts, es werden nur Operationen hinzugefügt, die die Variablen beim Ausführen initialisieren.)

Sie müssen nur initialize_all_variables () aufrufen after Sie haben den Optimierer hinzugefügt:

...build your model...
# Add the optimizer
train_op = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
# Add the ops to initialize variables.  These will include 
# the optimizer slots added by AdamOptimizer().
init_op = tf.initialize_all_variables()

# launch the graph in a session
sess = tf.Session()
# Actually intialize the variables
sess.run(init_op)
# now train your model
for ...:
  sess.run(train_op)
88
Touts

FailedPreconditionError: Versuch, einen nicht initialisierten Wert zu verwenden ist einer der häufigsten Fehler im Zusammenhang mit dem Tensorflow. Aus der offiziellen Dokumentation FailedPreconditionError

Diese Ausnahme wird am häufigsten ausgelöst, wenn eine Operation ausgeführt wird, die liest eine tf.Variable, bevor sie initialisiert wurde.

In Ihrem Fall erklärt der Fehler sogar, welche Variable nicht initialisiert wurde: Attempting to use uninitialized value Variable_1. In einem der TF-Tutorials wird viel über Variablen, ihre Erstellung/Initialisierung/Speicherung/Laden erklärt.

Um die Variable zu initialisieren, haben Sie 3 Optionen:

  • initialisiert alle globalen Variablen mit tf.global_variables_initializer()
  • initialisieren Sie Variablen, die Ihnen wichtig sind, mit tf.variables_initializer(list_of_vars) . Beachten Sie, dass Sie diese Funktion verwenden können, um global_variable_initializer nachzuahmen: tf.variable_initializers(tf.global_variables())
  • nur eine Variable mit var_name.initializer initialisieren

Ich verwende fast immer den ersten Ansatz. Denken Sie daran, dass Sie es in einen Sitzungslauf stellen sollten. So wirst du so etwas bekommen:

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

Wenn Sie mehr über Variablen erfahren möchten, lesen Sie diese Dokumentation , um zu wissen, wie report_uninitialized_variables und is_variable_initialized geprüft werden.

2
Salvador Dali

Sie müssen tf.global_variables_initializer() in Ihrer Sitzung anrufen, z

init = tf.global_variables_initializer()
sess.run(init)

Ein vollständiges Beispiel finden Sie in diesem großartigen Tutorial https://www.tensorflow.org/get_started/mnist/mechanics

1
LYu

init nach AdamOptimizer ausführen without und ohne vorher init definieren oder init ausführen

sess.run (tf.initialize_all_variables ()) 

oder 

sess.run (tf.global_variables_initializer ())

0
booyoungxu