Подтвердить что ты не робот

Тензорный поток: использование оптимизатора Адама

Я экспериментирую с некоторыми простыми моделями в тензорном потоке, включая тот, который очень похож на первый пример MNIST для ML Beginners, но с несколько большей размерностью. Я могу использовать оптимизатор спуска градиента без проблем, получая достаточно хорошую конвергенцию. Когда я пытаюсь использовать оптимизатор ADAM, я получаю такие ошибки:

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

где конкретная переменная, которая жалуется на неинициализацию, изменяется в зависимости от прогона. Что означает эта ошибка? И что это значит, неправильно? Кажется, что это происходит независимо от скорости обучения, которую я использую.

4b9b3361

Ответ 1

Класс AdamOptimizer создает дополнительные переменные, называемые "слотами", для хранения значений для аккумуляторов "m" и "v".

Посмотрите источник здесь, если вам интересно, на самом деле это вполне читаемо: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/training/adam.py#L39. Другие оптимизаторы, такие как Momentum и Adagrad, также используют слоты.

Эти переменные должны быть инициализированы, прежде чем вы сможете подготовить модель.

Обычным способом инициализации переменных является вызов tf.initialize_all_variables(), который добавляет ops для инициализации переменных, присутствующих в графе при его вызове.

(Помимо этого, в отличие от его имени, initialize_all_variables() не инициализирует ничего, он только добавляет ops, который будет инициализировать переменные при запуске.)

Что вы должны сделать, это вызвать initialize_all_variables() после добавления оптимизатора:

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

Ответ 2

FailedPreconditionError: попытка использовать неинициализированное значение является одной из наиболее частых ошибок, связанных с tensorflow. Из официальной документации FailedPreconditionError

Это исключение чаще всего возникает при выполнении операции, которая читает tf.Variable до того, как он был инициализирован.

В вашем случае ошибка даже объясняет, какая переменная не была инициализирована: Attempting to use uninitialized value Variable_1. В одном из учебников TF много говорится о переменных, их создание/инициализация/сохранение/загрузка

В принципе, для инициализации переменной у вас есть 3 варианта:

  • инициализировать все глобальные переменные tf.global_variables_initializer()
  • инициализировать переменные, о которых вы заботитесь, tf.variables_initializer(list_of_vars). Обратите внимание, что вы можете использовать эту функцию для имитации global_variable_initializer: tf.variable_initializers(tf.global_variables())
  • инициализировать только одну переменную с помощью var_name.initializer

Я почти всегда использую первый подход. Помните, что вы должны поместить его в сеанс. Итак, вы получите что-то вроде этого:

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

Если вам интересно узнать больше о переменных, прочитайте эту документацию, чтобы узнать, как report_uninitialized_variables и проверить is_variable_initialized.

Ответ 3

Вам нужно позвонить tf.global_variables_initializer() на сеанс, например

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

Полный пример доступен в этом замечательном учебнике https://www.tensorflow.org/get_started/mnist/mechanics

Ответ 4

запустить init после AdamOptimizer и без определения init до или запустить init

sess.run(tf.initialize_all_variables())

или

sess.run(tf.global_variables_initializer())

Ответ 5

У меня была аналогичная проблема. (Нет проблем с обучением с оптимизатором GradientDescent, но ошибка возникает при использовании в Adam Optimizer или любом другом оптимизаторе со своими переменными)

Переход на интерактивный сеанс решил эту проблему для меня.

sess = tf.Session()

в

sess = tf.InteractiveSession()