Я хочу использовать MomentumOptimizer в Tensorflow. Однако, так как этот оптимизатор использует некоторую внутреннюю переменную, попытка использовать ее без инициализации этой переменной приводит к ошибке:

FailedPreconditionError (см. Выше для отслеживания): попытка использовать неинициализированное значение Variable_2/Momentum

Это может быть легко решено путем инициализации всех переменных, используя, например,

tf.global_variables_initializer().run()

Однако я не хочу инициализировать все переменные - только переменные оптимизатора. Есть какой-либо способ сделать это?

26
Kao 8 Янв 2017 в 16:59

5 ответов

Лучший ответ

Есть более простой способ:

optimizer = tf.train.AdamOptimizer()
session.run(tf.variables_initializer(optimizer.variables()))
19
Sourcerer 20 Май 2018 в 11:38

Вы можете фильтровать переменные по имени и только инициализировать их. IE

momentum_initializers = [var.initializer for var in tf.global_variables() if 'Momentum' in var.name]
sess.run(momentum_initializers)
11
Yaroslav Bulatov 8 Янв 2017 в 18:03

tf.variables_initializer, кажется, является предпочтительным способом инициализации определенного набора переменных:

var_list = [var for var in tf.global_variables() if 'Momentum' in var.name]
var_list_init = tf.variables_initializer(var_list)
...
sess = tf.Session()
sess.run(var_list_init)
2
Yibo Yang 26 Июн 2017 в 16:09

Чтобы решить проблему None, просто выполните:

  self.opt_vars = [opt.get_slot(var, name) for name in opt.get_slot_names() 
                   for var in self.vars_to_train
                   if opt.get_slot(var, name) is not None]
0
Cristian Bodnar 23 Фев 2018 в 11:02

Основываясь на ответе LucasB о AdamOptimizer, эта функция принимает AdamOptimizer экземпляр adam_opt, для которого создан Variables (один из этих двух: adam_opt.minimize(loss, var_list=var_list) или { {X5}}. Функция создает Op, который при вызове повторно инициализирует переменные оптимизатора для переданной переменной, а также состояние глобального подсчета.

def adam_variables_initializer(adam_opt, var_list):
    adam_vars = [adam_opt.get_slot(var, name)
                 for name in adam_opt.get_slot_names()
                 for var in var_list if var is not None]
    adam_vars.extend(list(adam_opt._get_beta_accumulators()))
    return tf.variables_initializer(adam_vars)

Например.:

opt = tf.train.AdamOptimizer(learning_rate=1e-4)
fit_op = opt.minimize(loss, var_list=var_list)
reset_opt_vars = adam_variables_initializer(opt, var_list)
5
eqzx 25 Сен 2017 в 14:03