Keras自定义优化器ValueError:漏学率

e37o9pze  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(198)

我正在尝试使用TensorFlow中的Keras库创建一个自定义优化器。我正在从头开始编写优化程序。显示以下错误:
ValueError: Missing learning rate, please set self.learning_rate at optimizer creation time.
在我的优化器创建中,我添加了self.learning_rate,但问题仍然存在。下面是我为优化器的init函数编写的代码:

def __init__(self, lr=0.001, beta_1=0.9, beta_2=0.999,
                 momentum=0.0, epsilon=None, decay=0.0, name='AdamSGD', **kwargs):
        super(AdamSGD, self).__init__(name=name, **kwargs)
        self.iterations = K.variable(0, dtype='int64', name='iterations')
        self.learning_rate = K.variable(lr, name='lr')
        self.beta_1 = K.variable(beta_1, name='beta_1')
        self.beta_2 = K.variable(beta_2, name='beta_2')
        self.momentum = K.variable(momentum, name='momentum')
        self.epsilon = epsilon or K.epsilon()
        self.decay = K.variable(decay, name='decay')

这是我编译模型的方式,也是触发错误的地方:

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

整个错误:

24 # Compile the model
     25 model.compile(
---> 26     optimizer=AdamSGD(lr=0.01),
     27     loss='categorical_crossentropy',
     28     metrics=['accuracy']

     24         self.iterations = K.variable(0, dtype='int64', name='iterations')
---> 25         self.learning_rate = K.variable(lr, name='lr')
     26         self.beta_1 = K.variable(beta_1, name='beta_1')
     27         self.beta_2 = K.variable(beta_2, name='beta_2')

     60     try:
---> 61       if getattr(self, name) is value:
     62         # Short circuit for `self.$x = self.$x`.
     63         return

    330     def learning_rate(self):
    331         if not hasattr(self, "_learning_rate") or self._learning_rate is None:
--> 332             raise ValueError(
    333                 "Missing learning rate, please set self.learning_rate at"
    334                 " optimizer creation time."

ValueError: Missing learning rate, please set self.learning_rate at optimizer creation time.

如果有人有任何建议或知道我哪里出错了,请让我知道,因为我已经在这个错误上停留了很长一段时间了。

pb3skfrl

pb3skfrl1#

错误消息是违反直觉的,但您应该“简单地”在构造函数中设置属性self._learning_rate。你可以用函数self._build_learning_rate(learning_rate)来实现。

class AdamSGD(keras.optimizers.Optimizer):
     def __init__(self, lr=0.001, beta_1=0.9, beta_2=0.999,
                     momentum=0.0, epsilon=None, decay=0.0, name='AdamSGD', **kwargs):
        super(AdamSGD, self).__init__(name=name, **kwargs)
        self.iterations = K.variable(0, dtype='int64', name='iterations')
        self._learning_rate = self._build_learning_rate(lr)
        self.beta_1 = K.variable(beta_1, name='beta_1')
        self.beta_2 = K.variable(beta_2, name='beta_2')
        self.momentum = K.variable(momentum, name='momentum')
        self.epsilon = epsilon or K.epsilon()
        self.decay = K.variable(decay, name='decay')

此函数使优化器能够接受schedule或浮点值作为学习率。
您可能还需要实现一些额外的方法,请参阅代码中的注解:

创建自定义优化器

如果您打算创建自己的优化算法,请从此类继承并重写以下方法:

  • build:创建与优化器相关的变量,例如SGD优化器中的momentums
  • update_step:实现优化器的更新逻辑。
  • get_config:优化器的序列化,包括所有超参数。

相关问题