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

如何更新openai.gym.spaces.Dict状态并解决dict无flatten属性报错

Dict类型观测空间报错解决方案

你遇到的报错核心是Stable Baselines3默认的MlpPolicy仅支持一维扁平的Box类观测输入,无法直接处理gym.spaces.Dict类型的复合观测结构,同时原代码的step、reset方法也不符合Gym环境的接口规范,也会引发后续报错。

需要修改的内容

  • 把PPO的策略类型从MlpPolicy替换为MultiInputPolicy,该策略原生支持Dict、Tuple等复合观测空间的自动处理
  • 补全step方法的返回值:Gym要求step方法必须返回「下一状态、奖励、是否终止、是否截断、额外信息」五要素(Gym 0.26及以上版本),低于0.26版本返回「下一状态、奖励、是否终止、额外信息」四要素即可
  • 补全reset方法的返回值:Gym要求reset方法返回「初始状态、额外信息」二元组

完整修改后代码

import math
from gym import Env
from gym.spaces import Discrete, Box, Dict, Tuple, MultiBinary, MultiDiscrete

from stable_baselines3 import PPO
screen_width = 900

class GameEnv(Env):
    def __init__(self):
        self.action_space = Discrete(5)
        observation_positions = Box(low=0, high=screen_width, shape=(2,))
        self.observation_space = Dict({'observation_positions': observation_positions})
        self.state = self.observation_space.sample()

    def step(self, action):
        self.state = self.observation_space.sample()
        # 奖励、终止/截断标志可根据自身业务逻辑调整
        reward = 0
        terminated = False
        truncated = False
        info = {}
        return self.state, reward, terminated, truncated, info

    def render(self):
        pass

    def reset(self, seed=None, options=None):
        super().reset(seed=seed)
        self.state = self.observation_space.sample()
        info = {}
        return self.state, info


env = GameEnv()
# 替换为适配复合观测的多输入策略
model = PPO('MultiInputPolicy', env, verbose=1,)
model.learn(total_timesteps=1000)

可选替代方案:如果你不想使用多输入策略,也可以手动把Dict观测扁平化为一维向量,把观测空间改为对应维度的Box即可,不需要修改策略类型。

内容的提问来源于stack exchange,提问作者msba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 11:06:03