使用CleanRL运行Pendulum-v1遇SB3 NotImplementedError问题求助
问题分析与解决
出现这个错误的核心原因是SB3的get_obs_shape函数无法识别当前的观测空间类型,即便你打印的观测空间看起来是标准的Box类型,常见触发场景及解决方式如下:
1. gym与gymnasium的类型不匹配
现在很多RL项目开始迁移到gymnasium(替代旧版gym的库),如果你的SB3版本低于2.0,它只会识别gym.spaces.Box类型;而gymnasium返回的观测空间是gymnasium.spaces.Box——这两个是完全独立的类,会导致isinstance判断失败,从而走到get_obs_shape的else分支抛出错误。
解决方法:
- 升级SB3到2.0及以上版本:新版SB3原生支持gymnasium,能正确识别
gymnasium.spaces.Box类型。 - 切换回旧版gym:如果不想升级SB3,可以卸载gymnasium,安装旧版gym(如
gym==0.26.2),确保环境返回的是gym.spaces.Box类型。
2. SB3版本过旧导致的观测空间支持缺失
极少数情况下,非常旧的SB3版本可能对高维Box空间的处理存在疏漏,但这种概率极低——毕竟Pendulum-v1是经典环境,SB3很早就支持它的3维观测空间。
解决方法:
直接升级SB3到最新稳定版本即可。
额外排查点
- 检查CleanRL代码中是否对观测空间做了额外包装:比如是否在环境初始化后修改了观测空间的类型,导致传入ReplayBuffer的不是原始的Box空间。
- 确认ReplayBuffer初始化时传入的
observation_space参数确实是环境的env.observation_space,而非其他自定义空间。
内容的提问来源于stack exchange,提问作者desert_ranger
相关产品推荐
相关产品推荐

