Получить скорость обучения модели keras

Кажется, я не могу получить значение скорости обучения. То, что я получаю, ниже.

Я пробовал модель в течение 200 эпох и хочу увидеть/изменить скорость обучения. Разве это не правильный путь?

>>> print(ig_cnn_model.optimizer.lr)
<tf.Variable 'lr_6:0' shape=() dtype=float32_ref>

person user14492    schedule 11.04.2018    source источник
comment
См. это.   -  person Autonomous    schedule 12.04.2018
comment
@ParagS.Chandakkar Уже видел это до того, как опубликовал здесь. Для них он возвращает значения, AFIK.   -  person user14492    schedule 12.04.2018


Ответы (6)


Используйте eval() из keras.backend:

import keras.backend as K
from keras.models import Sequential
from keras.layers import Dense

model = Sequential()
model.add(Dense(1, input_shape=(1,)))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam')

print(K.eval(model.optimizer.lr))

Выход:

0.001
person Primusa    schedule 11.04.2018
comment
Что делать, если я хочу сбросить скорость обучения? например что-то вроде model.optimizer.lr=10? - person Zach; 19.09.2018
comment
Или model.optimizer.lr.numpy() в последних версиях тензорного потока. lr — это просто переменная, поэтому ее назначение работает как обычно: model.optimizer.lr.assign(0.1) - person hoefling; 26.11.2020

Вы можете изменить скорость обучения,

from keras.optimizers import Adam

model.compile(optimizer=Adam(lr=0.001), 
              loss='categorical_crossentropy', 
              metrics=['accuracy'])
person Mimii Cheng    schedule 12.04.2018
comment
Оп спрашивал, как ПОЛУЧИТЬ скорость обучения. Не задано. Обратите внимание, что Keras допускает динамическое изменение lr, поэтому возможно, что вы захотите узнать lr на более позднем этапе после нескольких эпох обучения. - person Danny Wang; 24.01.2019

Лучший способ получить всю информацию, связанную с оптимизатором, — это .get_config().

Пример:

model.compile(optimizer=optimizerF,
                  loss=lossF,
                  metrics=['accuracy'])

model.optimizer.get_config()

>>> {'name': 'Adam', 'learning_rate': 0.001, 'decay': 0.0, 'beta_1': 0.9, 'beta_2': 0.999, 'epsilon': 1e-07, 'amsgrad': False}

Он возвращает dict со всей информацией.

person eXistanCe    schedule 03.09.2019

Альтернативный способ:

  1. создать экземпляр оптимизатора

opt = keras.optimizers.SGD()

  1. получить скорость обучения из экземпляра

print('скорость обучения={}'.format(opt.lr.numpy()))

  1. использовать оптимизатор в модели

model.compile (оптимизатор = opt, ...)

person dturvene    schedule 01.08.2019

Некоторые оптимизаторы не включают свои имена в конфиги.

Вот полный пример того, как получить конфигурации и как реконструировать (т.е. клонировать) оптимизатор из их конфигураций (включая скорость обучения).

import keras.optimizers as opt

def get_opt_config(optimizer):
    """
    Extract Optimizer Configs from an instance of
    keras Optimizer
    :param optimizer: instance of keras Optimizer.
    :return: dict of optimizer configs.
    """
    if not isinstance(optimizer, opt.Optimizer):
        raise TypeError('optimizer should be instance of '
                        'keras.optimizers.Optimizer '
                        'Got {}.'.format(type(optimizer)))
    opt_config = optimizer.get_config()
    if 'name' not in opt_config.keys():
        _name = str(optimizer.__class__).split('.')[-1] \
            .replace('\'', '').replace('>', '')
        opt_config.update({'name': _name})
    return opt_config


def clone_opt(opt_config):
    """
    Clone keras optimizer from its configurations.
    :param opt_config: dict, keras optimizer configs.
    :return: instance of keras optimizer.
    """
    if not isinstance(opt_config, dict):
        raise TypeError('opt_config must be a dict. '
                        'Got {}'.format(type(opt_config)))
    if 'name' not in opt_config.keys():
        raise ValueError('could not find the name of optimizer in opt_config')
    name = opt_config.get('name')
    params = {k: opt_config[k] for k in opt_config.keys() if k != 'name'}
    if name.upper() == 'ADAM':
        return opt.Adam(**params)
    if name.upper() == 'NADAM':
        return opt.Nadam(**params)
    if name.upper() == 'ADAMAX':
        return opt.Adamax(**params)
    if name.upper() == 'ADADELTA':
        return opt.Adadelta(**params)
    if name.upper() == 'ADAGRAD':
        return opt.Adagrad(**params)
    if name.upper() == 'RMSPROP':
        return opt.RMSprop()
    if name.upper() == 'SGD':
        return opt.SGD(**params)
    raise ValueError('Unknown optimizer name. Available are: '
                     '(\'adam\',\'sgd\', \'rmsprop\', \'adagrad\', '
                     '\'adadelta\', \'adamax\', \'nadam\'). '
                     'Got {}.'.format(name))

Контрольная работа

if __name__ == '__main__':
    rmsprop = opt.RMSprop()
    configs = get_opt_config(rmsprop)
    print(configs)
    cloned_rmsprop = clone_opt(configs)
    print(cloned_rmsprop)
    print(cloned_rmsprop.get_config())

Выходы

{'lr': 0.0010000000474974513, 'rho': 0.8999999761581421, 'decay': 0.0, 'epsilon': 1e-07, 'name': 'RMSprop'}
<keras.optimizers.RMSprop object at 0x7f96370a9358>
{'lr': 0.0010000000474974513, 'rho': 0.8999999761581421, 'decay': 0.0, 'epsilon': 1e-07}
person Yahya    schedule 09.10.2019

С Tensorflow ›=2.0:

In [1]: import tensorflow as tf

In [2]: opt = tf.keras.optimizers.Adam()

In [3]: opt.lr.numpy()
Out[3]: 0.001

lr — это просто tf.Variable, поэтому его значение можно изменить с помощью assign():

In [4]: opt.lr.assign(0.1)
Out[4]: <tf.Variable 'UnreadVariable' shape=() dtype=float32, numpy=0.1>

In [5]: opt.lr.numpy()
Out[5]: 0.1

То же самое и с остальными гиперпараметрами:

In [6]: opt.decay.numpy()
Out[6]: 0.0

In [7]: opt.beta_1.numpy()
Out[7]: 0.9

In [8]: opt.beta_2.numpy()
Out[8]: 0.999
person hoefling    schedule 26.11.2020