Stable_Baselines3使用Monitor记录reset后观测值报错求助
问题根源
报错核心原因是Stable-Baselines3(SB3)v1.6+版本已全面切换到Gymnasium(原OpenAI Gym的官方维护分支),而你代码使用的是旧版gym库,导致环境的action_space类型是gym.spaces.Discrete,但SB3的类型检查只接受gymnasium.spaces下的空间类型,因此触发断言错误。
解决方案
1. 切换到Gymnasium依赖
先卸载旧版gym,安装带环境依赖的Gymnasium:
pip uninstall gym -y pip install gymnasium[box2d]
([box2d]是LunarLander-v2环境所需的物理引擎依赖)
2. 修改适配Gymnasium的代码
调整导入逻辑,修复CustomMonitor的初始化参数传递,同时适配Gymnasium的reset()返回格式:
import gymnasium as gym from stable_baselines3 import PPO from stable_baselines3.common.monitor import Monitor class CustomMonitor(Monitor): def __init__(self, env, filename=None, allow_early_resets=True, reset_keywords=(), info_keywords=()): # 传递所有参数给父类完成初始化 super().__init__(env, filename, allow_early_resets, reset_keywords, info_keywords) self.reset_observations = [] def reset(self, **kwargs): # Gymnasium的reset返回(observation, info)元组 observation, info = super().reset(**kwargs) self.reset_observations.append(observation) return observation, info env = gym.make('LunarLander-v2') env = CustomMonitor(env) model = PPO('MlpPolicy', env, verbose=1) model.learn(total_timesteps=1000000) model.save("ppo_lunarlander_mutant") # 训练结束后可通过该属性获取所有重置后的观测 print(f"累计记录重置观测数: {len(env.reset_observations)}")
3. 兼容旧版Gym(不推荐)
若坚持使用旧版gym,需安装SB3兼容的旧Gym版本,后续可能存在更多兼容性隐患:
pip install stable-baselines3[extra] gym==0.26.2
代码可保留你原本的逻辑,无需修改reset()的返回格式,但长期来看建议迁移到Gymnasium。
内容的提问来源于stack exchange,提问作者desert_ranger
相关产品推荐
相关产品推荐

