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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:52:34