Хобрук: Ваш путь к мастерству в программировании

Как я могу распечатать скорость обучения для каждой эпохи с помощью оптимизатора Adam в Keras?

Поскольку онлайн-обучение плохо работает с Keras, когда вы используете адаптивный оптимизатор (расписание скорости обучения сбрасывается при вызове .fit()), я хочу посмотреть, могу ли я просто установить его вручную. Однако для этого мне нужно выяснить, какова была скорость обучения в последнюю эпоху.

Тем не менее, как я могу напечатать скорость обучения для каждой эпохи? Я думаю, что могу сделать это с помощью обратного вызова, но кажется, что вам нужно пересчитывать его каждый раз, и я не уверен, как это сделать с Адамом.

Я нашел это в другом потоке, но он работает только с SGD:

class SGDLearningRateTracker(Callback):
    def on_epoch_end(self, epoch, logs={}):
        optimizer = self.model.optimizer
        lr = K.eval(optimizer.lr * (1. / (1. + optimizer.decay * optimizer.iterations)))
        print('\nLR: {:.6f}\n'.format(lr))

  • На ваш вопрос нет ответа. У Адама нет единой скорости обучения. 03.04.2018
  • Я использовал CSVLogger для регистрации своих показателей и заметил, что он уже записывает скорость обучения. Для этого не нужно было создавать специальный показатель. 03.12.2020

Ответы:


1

Я нашел этот вопрос очень полезным. Минимальный рабочий пример, который отвечает на ваш вопрос:

def get_lr_metric(optimizer):
    def lr(y_true, y_pred):
        return optimizer.lr
    return lr

optimizer = keras.optimizers.Adam()
lr_metric = get_lr_metric(optimizer)

model.compile(
    optimizer=optimizer,
    metrics=['accuracy', lr_metric],
    loss='mean_absolute_error', 
    )
15.12.2019

2

Я использую следующий подход, основанный на ответе @jorijnsmit:

def get_lr_metric(optimizer):
    def lr(y_true, y_pred):
        return optimizer._decayed_lr(tf.float32) # I use ._decayed_lr method instead of .lr
    return lr

optimizer = keras.optimizers.Adam()
lr_metric = get_lr_metric(optimizer)

model.compile(
    optimizer=optimizer,
    metrics=['accuracy', lr_metric],
    loss='mean_absolute_error', 
    )

Это работает с Адамом.

29.11.2020
  • Этот сработал для меня, оригинал - нет при использовании с TPU в Kaggle. 14.12.2020

  • 3

    Для всех, кто все еще не понимает этой темы:

    Решение от @Andrey работает, но только если вы установите снижение скорости обучения, вы должны запланировать снижение скорости обучения после эпохи n, иначе она всегда будет печатать одно и то же число (начальная скорость обучения), это потому что это число НЕ изменяется во время обучения, вы не можете увидеть, как адаптируется скорость обучения, потому что каждый параметр в Адаме имеет разную скорость обучения, которая адаптируется во время обучения, но переменная lr НИКОГДА не изменяется

    16.03.2021

    4
    class MyCallback(Callback):
        def on_epoch_end(self, epoch, logs=None):
            lr = self.model.optimizer.lr
            # If you want to apply decay.
            decay = self.model.optimizer.decay
            iterations = self.model.optimizer.iterations
            lr_with_decay = lr / (1. + decay * K.cast(iterations, K.dtype(decay)))
            print(K.eval(lr_with_decay))
    

    Подпишитесь на эту ветку.

    27.11.2017
  • Это не та скорость обучения, которую использовал Адам. Это SGD с распадом. 03.04.2018

  • 5

    Этот фрагмент кода может вам помочь. Он основан на реализации Keras оптимизатора Adam (значения бета - значения Keras по умолчанию)

    from keras import Callback
    from keras import backend as K
    class AdamLearningRateTracker(Callback):
        def on_epoch_end(self, logs={}):
            beta_1=0.9, beta_2=0.999
            optimizer = self.model.optimizer
            if optimizer.decay>0:
                lr = K.eval(optimizer.lr * (1. / (1. + optimizer.decay * optimizer.iterations)))
            t = K.cast(optimizer.iterations, K.floatx()) + 1
            lr_t = lr * (K.sqrt(1. - K.pow(beta_2, t)) /(1. - K.pow(beta_1, t)))
            print('\nLR: {:.6f}\n'.format(lr_t))
    
    06.08.2018
  • Ваш фрагмент является хорошей базой, но в нем есть несколько ошибок (по крайней мере, для Keras 2.2.4 с Tensorflow 1.13.1): 1. Сигнатура функции должна быть def on_epoch_end(self, epoch, logs=None): 2. optimizer.decay - тензор и не может быть оценена как bool, требуется K.eval 3. lr не определено, если decay равно 0 4. lr_t является тензором и не может использоваться в строке формата, также требуется K.eval 28.05.2019
  • Новые материалы

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

    Управление состоянием в микрофронтендах
    Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

    Как я опубликовал свое первое приложение в App Store в 13 лет
    Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..