Tensorflow: Adam-optimizer gebruiken

Ik experimenteer met enkele eenvoudige modellen in tensorflow, waaronder een die erg lijkt op de eerste MNIST voor ML Beginners voorbeeld, maar met een iets grotere dimensionaliteit. Ik kan de gradiëntafdalingsoptimalisatie zonder problemen gebruiken en krijg voldoende convergentie. Als ik de ADAM-optimizer probeer te gebruiken, krijg ik de volgende foutmeldingen:

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)]]

waar de specifieke variabele die klaagt over niet-geïnitialiseerde veranderingen, afhankelijk van de uitvoering. Wat betekent deze fout? En wat suggereert het dat er niet klopt? Het lijkt voor te komen ongeacht de leersnelheid die ik gebruik.


Antwoord 1, autoriteit 100%

De klasse AdamOptimizer maakt extra variabelen, ‘slots’ genaamd, om waarden voor de accumulatoren ‘m’ en ‘v’ vast te houden.

Bekijk hier de bron als je nieuwsgierig bent, het is eigenlijk best leesbaar:
https://github.com/tensorflow/tensorflow/blob/master/ tensorflow/python/training/adam.py#L39. Andere optimalisatieprogramma’s, zoals Momentum en Adagrad, gebruiken ook slots.

Deze variabelen moeten worden geïnitialiseerd voordat u een model kunt trainen.

De normale manier om variabelen te initialiseren is door tf.initialize_all_variables()aan te roepen, wat ops toevoegt om de variabelen in de grafiek te initialiseren wanneer deze wordt aangeroepen.

(Terzijde: anders dan de naam doet vermoeden, initialiseert initialize_all_variables() niets, het voegt alleen ops toe die de variabelen initialiseren wanneer ze worden uitgevoerd.)

Wat u moet doen is initialize_all_variables() aanroepen nadatu de optimizer heeft toegevoegd:

...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)

Antwoord 2, autoriteit 4%

FailedPreconditionError: een poging om niet-geïnitialiseerde waarde te gebruikenis een van de meest voorkomende fouten met betrekking tot tensorflow. Uit officiële documentatie, FailedPreconditionError

Deze uitzondering wordt meestal gemaakt bij het uitvoeren van een bewerking die:
leest een tf.Variable voordat deze is geïnitialiseerd.

In jouw geval verklaart de fout zelfs welke variabele niet is geïnitialiseerd: Attempting to use uninitialized value Variable_1. Een van de TF-tutorials legt veel uit over variabelen, hun creation/initialization/saving/loading

In principe heeft u 3 opties om de variabele te initialiseren:

  • initialiseer alle globale variabelen met tf.global_variables_initializer()
  • Initialiseer variabelen die u belangrijk vindt met tf.variables_initializer(list_of_vars). Merk op dat je deze functie kunt gebruiken om global_variable_initializer na te bootsen: tf.variable_initializers(tf.global_variables())
  • initialiseer slechts één variabele met var_name.initializer

Ik gebruik bijna altijd de eerste benadering. Onthoud dat u het in een sessierun moet plaatsen. Dus je krijgt zoiets als dit:

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

Als je nieuwsgierig bent naar meer informatie over variabelen, lees dan deze documentatievoor meer informatie hoe report_uninitialized_variablesen hoe is_variable_initializedaan te vinken.


Antwoord 3

Je moet tijdens je sessie tf.global_variables_initializer()aanroepen, zoals

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

Het volledige voorbeeld is beschikbaar in deze geweldige tutorial
https://www.tensorflow.org/get_started/mnist/mechanics


Antwoord 4

voer init uit na AdamOptimizer,en zonder definieer init ervoor of voer init uit

sess.run(tf.initialize_all_variables())

of

sess.run(tf.global_variables_initializer())


Antwoord 5

Ik had een soortgelijk probleem. (Geen problemen met trainen met GradientDescent-optimizer, maar er is een fout opgetreden bij gebruik van Adam Optimizer of een andere optimizer met zijn eigen variabelen)

Overschakelen naar een interactieve sessie loste dit probleem voor mij op.

sess = tf.Session()

in

sess = tf.InteractiveSession()

Other episodes