Глобальный шаг не увеличивается с помощью нормы партии и пользовательской оценки - PullRequest
0 голосов
/ 24 октября 2018

У меня есть оценщик клиента, который имеет несколько слоев, которые в функции модели выглядят следующим образом:

natural_layer = tf.layers.dense(inputs = natural_layer, 
                                units = units, 
                                activation = None,
                                use_bias = False,
                                kernel_regularizer = params['regularizer'],
                                name = 'pre_batch_norm_layer_' + str(i + 1))

natural_layer = tf.layers.batch_normalization(natural_layer,
                                              axis = 1,
                                              center = True,
                                              scale = True,
                                              training = (mode == tf.estimator.ModeKeys.TRAIN),
                                              name = 'batch_norm_layer_' + str(i + 1))

natural_layer = params['natural_layer_activation'](natural_layer, name = 'activation_layer_' + str(i + 1))

Поскольку я использую пакетную норму, операция обучения настроена следующим образом:

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
    optimizer = tf.contrib.opt.MultitaskOptimizerWrapper(params['optimization_algorithm'](params['training_rate']))
    train_op = optimizer.minimize(loss, global_step = tf.train.get_global_step())

Там, где оптимизатором обычно является tf.train.AdamOptimizer.

Однако, когда я иду тренировать оценщик, глобальный шаг никогда не увеличивается (поэтому обучение будет продолжаться вечно), и я получаю это:

ПРЕДУПРЕЖДЕНИЕ: tenorflow: Кажется, что глобальный шаг (tf.train.get_global_step) не был увеличен.Текущее значение (может быть стабильным): 0 против предыдущего значения: 0. Вы можете увеличить глобальный шаг, передав tf.train.get_global_step () в Optimizer.apply_gradients или Optimizer.minimize.

Я передаю tf.train.get_global_step (), чтобы свести к минимуму, поэтому я не уверен, почему он никогда не обновляется.Я догадываюсь, что это как-то связано с нормализацией пакета, потому что, когда я удаляю это или заменяю его на выпадающий, все работает нормально (даже при сохранении строк операций обновления, необходимых для нормализации пакета согласно документации).

Кто-нибудь знает, что происходит?Рад опубликовать больше кода, если полезно.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Я получаю ту же проблему даже без пакетной нормализации.Из того, что я помню, я смог обойти это, вызвав update_ops в sess.run вместе с train_ops, в отличие от предложения tf.control_dependencies.Это, вероятно, просто ошибка с тензорным потоком.

0 голосов
/ 09 ноября 2018

Я не мог понять, почему глобальный шаг не увеличивался автоматически, а вручную увеличивал глобальный шаг следующим образом, добавив его в train_op с помощью tf.group.

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
    with tf.control_dependencies(update_ops):
        optimizer = tf.contrib.opt.MultitaskOptimizerWrapper(params['optimization_algorithm'](params['training_rate']))
        train_op = optimizer.minimize(loss)

        global_step = tf.train.get_global_step()
        update_global_step = tf.assign(global_step, global_step + 1, name = 'update_global_step')

        return tf.estimator.EstimatorSpec(mode, loss = loss, train_op = tf.group(train_op, update_global_step))
...