Подтвердить что ты не робот

Получение текущей скорости обучения с помощью tf.train.AdamOptimizer

Я хотел бы распечатать курс обучения для каждого этапа обучения моего nn.

Я знаю, что у Адама есть адаптивная скорость обучения, но есть ли способ, которым я могу это видеть (для визуализации в тензограмме)

4b9b3361

Ответ 1

У всех оптимизаторов есть приватная переменная, которая содержит значение скорости обучения.

В адаграде и градиентном спуске это называется self._learning_rate. В адам это self._lr.

Поэтому вам просто нужно распечатать sess.run(optimzer._lr) чтобы получить это значение. Sess.run необходим, потому что они являются тензорами.

Ответ 2

Предложение Sung Kim работало для меня, моими точными шагами были:

lr = 0.1
step_rate = 1000
decay = 0.95

global_step = tf.Variable(0, trainable=False)
increment_global_step = tf.assign(global_step, global_step + 1)
learning_rate = tf.train.exponential_decay(lr, global_step, step_rate, decay, staircase=True)

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate, epsilon=0.01)
trainer = optimizer.minimize(loss_function)

# Some code here

print('Learning rate: %f' % (sess.run(trainer ._lr)))

Ответ 3

Я думаю, что самая простая вещь, которую вы можете сделать, - это подкласс оптимизатора.

У него есть несколько методов, которые, я думаю, будут отправлены на основе типа переменной. Регулярные плотные переменные, по-видимому, проходят через _apply_dense. Это решение не будет работать для разреженных или других вещей.

Если вы посмотрите на реализация, вы увидите, что он хранит EMA m и t в этих "слотах". Кажется, что-то вроде этого:

class MyAdam(tf.train.AdamOptimizer):
    def _apply_dense(self, grad, var):
        m = self.get_slot(var, "m")
        v = self.get_slot(var, "v")

        m_hat = m/(1-self._beta1_power)
        v_hat = v/(1-self._beta2_power)

        step = m_hat/(v_hat**0.5 + self._epsilon_t)

        # Use a histogram summary to monitor it during training.
        tf.summary.histogram("hist", step) 

        return super(MyAdam,self)._apply_dense(grad, var)

step здесь будет находиться в интервале [-1,1], что то, что умножается на скорость обучения, определяет фактический шаг, применяемый к параметрам.

В диаграмме часто нет node, потому что есть один большой training_ops.apply_adam, который делает все.

Здесь я просто создаю из нее гистограмму. Но вы можете вставить его в словарь, прикрепленный к объекту, и прочитать его позже или сделать с ним все, что хотите.

Размахивая это на mnist_deep.py и добавляя некоторые сводки к циклу обучения:

all_summaries = tf.summary.merge_all()  
file_writer = tf.summary.FileWriter("/tmp/Adam")
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(20000):
        batch = mnist.train.next_batch(50)
        if i % 100 == 0:
            train_accuracy,summaries = sess.run(
                [accuracy,all_summaries],
                feed_dict={x: batch[0], y_: batch[1], 
                           keep_prob: 1.0})
            file_writer.add_summary(summaries, i)
            print('step %d, training accuracy %g' % (i, train_accuracy))
       train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

В TensorBoard выводит следующий рисунок:

вкладка гистограммы TensorBoard, показывающая 8 разных графиков гистограммы

Ответ 4

В источниках TensorFlow текущий lr для оптимизатора Adam рассчитывается так:

    lr = (lr_t * math_ops.sqrt(1 - beta2_power) / (1 - beta1_power))

Итак, попробуйте:

    current_lr = (optimizer._lr_t * tf.sqrt(1 - 
    optimizer._beta2_power) / (1 - optimizer._beta1_power))

    eval_current_lr = sess.run(current_lr)