如何解决LSTM贝叶斯调参时出现keras.optimizers无Adam属性错误问题
报错原因
- 核心原因为Keras版本迭代导致的优化器导入路径变更:Keras 2.10及以上版本中,独立Keras包的原生Adam优化器已从
keras.optimizers命名空间下移除,原有路径失效;此前代码可正常运行是因为当时使用的是2.9及更低版本的Keras,或导入的是TensorFlow内置的tf.keras包而非独立Keras包。 - 额外问题:你的代码中重复调用了两次
model.compile(),后一次配置会完全覆盖前一次,第一次compile调用属于无效代码,可直接删除;同时LSTM的单元数参数num_units最小值设为0,会导致后续运行时报错,需要修正最小值为1。
解决方案
方案1(兼容性最优,推荐):使用TensorFlow内置的keras优化器
直接将代码中所有keras.optimizers.Adam替换为tf.keras.optimizers.Adam即可,修改后可用的build函数如下:
def build(hp): activation = hp.Choice('activation', ['relu', 'tanh', 'linear', 'selu', 'elu']) recurrent_dropout = hp.Float('recurrent_dropout', min_value=0.0, max_value=0.99) # 修正num_units最小值为1,避免0单元的非法LSTM结构 num_units = hp.Int('num_units', min_value=1, max_value=512) model = keras.models.Sequential() model.add(LSTM(units=num_units, activation=activation, recurrent_dropout=recurrent_dropout, input_shape=(80, 50))) model.add(keras.layers.Dense(1)) # 删掉重复的第一次compile,改用tf.keras的Adam优化器 model.compile( optimizer= tf.keras.optimizers.Adam(hp.Float( 'learning_rate', min_value=1e-10, max_value=1e-2, sampling='LOG', default=1e-6 ), ), loss=tf.losses.MeanSquaredError(), metrics=[tf.metrics.MeanAbsoluteError()] ) return model
附带说明你遇到的cuDNN警告问题:这是因为你给LSTM加了recurrent_dropout参数,原生cuDNN加速的LSTM不支持循环 dropout,如果你需要GPU加速训练,可以将recurrent_dropout设为0,同时把激活函数固定为tanh即可触发cuDNN加速,不需要的话可以直接忽略该警告。
方案2:使用新版本独立Keras的legacy优化器
如果你坚持使用独立安装的Keras包而非TensorFlow内置的tf.keras,可以将keras.optimizers.Adam替换为keras.optimizers.legacy.Adam即可解决找不到属性的问题。
方案3:降级Keras版本
不想修改代码的话,直接将Keras版本回退到2.9及以下版本即可,执行命令:pip install keras==2.9
注意需要保证Keras版本和本地TensorFlow版本匹配,TensorFlow 2.9对应Keras 2.9,避免出现版本兼容问题。
内容的提问来源于stack exchange,提问作者K H
相关产品推荐
相关产品推荐

