【问题标题】:Change learning rate based on iteration根据迭代改变学习率
【发布时间】:2021-08-29 01:05:47
【问题描述】:

我正在尝试在 Keras 中为 SGD 编写一个自定义学习率调度程序,它会根据迭代改变学习率。然而,LearningRateScheduler CallBack 只接受一个只接受 epoch 的函数。我的学习率函数如下所示:

学习率 = base_learning_rate x (1 + gamma x 迭代)^(-power)

【问题讨论】:

    标签: python tensorflow keras deep-learning learning-rate


    【解决方案1】:

    这可以通过定义自己的tf.keras.optimizers.schedules.LearningRateSchedule 并将其传递给优化器来实现。

    class Example(tf.keras.optimizers.schedules.LearningRateSchedule):
    
      def __init__(self, initial_learning_rate, gamma, power):
        self.initial_learning_rate = initial_learning_rate
        self.gamma = gamma
        self.power = power
    
      def __call__(self, step):
         return self.initial_learning_rate * tf.pow((step*self.gamma+1),-self.power)
    
    optimizer = tf.keras.optimizers.SGD(learning_rate=Example(0.1,0.001,2))
    

    参考:https://www.tensorflow.org/api_docs/python/tf/keras/optimizers/schedules/LearningRateSchedule

    【讨论】:

    • 我已经尝试过这个想法。但是,损失值急剧增加。正如在 Keras 文档中一样,他们建议使用 Callback 而不是传递自定义 Schedule。仅供参考,我试图重现 this papermy custom schedule
    • 只要您确保 LearningRateSchedule 在图形模式下调用它时返回预期值,我认为爆炸梯度问题来自其他原因,例如初始学习率设置得太大。但这可能与您当前的问题无关。您最好提出一个新问题,以便您可以更详细地描述问题,以便更多人可以提供帮助。
    • 好的,我将创建一个新问题。我的调度程序或优化程序应该有问题。谢谢!
    【解决方案2】:

    当您说“根据迭代更改学习率”时,您的意思是您想在每批结束时更改它吗?如果是这样,您可以使用自定义回调来做到这一点。我没有对此进行测试,但代码会是这样的

    class LRA(keras.callbacks.Callback):
        def __init__(self,model, initial_learning_rate, gamma, power):
            super(LRA, self).__init__()
            self.initial_learning=initial_learning
            self.gamma=gamma
            self.power= power
            self.model=model # model is your compiled model
        def on_train_begin(self, logs=None):
            tf.keras.backend.set_value(self.model.optimizer.lr, 
                                        self.initial_learning_rate)
       def on_train_batch_end(self, batch, logs=None):
           lr=self.initial_learning_rate * tf.pow(((batch+1)*self.gamma+1),-self.power)
           tf.keras.backend.set_value(self.model.optimizer.lr, lr)
           # print('for ', batch, ' lr set to ', lr) remove comment if you want to see lr change
    

    让我知道这是否有效,我还没有测试过它呢

    before you run model.fit include code
    initial_learning_rate= .001  # set to desired value
    gamma=   # set to desired value
    power=   # set to desired value
    callbacks=[LRA(model=model, initial_learning_rate=initial_learning_rate, gamma=gamma, power=power)                           
       
            
       
    

    【讨论】:

    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 2016-12-17
    • 1970-01-01
    • 2020-11-27
    • 2017-07-10
    • 2019-09-06
    相关资源
    最近更新 更多