我正在尝试使用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.
如果有人有任何建议或知道我哪里出错了,请让我知道,因为我已经在这个错误上停留了很长一段时间了。
1条答案
按热度按时间pb3skfrl1#
错误消息是违反直觉的,但您应该“简单地”在构造函数中设置属性
self._learning_rate
。你可以用函数self._build_learning_rate(learning_rate)
来实现。此函数使优化器能够接受schedule或浮点值作为学习率。
您可能还需要实现一些额外的方法,请参阅代码中的注解:
创建自定义优化器
如果您打算创建自己的优化算法,请从此类继承并重写以下方法:
build
:创建与优化器相关的变量,例如SGD优化器中的momentums
。update_step
:实现优化器的更新逻辑。get_config
:优化器的序列化,包括所有超参数。