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