TensorFlow Keras实现DDQN报Sequential无model属性错误
Double Deep Q-Learning 运行报错修复方案
错误现象
运行DDQN训练代码时抛出如下异常:
Traceback (most recent call last): File "/home/panda/PycharmProjects/ddqn/main.py", line 33, in <module> ddqn_agent.learn() File "/home/panda/PycharmProjects/ddqn/ddqn_keras.py", line 118, in learn self.update_network_parameters() File "/home/panda/PycharmProjects/ddqn/ddqn_keras.py", line 121, in update_network_parameters self.q_target.model.set_weights(self.q_eval.model.get_weights()) AttributeError: 'Sequential' object has no attribute 'model'
使用的DQN网络构建代码如下:
from tensorflow.keras.layers import Dense, Activation from tensorflow.keras.models import Sequential, load_model from tensorflow.keras.optimizers import Adam def build_dqn(lr, n_actions, input_dims, fc1_dims, fc2_dims): model = Sequential([ Dense(fc1_dims, input_shape=(input_dims,)), Activation('relu'), Dense(fc2_dims), Activation('relu'), Dense(n_actions)]) model.compile(optimizer=Adam(lr=lr), loss='mse') return model
已尝试将所有Keras导入路径修改为tensorflow.keras前缀,错误仍未解决。
错误根因
该问题与Keras导入路径无关,是旧教程代码与新版API逻辑不匹配导致:build_dqn函数直接返回实例化完成的Sequential模型对象,对象本身不存在嵌套的.model属性。旧版参考教程大概率使用自定义类封装模型,将Sequential实例存储在类的model属性下,当前代码直接拿到Sequential实例后仍按旧逻辑访问.model属性,必然触发属性不存在的错误。
修复步骤
- 定位到
ddqn_keras.py中的update_network_parameters方法,删除权重同步逻辑中多余的.model调用,修改后代码如下:def update_network_parameters(self): # 错误写法:self.q_target.model.set_weights(self.q_eval.model.get_weights()) self.q_target.set_weights(self.q_eval.get_weights()) - 全局检索
ddqn_keras.py文件中所有self.q_eval.model、self.q_target.model的调用位置,全部删除中间的.model字段。包括模型预测predict()、训练fit()、权重存取、模型保存/加载相关逻辑,q_eval和q_target本身就是可直接调用方法的Sequential模型实例,无需通过.model属性二次访问。 - 高版本TensorFlow兼容处理:如果使用TensorFlow 2.16及以上版本,
Adam优化器的学习率参数名已从lr变更为learning_rate,需要同步修改build_dqn中的编译代码,否则会触发参数不识别的警告或错误,修改后编译逻辑为:
TensorFlow 2.15及以下版本可保留原有model.compile(optimizer=Adam(learning_rate=lr), loss='mse')lr=lr写法,无需调整。
内容的提问来源于stack exchange,提问作者user17350567
相关产品推荐
相关产品推荐

