Я бы хотел отслеживать скорость обучения во время тренировок с Estimator
(TPUEstimator
на ТПУ, из всех вещей). Я экспериментирую с примером Colab MNIST . Я подумал, что создам тренировочный хук, который будет регистрировать скорость обучения. Вот мой код:
class TrainHook(tf.train.SessionRunHook):
def __init__(self, optimizer):
self.optimizer = optimizer
def after_create_session(self, session, coord):
self.session = session
def before_run(self, run_context):
# optimizer is a CrossShardOptimizer (see notebook), hence ._opt
logger.info('Learning rate is {}'.format(
self.optimizer._opt._lr.eval(session=self.session))
optimizer
был создан следующим образом в model_fn
(скопировано из записной книжки):
step = tf.train.get_or_create_global_step()
lr = 0.0001 + tf.train.exponential_decay(0.01, step, 2000//8, 1/math.e)
optimizer = tf.train.AdamOptimizer(lr)
if params['use_tpu']:
optimizer = tf.contrib.tpu.CrossShardOptimizer(optimizer)
К сожалению, когда я запускаю этот код, я получить следующую ошибку: «Ошибка, зарегистрированная с training_l oop: операция« add_1 »помечена как недоступная для извлечения». Очевидно, _opt._lr является операцией add_1 из-за exponential_decay
. По крайней мере, на ТПУ; когда я устанавливаю обычный Tensorflow на свой ноутбук, это оператор add
; может ли это быть разницей?
Я знаю , что даже если бы я мог ее получить, _lr
- это не текущая, а базовая скорость обучения. Но это начало. :)
Примечание: _lr
и _lr_t
ведут себя одинаково, так как оба результата приводят к указанной выше ошибке.
Я использую tenorflow v1.14.