2015-11-18 17 views
35

Eksperymentuję z kilkoma prostymi modelami w tensorflow, w tym jednym bardzo podobnym do pierwszego MNIST for ML Beginners example, ale o nieco większej wymiarowości. Jestem w stanie bez problemu korzystać z optymalizatora gradientu zniżania, uzyskując wystarczająco dobrą zbieżność. Kiedy próbuję użyć optymalizator ADAM, otrzymuję błędy tak:Tensorflow: Używanie optymalizatora Adama

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

gdzie specyficzna zmienna, która narzeka bycia niezainicjowane zmian w zależności od biegu. Co oznacza ten błąd? A co sugeruje, że jest źle? Wydaje się, że występuje niezależnie od szybkości uczenia się, której używam.

Odpowiedz

65

Klasa AdamOptimizer tworzy dodatkowe zmienne, zwane "gniazdami", do przechowywania wartości dla akumulatorów "m" i "v".

Zobacz źródło tutaj, jeśli jesteś ciekawy, jest całkiem czytelny: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/training/adam.py#L39. Inne optymalizatory, takie jak Momentum i Adagrad, również używają gniazd.

Te zmienne muszą zostać zainicjowane, zanim będzie można wyszkolić model.

Normalnym sposobem inicjalizacji zmiennych jest wywołanie tf.initialize_all_variables(), co dodaje operacje do zainicjowania zmiennych występujących na wykresie , gdy jest to nazywane.

(Na marginesie: w przeciwieństwie sama nazwa wskazuje, initialize_all_variables() nie zainicjować coś, to tylko dodać ops że będzie zainicjować zmienne gdy bieg.)

Co trzeba zrobić, to initialize_all_variables call() po ty dodałem optymalizator:

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

Zakładając, że chcesz zastąpić optymalizator (i inne zmienne) w środku jak mogę zainicjować to bez koszu już przeszkolonych zmienne? – dolbi

+0

@dolbi Nie ma eleganckiej metody, ale używam metody I outline [here] (http://stackoverflow.com/a/35618160/786020). Możesz użyć 'tf.initialize_variables ([list, of, variables])' z nowymi w 'tf.all_variables()' od dodania 'AdamOptimizer' do wykresu. Muszę powiedzieć, że ta metoda nie powinna być używana w kodzie przeznaczonym do uruchamiania więcej niż jeden raz, ale działa świetnie podczas eksperymentowania. – Poik

+0

Ta odpowiedź była poprawna, ale teraz metoda została zastąpiona przez 'tf.global_variables_initializer()' – LYu

-3

Miałem podobny problem. (Brak problemów ze szkoleniem z optymalizatorem GradientDescent, ale błąd wywołany podczas używania do Adama Optimizera lub innego optymalizatora z jego własnymi zmiennymi)

Zmiana na sesję interaktywną rozwiązała ten problem dla mnie.

sess = tf.Session() 

do

sess = tf.InteractiveSession() 
1

FailedPreconditionError: Attempting to use uninitialized value jest jednym z najczęstszych błędów związanych z tensorflow. Z oficjalnej dokumentacji, FailedPreconditionError

Wyjątek ten jest najczęściej poruszane podczas prowadzenia operacji, która czyta tf.Variable zanim został zainicjowany.

W twoim przypadku błąd wyjaśnia, która zmienna nie została zainicjalizowana: Attempting to use uninitialized value Variable_1. Jeden z tutoriali TF wyjaśnia wiele o zmiennych, ich creation/initialization/saving/loading

Zasadniczo zainicjować zmienną masz 3 opcje:

I prawie zawsze użyć pierwszego podejścia. Pamiętaj, że powinieneś umieścić go w sesji. Więc dostaniesz coś takiego:

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

Jeśli Twój są ciekawi Więcej informacji na temat zmiennych, przeczytaj this documentation umieć report_uninitialized_variables i sprawdzić is_variable_initialized.

0

prowadzony startowych po AdamOptimizer, bez określenia init, przed lub eksploatowany init,

sess.run (tf.initialize_all_variables())

lub

sess.run (tf.global_variables_initializer())

Powiązane problemy