主页 > 新闻中心 > 领导活动

【tf.keras】tf.keras使用tensorflow中定义的optimizer

如果想要在 tf.keras 中使用 AdamW、SGDW 等优化器,请将 TensorFlow 升级到 2.0,之后在 tensorflow_addons 仓库中可以找到该优化器,且可以正常使用,具体参照:【tf.keras】AdamW: Adam with Weight decay -- wuliytTaotao

在 TensorFlow 1.x 使用 tf.keras 时,请使用 tf.keras.optimizers 里面的优化器,不要使用 tf.train 里面的优化器,不然学习率衰减会出现问题。

使用 tf.keras 过程中,如果要使用 learning rate decay,不要使用 tf.train.AdamOptimizer() 等 tf.train 内的优化器,因为学习率的命名不同,导致 tf.keras 中学习率衰减的函数无法使用,一般都会报错 “AttributeError: 'TFOptimizer' object has no attribute 'lr'”,这个时候即使我们对 "lr" 参数赋值,也没有办法在之后过程中更新真正的学习率,即学习率并没有按照你想的那样进行 decay。

在 tensorflow 1.10.0 中,tf.keras.optimizers 中的优化器参数命名和 tf.train 的优化器初参数命名中还不一样,这个时候像 tf.keras 的参数命名和 Keras 一样,使用 tf.keras.optimizers.Adam() 没问题,但使用 tf.train.AdamOptimizer() 就没法在 tf.keras 中学习率衰减。

在 tensorflow 1.14 中,tf.keras.optimizers 中的优化器参数命名和 tensorflow 一致了,但在初始化时都一行命令,这一行命令将属性和属性绑定,会一起更新,所以 tf.keras 中的优化器可以正常使用 tf.keras 中的 learning rate decay,而此时 tf.train.AdamOptimizer() 及 tf.contrib.opt.AdamWOptimizer() 等优化器还是没法正常使用 tf.keras 中的 learning rate decay。

简言之,在 tf.keras 要使用学习率衰减时,优化器不要选择 tf.train 的,而是要 tf.keras 的。目前为止,两者的转化还不是很好,很容易出问题,发现学习率不能正常 decay 也是要了我的老命。

我的 tensorflow+keras 版本:


tf.keras 没有实现 AdamW,即 Adam with Weight decay。论文《DECOUPLED WEIGHT DECAY REGULARIZATION》提出,在使用 Adam 时,weight decay 不等于 L2 regularization。具体可以参见 当前训练神经网络最快的方式:AdamW优化算法+超级收敛L2正则=Weight Decay?并不是这样

keras 中没有实现 AdamW 这个 optimizer,而 tensorflow 中实现了,所以在 tf.keras 中引入 tensorflow 的 optimizer 就好。

如下所示:


如果只是像上面这样使用的话,已经没问题了。但是如果要加入 tf.keras.callbacks 中的某些元素,如 tf.keras.callbacks.ReduceLROnPlateau(),可能就会出现异常 AttributeError: 'TFOptimizer' object has no attribute 'lr'。

以下代码将出现 AttributeError: 'TFOptimizer' object has no attribute 'lr',就是因为加入了 tf.keras.callbacks.ReduceLROnPlateau(),其它两个 callbacks 不会引发异常。


(上述代码在 tensorflow 1.10.0 之后的版本会出现莫名其妙的错误,以 tensorflow 1.14.0 举例。)



当前训练神经网络最快的方式:AdamW优化算法+超级收敛 -- 机器之心
L2正则=Weight Decay?并不是这样 -- 杨镒铭
ReduceLROnPlateau with native optimizer: 'TFOptimizer' object has no attribute 'lr' #20619

×

扫一扫关注 集团官方微信

平台注册入口