Тензорный поток: использование оптимизатора Адама
Я экспериментирую с некоторыми простыми моделями в тензорном потоке, включая тот, который очень похож на первый пример 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)]]
где конкретная переменная, которая жалуется на неинициализацию, изменяется в зависимости от прогона. Что означает эта ошибка? И что это значит, неправильно? Кажется, что это происходит независимо от скорости обучения, которую я использую.
Ответы
Ответ 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()