You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:24:03