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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:37:35