【问题标题】:Get learning rate of keras model获取keras模型的学习率
【发布时间】:2018-09-21 22:57:21
【问题描述】:

我似乎无法获得学习率的价值。我得到的是下面。

我已经尝试了 200 个 epoch 的模型,并希望查看/更改学习率。这不是正确的方法吗?

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

【问题讨论】:

  • this
  • @ParagS.Chandakkar 在我发帖之前已经看到了。对他们来说,它返回一个值,AFIK。

标签: python machine-learning neural-network keras


【解决方案1】:

使用来自keras.backendeval()

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

【讨论】:

  • 如果我想重置学习率怎么办?例如类似model.optimizer.lr=10?
  • model.optimizer.lr.numpy() 在最近的 tensorflow 版本中。 lr 只是一个变量,所以分配它照常工作:model.optimizer.lr.assign(0.1)
【解决方案2】:

你可以改变你的学习率

from keras.optimizers import Adam

model.compile(optimizer=Adam(lr=0.001), 
              loss='categorical_crossentropy', 
              metrics=['accuracy'])

【讨论】:

  • Op 询问如何获取学习率。没有设置。请注意,Keras 允许 lr 的动态变化,因此您可能想在经过几个 epoch 的训练后在稍后阶段了解 lr
【解决方案3】:

另一种方式:

  1. 创建优化器实例

opt = keras.optimizers.SGD()

  1. 从实例中获取学习率

print('学习率={}'.format(opt.lr.numpy()))

  1. 在模型中使用优化器

model.compile(optimizer = opt, ...)

【讨论】:

    【解决方案4】:

    获取与优化器相关的所有信息的最佳方式是使用.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}
    

    它返回一个包含所有信息的字典。

    【讨论】:

      【解决方案5】:

      一些优化器没有在配置中包含他们的名字。

      这是一个完整的示例,说明如何获取配置如何从配置中重建(即克隆)优化器(其中也包括学习率)。

      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}
      

      【讨论】:

      • str(optimizer.__class__).split(..)... -> optimizer.__class__.__name__
      【解决方案6】:

      使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-25
        • 1970-01-01
        • 2019-06-11
        • 2019-05-21
        • 2021-09-26
        • 2018-02-03
        • 1970-01-01
        • 2019-09-03
        相关资源
        最近更新 更多