
dqn模型加载后性能大幅下降,主因是未同步保存ε-greedy策略参数(如epsilon)和经验回放缓冲区(memory),导致加载后仍以高探索率随机行动,丧失已学策略。
dqn模型加载后性能大幅下降,主因是未同步保存ε-greedy策略参数(如epsilon)和经验回放缓冲区(memory),导致加载后仍以高探索率随机行动,丧失已学策略。
在深度强化学习中,DQN的性能不仅依赖于神经网络权重,更依赖于完整的智能体(Agent)状态——包括策略参数(如当前ε值)、经验回放记忆(memory),甚至优化器状态(如Adam的动量)。你当前的代码中,DQLAgent(env, model_path=...) 构造函数仅加载了模型权重,却重置了 self.epsilon = 1 和空 self.memory = deque(maxlen=2000),这等价于“用训练好的大脑,配上新手的决策习惯和零经验”,必然导致行为退化。
✅ 正确做法:统一序列化完整Agent状态
不应仅保存模型 .keras 文件,而应将模型权重 + epsilon + memory + 其他关键超参打包保存。推荐使用 pickle 或自定义 JSON/h5 封装(注意:Keras模型本身不序列化epsilon等非网络参数):
import pickle
from tensorflow.keras.models import load_model
def save_full_agent(self, file_path):
# 保存模型权重(推荐用save_weights_only=True避免架构耦合)
self.model.save_weights(f"{file_path}_weights.h5")
# 保存非模型状态
state_dict = {
'epsilon': self.epsilon,
'epsilon_decay': self.epsilon_decay,
'epsilon_min': self.epsilon_min,
'gamma': self.gamma,
'learning_rate': self.learning_rate,
'memory': list(self.memory), # deque → list
'state_size': self.state_size,
'action_size': self.action_size
}
with open(f"{file_path}_state.pkl", 'wb') as f:
pickle.dump(state_dict, f)
def load_full_agent(self, file_path):
# 重建模型结构(必须与训练时完全一致)
self.model = self.build_model() # 注意:build_model()需可复现相同架构
# 加载权重
self.model.load_weights(f"{file_path}_weights.h5")
# 加载状态
with open(f"{file_path}_state.pkl", 'rb') as f:
state_dict = pickle.load(f)
self.epsilon = state_dict['epsilon']
self.epsilon_decay = state_dict['epsilon_decay']
self.epsilon_min = state_dict['epsilon_min']
self.gamma = state_dict['gamma']
self.learning_rate = state_dict['learning_rate']
self.memory = deque(state_dict['memory'], maxlen=2000)⚠️ 关键注意事项
-
评估模式需禁用探索:加载模型用于测试时,应强制 agent.epsilon = 0 或添加 eval_mode=True 标志,在 act() 中跳过随机采样:
def act(self, state, eval_mode=False): if eval_mode or np.random.rand() > self.epsilon: # 仅训练时探索 act_values = self.model.predict(state, verbose=0) return np.argmax(act_values[0]) return self.env.action_space.sample() - 避免重复调用 adaptiveEGreedy():评估阶段切勿更新 epsilon,否则会意外降低探索率或干扰策略。
- 模型架构一致性:load_full_agent() 中调用的 self.build_model() 必须与训练时完全相同(层类型、尺寸、激活函数),否则权重无法正确映射。
- 内存不是评估必需项:若仅做推理(inference),memory 可为空;但若需继续训练,则必须恢复。
? 总结
DQN的“可部署性”取决于策略状态的完整性。单纯保存模型权重只是保存了“知识”,而 epsilon 和 memory 才是决定“如何运用知识”的操作手册。务必通过 save_full_agent / load_full_agent 统一管理,并在评估时显式启用确定性策略(eval_mode=True)。如此,加载后的模型才能真正复现训练结束时的最优表现。


















