使用keras-rl2训练DQN遇ValueError:解包值数量不符
解决keras-rl2与Gym 0.26+的适配问题
出现ValueError: too many values to unpack (expected 4)的核心原因是:Gym 0.26及以上版本对env.step()的返回值做了改动——将原来的4个返回值(observation, reward, done, info)拆分为5个(observation, reward, terminated, truncated, info),而keras-rl2的核心逻辑仍按旧版Gym的4个返回值做解包。
以下是三种可行的解决方法:
1. 降级Gym到兼容版本
keras-rl2官方适配的稳定版本是Gym 0.25.2,直接执行降级命令即可:
pip install gym==0.25.2
此方法无需修改代码,适合快速恢复训练流程。
2. 修改keras-rl2源码适配新Gym
找到keras-rl2的安装路径(可通过pip show keras-rl2查看Location字段),打开rl/core.py文件,定位到Agent类的step方法中处理env.step()的代码段:
原代码:
observation, reward, done, info = self.env.step(action)
替换为:
observation, reward, terminated, truncated, info = self.env.step(action) done = terminated or truncated # 合并终止信号为旧版的done格式
修改后保存即可让keras-rl2兼容新Gym的返回值格式。
3. 自定义环境包装类适配
如果不想修改库源码,可通过包装Gym环境,将新的5个返回值转换为旧格式:
class GymEnvWrapper: def __init__(self, env): self.env = env # 继承原环境的属性和方法 self.action_space = env.action_space self.observation_space = env.observation_space def step(self, action): # 转换新Gym的step返回值为旧格式 obs, reward, terminated, truncated, info = self.env.step(action) return obs, reward, terminated or truncated, info def reset(self, **kwargs): return self.env.reset(**kwargs) def render(self, **kwargs): return self.env.render(**kwargs) def close(self): self.env.close()
训练时使用包装后的环境:
wrapped_env = GymEnvWrapper(env) dqn.fit(wrapped_env, nb_steps=500000, callbacks=[checkpoint_callback], log_interval=10000, visualize=False)
内容的提问来源于stack exchange,提问作者Harshith RM
相关产品推荐
相关产品推荐

