使用DummyVecEnv封装自定义Gymnasium环境时check_env报错原因
问题:Gymnasium自定义环境用DummyVecEnv封装后check_env报错
我使用Gymnasium(版本:0.28.1)和Stable Baselines3(版本:2.0.0)创建了继承自gymnasium.Env的自定义环境GridWorldEnv,直接调用check_env()时无报错,但用DummyVecEnv封装环境后运行以下代码:
from stable_baselines3.common.vec_env import DummyVecEnv from stable_baselines3.common.env_checker import check_env env = gymnasium.make('gym_examples/GridWorld-v0') env = DummyVecEnv([lambda: env]) check_env(env)
出现错误提示:Gym custom environment expects to be inherited from gym.Env but it is being inherited
报错原因分析
- 版本适配问题:Stable Baselines3 2.0.0的
check_env工具未完全适配Gymnasium的环境体系,它的校验逻辑默认检查环境是否继承自旧版gym.Env,但你的环境继承的是gymnasium.Env,导致工具误判继承关系。 - 校验对象类型错误:
check_env的作用是校验原生Gym/Gymnasium环境,而DummyVecEnv封装后得到的是向量环境(VecEnv),并非原生环境类型,check_env不支持直接对向量环境做校验。 - 封装写法隐患:你在
DummyVecEnv的lambda函数里直接返回了同一个已实例化的环境对象,正确写法应该让lambda每次返回新的环境实例(比如DummyVecEnv([lambda: gymnasium.make('gym_examples/GridWorld-v0')])),不过这不是本次报错的直接原因,但会导致后续训练时多个环境共享同一状态的问题。
内容的提问来源于stack exchange,提问作者fragger
相关产品推荐
相关产品推荐

