ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Stable Baselines3 如何兼容 Discrete 动作空间 start 不为 0 的自定义环境

Stable Baselines3 如何兼容 Discrete 动作空间 start 不为 0 的自定义环境 Stable Baselines3 如何兼容 Discrete 动作空间 start 不为 0 的自定义环境【免费下载链接】stable-baselines3PyTorch version of Stable Baselines, reliable implementations of reinforcement learning algorithms.项目地址: https://gitcode.com/GitHub_Trending/st/stable-baselines3如果你的自定义 gymnasium 环境把动作空间定义成了spaces.Discrete(N, startk)且k ! 0例如动作编号从 1 开始直接交给 Stable Baselines3SB3训练会出问题SB3 不支持start ! 0的Discrete/MultiDiscrete空间官方自定义环境文档明确说明了这一点见 docs/guide/custom_env.md。目标是用官方给出的方式把环境改造为 SB3 兼容的形式并通过check_env验证后正常训练。为什么 start 必须为 0SB3 在创建动作分布时只读取action_space.n完全忽略startstable_baselines3/common/distributions.py 中make_proba_distribution对Discrete空间直接构造CategoricalDistribution(int(action_space.n))。也就是说采样出的动作索引是从 0 计数的如果你的环境期望收到start偏移后的动作两者会错位。SB3 自带的环境检查器也会检测这个问题stable_baselines3/common/env_checker.py 中的_check_non_zero_start在发现Discrete或MultiDiscrete空间start不为 0 时发出警告例如Discrete action space with a non-zero start (start[1]) is not supported by Stable-Baselines3. You can use a wrapper (...) or update your action space.上面的文本是该警告信息的实际格式start处的值随你的空间而变。前提条件环境已实现 gymnasium 接口reset/step/observation_space/action_space且动作空间是Discretestart不为 0。已安装 SB3 与 gymnasium。方式一用官方示例的 ShiftWrapper 包装环境文档给出的推荐做法是“更新你的环境或使用一个 wrapper”。如果不想改动原环境直接使用文档中的ShiftWrapper摘自 docs/guide/custom_env.mdimport gymnasium as gym class ShiftWrapper(gym.Wrapper): Allow to use Discrete() action spaces with start!0 def __init__(self, env: gym.Env) - None: super().__init__(env) assert isinstance(env.action_space, gym.spaces.Discrete) self.action_space gym.spaces.Discrete(env.action_space.n, start0) def step(self, action: int): return self.env.step(action self.env.action_space.start)它做了两件事__init__中把暴露给 SB3 的action_space重置为同样的n但start0这样 SB3 采样的 0-based 索引符合策略分布的预期step中把 0-based 的动作加回原环境的start后再传给被包装的环境保证原环境收到的动作编号不变。使用方式# 实例化你自己的环境arg1, ... 替换为你的环境构造参数 env CustomEnv(arg1, ...) env ShiftWrapper(env)assert isinstance(env.action_space, gym.spaces.Discrete)保证了这个 wrapper 只适用于Discrete动作空间如果包装后action_space不是start0的Discrete说明用错了对象。方式二直接修改自己的环境如果你能改环境源码把action_space的定义改为spaces.Discrete(N)即start0并同步调整step内部对动作编号的映射效果与 wrapper 等价。文档把这条路表述为 “update your environment”两种做法是并列的替代路径选其一即可。验证用 check_env 检查警告是否消失SB3 文档提供的验证方式是对环境跑check_envfrom stable_baselines3.common.env_checker import check_env env CustomEnv(arg1, ...) # 换成你的环境实例 # It will check your custom environment and output additional warnings if needed check_env(env)对比包装前后的输出包装前会看到上一条中提到的 non-zero start 警告包装后env ShiftWrapper(env)后再检查该条警告不再出现说明动作空间已满足 SB3 的要求。注意check_env会顺带输出与当前问题无关的其他警告例如渲染、obs 类型问题判断成功只看 non-zero start 这条警告是否消失。验证后即可训练确认警告消失后就可以按自定义环境文档的标准流程训练A2C与total_timesteps取自文档示例策略名按你的观测类型选择图像输入用CnnPolicy# Define and Train the agent model A2C(CnnPolicy, env).learn(total_timesteps1000)限制说明该问题同时适用于观测空间_check_non_zero_start对observation_space同样生效如果观测空间也是非零start的Discrete需要同样处理。ShiftWrapper只解决start ! 0这一项MultiDiscrete的多维nvec、Tuple/Dict 动作空间等是另外的问题文档中另有对应的ReshapeWrapper等方案不在本文范围内。gymnasium 官方也有自己的env checker但它检查的范围是 SB3 支持范围的超集验证 SB3 兼容性应以 SB3 的check_env为准。【免费下载链接】stable-baselines3PyTorch version of Stable Baselines, reliable implementations of reinforcement learning algorithms.项目地址: https://gitcode.com/GitHub_Trending/st/stable-baselines3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表