资讯动态

深入解析 Dopamine 的 create_gym_environment:Gym 环境接入与预处理指南

发布时间:2026/9/24 16:31:51 来源:尧图企业网站定制
强化学习机器学习深度学习【免费下载链接】dopamineDopamine is a research framework for fast prototyping of reinforcement learning algorithms.项目地址https://gitcode.com/gh_mirrors/dopami/dopamine点击查看免费下载导读create_gym_environment是 Dopamine 强化学习研究框架中连接 GymOpenAI Gym标准环境的官方入口函数负责将 CartPole、Acrobot、LunarLander、MountainCar 等经典经典控制classic control任务包装成 Dopamine 训练管线所需的统一接口。本文将以该函数为核心结合仓库源码 gym_lib.py 与其配套 Gin 配置完整讲解它的函数签名、参数语义、内部调用链、GymPreprocessing包装类的实现原理以及如何通过 Gin 配置和命令行接入不同 Gym 环境并运行 DQN、Rainbow 等智能体。读完本文你将掌握在 Dopamine 中从零配置并运行一个 Gym 环境实验的完整方法也能理解该函数背后的设计取舍。函数总览签名与文档语义该函数的官方 API 文档位于 create_gym_environment.md模块级说明位于 gym_lib.md。函数定义位于源码 gym_lib.pygin.configurable def create_gym_environment(environment_nameNone, versionv0): Wraps a Gym environment with some basic preprocessing. Args: environment_name: str, the name of the environment to run. version: str, version of the environment to run. Returns: A Gym environment with some standard preprocessing. assert environment_name is not None full_game_name {}-{}.format(environment_name, version) env gym.make(full_game_name) # Strip out the TimeLimit wrapper from Gym, which caps us at 200 steps. if isinstance(env, TimeLimit): env env.env # Wrap the returned environment in a class which conforms to the API expected # by Dopamine. env GymPreprocessing(env) return env参数说明参数类型默认值语义environment_namestrNone要运行的 Gym 环境名称如CartPole、Acrobot、LunarLander、MountainCar必填传入None会触发断言失败versionstrv0环境版本号如v0、v1、v2最终拼接为{environment_name}-{version}如CartPole-v0后交给gym.make返回值返回一个经过标准预处理包装的 Gym 环境即GymPreprocessing包装类的实例。三个关键设计点gin.configurable装饰器函数可直接被 Gin 配置框架以create_gym_environment.environment_name CartPole的形式赋值这是它能够出现在.gin配置文件中的根本原因。断言必填assert environment_name is not None保证环境名不会被静默忽略。剥离 TimeLimit 包装Gym 默认给环境套上TimeLimit一般限制 200 步而 Dopamine 的 Runner 自带max_steps_per_episode机制来控制回合长度因此这里主动剥离以避免双重限步。内部调用链从 gym.make 到 GymPreprocessing函数内部只有三个步骤但每一步都值得展开第一步gym.make(full_game_name)full_game_name由environment_name与version拼接而成。例如CartPole v0→CartPole-v0Acrobot v1→Acrobot-v1LunarLander v2→LunarLander-v2这一步依赖本地安装的gym包以及已注册的环境 ID也就是说环境必须存在于 Gym 的注册表中否则gym.make会抛出错误。第二步剥离 TimeLimit 包装源码注释明确说明了动机Strip out the TimeLimit wrapper from Gym, which caps us at 200 steps.剥离 Gym 的 TimeLimit 包装它把回合限制在 200 步。代码通过isinstance(env, TimeLimit)判断TimeLimit从gym.wrappers.time_limit导入命中后用env.env取出被包装的原始环境。这样回合长度完全由 Dopamine Runner 的max_steps_per_episode决定不会与 Gym 默认限步冲突。第三步包装为 GymPreprocessing最终返回GymPreprocessing(env)使普通 Gym 环境符合 Dopamine 期望的 API。GymPreprocessing让 Gym 环境符合 Dopamine 的 API 契约GymPreprocessing是 gym_lib.py 中定义的轻量包装类模块文档对其定位是 makes general Gym environments conformant with the API Dopamine is expecting让普通 Gym 环境符合 Dopamine 期望的 API。gin.configurable class GymPreprocessing(object): A Wrapper class around Gym environments. def __init__(self, environment): self.environment environment self.game_over False property def observation_space(self): return self.environment.observation_space property def action_space(self): return self.environment.action_space property def reward_range(self): return self.environment.reward_range property def metadata(self): return self.environment.metadata def reset(self): return self.environment.reset() def step(self, action): observation, reward, game_over, info self.environment.step(action) was_truncated info.get(TimeLimit.truncated, False) game_over game_over and not was_truncated self.game_over game_over return observation, reward, game_over, info关键实现要点属性透传observation_space、action_space、reward_range、metadata四个属性直接委托给底层环境智能体据此推断观察与动作维度。reset()透传直接调用底层环境重置并返回初始观察。step()截断感知这是包装类最核心的逻辑——从info字典读取TimeLimit.truncated标记。若回合因超过时间限制而被 Gym 截断truncated则game_over会被置为False避免智能体把超时截断误判为真正的终止如 CartPole 的杆子倒下从而保证 bootstrapping自举更新时不会错误地使用 0 作为终局价值。game_over状态跟踪维护self.game_over属性供外部查询当前回合是否真正结束。测试验证仓库测试 gym_lib_test.py 用MockGymEnvironment验证了包装类的行为属性透传、reset返回、step返回(obs, rew, False, {})四元组与 Gym 的标准交互协议一致。通过 Gin 配置接入具体环境以 DQN 为例create_gym_environment的典型用法是在 Gin 配置文件中绑定参数然后由 Runner 通过create_environment_fn工厂函数调用。以 dqn_cartpole.gin 为例# Hyperparameters for a simple DQN-style Cartpole agent. import dopamine.discrete_domains.gym_lib import dopamine.discrete_domains.run_experiment import dopamine.agents.dqn.dqn_agent import dopamine.replay_memory.circular_replay_buffer import gin.tf.external_configurables DQNAgent.observation_shape %gym_lib.CARTPOLE_OBSERVATION_SHAPE DQNAgent.observation_dtype %gym_lib.CARTPOLE_OBSERVATION_DTYPE DQNAgent.stack_size %gym_lib.CARTPOLE_STACK_SIZE DQNAgent.network gym_lib.CartpoleDQNNetwork DQNAgent.gamma 0.99 DQNAgent.update_horizon 1 DQNAgent.min_replay_history 500 DQNAgent.update_period 4 DQNAgent.target_update_period 100 DQNAgent.epsilon_fn dqn_agent.identity_epsilon DQNAgent.tf_device /gpu:0 # use /cpu:* for non-GPU version DQNAgent.optimizer tf.train.AdamOptimizer() tf.train.AdamOptimizer.learning_rate 0.001 tf.train.AdamOptimizer.epsilon 0.0003125 create_gym_environment.environment_name CartPole create_gym_environment.version v0 create_agent.agent_name dqn Runner.create_environment_fn gym_lib.create_gym_environment Runner.num_iterations 500 Runner.training_steps 1000 Runner.evaluation_steps 1000 Runner.max_steps_per_episode 200 # Default max episode length. WrappedReplayBuffer.replay_capacity 50000 WrappedReplayBuffer.batch_size 128配置要点解读环境选择create_gym_environment.environment_name CartPole与create_gym_environment.version v0直接对应函数两个参数最终创建CartPole-v0。工厂函数绑定Runner.create_environment_fn gym_lib.create_gym_environment告诉 Runner 用哪个函数创建环境。观察形状配套%gym_lib.CARTPOLE_OBSERVATION_SHAPE等常量在 gym_lib.py 顶部通过gin.constant定义如CARTPOLE_OBSERVATION_SHAPE (4, 1)、CARTPOLE_OBSERVATION_DTYPE tf.float64、CARTPOLE_STACK_SIZE 1与 CartPole 的 4 维状态观测一一对应。回合长度控制Runner.max_steps_per_episode 200接替了被剥离的 Gym TimeLimitDopamine 的 Runner 在此步数上限内自行判断回合终止配合GymPreprocessing.step的截断感知逻辑。多环境接入实践DQN 在四个经典控制任务上的配置差异仓库为 DQN 提供了四套针对不同 Gym 环境的完整配置对比即可看出接入不同环境的完整模式环境配置文件环境名/版本观察形状常量网络回合上限CartPoledqn_cartpole.ginCartPole-v0CARTPOLE_OBSERVATION_SHAPE(4,1)CartpoleDQNNetwork200Acrobotdqn_acrobot.ginAcrobot-v1ACROBOT_OBSERVATION_SHAPE(6,1)AcrobotDQNNetwork500LunarLanderdqn_lunarlander.ginLunarLander-v2LUNAR_OBSERVATION_SHAPE(8,1)LunarLanderDQNNetwork1000MountainCardqn_mountaincar.ginMountainCar-v0MOUNTAINCAR_OBSERVATION_SHAPE(2,1)MountainCarDQNNetwork600观察形状常量定义于 gym_lib.py对应的MIN_VALS/MAX_VALS常量如CARTPOLE_MIN_VALS np.array([-2.4, -5., -math.pi/12., -math.pi*2.])则用于网络层将输入特征归一化到[-1, 1]区间——这正是BasicDiscreteDomainNetworkgym_lib.py内部x - self.min_vals; x / self.max_vals - self.min_vals; x 2.0 * x - 1.0这段归一化代码的数据来源。将 create_gym_environment 扩展到 Rainbow 与 C51同一函数也服务于 Rainbow 类智能体配置模式完全相同只是网络与超参数不同。以 c51_cartpole.gin 为例RainbowAgent.observation_shape %gym_lib.CARTPOLE_OBSERVATION_SHAPE RainbowAgent.observation_dtype %gym_lib.CARTPOLE_OBSERVATION_DTYPE RainbowAgent.stack_size %gym_lib.CARTPOLE_STACK_SIZE RainbowAgent.network gym_lib.CartpoleRainbowNetwork RainbowAgent.num_atoms 201 RainbowAgent.vmax 100. RainbowAgent.gamma 0.99 RainbowAgent.epsilon_eval 0. RainbowAgent.epsilon_train 0.01 RainbowAgent.update_horizon 1 RainbowAgent.min_replay_history 500 RainbowAgent.update_period 1 RainbowAgent.target_update_period 1 RainbowAgent.epsilon_fn dqn_agent.identity_epsilon RainbowAgent.replay_scheme uniform RainbowAgent.tf_device /gpu:0 RainbowAgent.optimizer tf.train.AdamOptimizer() create_gym_environment.environment_name CartPole create_gym_environment.version v0 create_agent.agent_name rainbow Runner.create_environment_fn gym_lib.create_gym_environment Runner.num_iterations 400 Runner.training_steps 1000 Runner.evaluation_steps 1000 Runner.max_steps_per_episode 200CartpoleRainbowNetworkgym_lib.py同样基于BasicDiscreteDomainNetwork区别在于输出层展开为num_actions × num_atoms通过 softmax 得到价值分布并用support加权求和得到 Q 值。仓库还提供了 rainbow_cartpole.ginnum_atoms51、vmax10.、replay_schemeprioritized作为 Rainbow 全量变体的示例以及 Acrobot 的 rainbow_acrobot.gin、c51_acrobot.gin 等配置文件。从命令行运行实验配置好 Gin 文件后通过 train.py 启动训练命令格式为python -m dopamine.discrete_domains.train \ --base_dir/tmp/dopamine/cartpole \ --gin_filesdopamine/agents/dqn/configs/dqn_cartpole.gin命令行支持的三个参数定义于 train.py参数类型说明--base_dirstr必填存放所有子目录的根目录缺省会直接报错flags.mark_flag_as_required--gin_files多值字符串一个或多个 Gin 配置文件的路径列表--gin_bindings多值字符串覆盖配置值的 Gin 绑定例如create_gym_environment.environment_nameMountainCar、create_gym_environment.versionv0main的执行流程train.py为加载 Gin 配置 →run_experiment.create_runner(base_dir)创建 Runner →runner.run_experiment()开始训练。Runner 在构造时run_experiment.py调用self._environment create_environment_fn()完成环境创建这正是create_gym_environment在训练管线中的实际接入点。因此在不修改任何配置文件的情况下即可通过--gin_bindings一行切换环境python -m dopamine.discrete_domains.train \ --base_dir/tmp/dopamine/acrobot \ --gin_filesdopamine/agents/dqn/configs/dqn_cartpole.gin \ --gin_bindingscreate_gym_environment.environment_nameAcrobot \ --gin_bindingscreate_gym_environment.versionv1 \ --gin_bindingsDQNAgent.networkgym_lib.AcrobotDQNNetwork \ --gin_bindingsDQNAgent.observation_shape%gym_lib.ACROBOT_OBSERVATION_SHAPE注意此时网络与观察形状也必须同步切换为对应环境的配置这是 Gym 接入时最容易遗漏的一点。底层网络支撑BasicDiscreteDomainNetwork 与输入归一化理解create_gym_environment生成的观察如何被消费有助于完整把握接入链路。BasicDiscreteDomainNetworkgym_lib.py是一个全连接网络层接受min_vals/max_vals两个与状态同形状的向量在前向传播中先做线性归一化再送入两个 512 维的隐藏层def call(self, state): x tf.cast(state, tf.float32) x self.flatten(x) if self.min_vals is not None: x - self.min_vals x / self.max_vals - self.min_vals x 2.0 * x - 1.0 # Rescale in range [-1, 1]. x self.dense1(x) x self.dense2(x) x self.last_layer(x) return xDQN 风格num_atomsNone时最后一层输出num_actions维 Q 值Rainbow 风格时输出num_actions × num_atoms维 logits。不同环境的MIN_VALS/MAX_VALS常量gym_lib.py定义了对状态空间的先验边界例如 Acrobot 的 6 维状态两个关节角及其角速度边界ACROBOT_MIN_VALS np.array([-1., -1., -1., -1., -5., -5.])。值得注意的是LunarLanderDQNNetworkgym_lib.py传入(None, None)即不做归一化说明归一化是可选项。此外仓库还提供了基于傅里叶基的线性函数逼近方案FourierDQNNetworkgym_lib.py并在 JAX 版配置中提供 dqn_fourier_cartpole.gin、dqn_fourier_acrobot.gin、dqn_fourier_mountaincar.gin、dqn_fourier_lunarlander.gin 等对应配置。扩展用法MuJoCo 与 SAC 的接入方式create_gym_environment不仅服务于离散控制任务。模块顶部定义了MUJOCO_GAMES (Ant, HalfCheetah, Hopper, Humanoid, Walker2d)gym_lib.py说明该包装函数同样用于创建 MuJoCo 连续控制环境。在 continuous_domains/run_experiment.py 中create_continuous_agent的类型注解直接写为environment: gym_lib.GymPreprocessing即create_gym_environment的返回类型SAC 智能体sac_agent.py从包装后的环境中读取action_space.shape、action_limits、observation_space.shape等字段来构造自身。相关配置见 sac.gin 与 sac_brax.gin。常见问题与注意事项environment_name必须显式指定函数参数默认值为None若未在任何 Gin 文件中绑定assert environment_name is not None会直接中断训练。运行前应检查create_gym_environment.environment_name是否已正确绑定。环境 ID 必须存在于 Gym 注册表gym.make({name}-{version})依赖本地安装的 Gym 包及对应环境注册version拼错或环境未安装都会导致创建失败。回合长度由 Runner 接管剥离TimeLimit后务必在 Gin 中设置Runner.max_steps_per_episode否则回合长度不受控制。同时注意GymPreprocessing.step对TimeLimit.truncated的处理——截断不会被视为真实终止这会影响 n-step bootstrapping 的价值计算正确性。网络与观察形状必须配套切换切换环境时DQNAgent.network、DQNAgent.observation_shape、DQNAgent.observation_dtype、DQNAgent.stack_size必须同步替换为对应环境的常量见上表仅修改环境名会导致形状不匹配。连续控制任务需配合 SAC对 MuJoCo 类环境gym_lib的包装依然适用但智能体侧应使用create_continuous_agent与 SAC 系列配置而不是 DQN 系列。总结create_gym_environment虽然只有十余行代码却是 Dopamine 与 Gym 生态之间的关键桥梁它通过gym.make实例化环境、剥离TimeLimit统一回合长度控制、再用GymPreprocessing将环境适配为 Dopamine 标准 API并正确处理截断语义。配合gin.configurable装饰器它可以在不修改任何 Python 代码的前提下通过 Gin 配置或--gin_bindings灵活切换 CartPole、Acrobot、LunarLander、MountainCar 乃至 MuJoCo 环境并与 DQN、Rainbow、C51、SAC 等智能体自由组合。理解这一函数及其背后的GymPreprocessing包装类、BasicDiscreteDomainNetwork归一化网络即可完整掌握 Dopamine 中经典控制与连续控制实验的接入与调参方法。赞分享强化学习机器学习深度学习【免费下载链接】dopamineDopamine is a research framework for fast prototyping of reinforcement learning algorithms.项目地址https://gitcode.com/gh_mirrors/dopami/dopamine点击查看免费下载相关推荐Dopamine Atari 2600 环境预处理与网络架构全解析atari_lib 模块深度指南Dopamine Atari 2600 环境预处理与网络架构全解析atari_lib 模块深度指南 本篇技术指南围绕 Dopamine 强化学习框架中处理 A强化学习机器学习深度学习Dopamine 中 DeepMind Control Suite 环境适配deepmind_control_lib 深入解析Dopamine 中 DeepMind Control Suite 环境适配deepmind_control_lib 深入解析 导读 Dopamine 的 d机器学习深度学习Dopamine 的 create_atari_environmentAtari 2600 环境的标准化预处理与实战配置Dopamine 的 create_atari_environmentAtari 2600 环境的标准化预处理与实战配置 导读 dopamine.discre机器学习深度学习上一篇Beyond Compare 5永久激活实战手册轻松解锁专业版功能下一篇大气层系统Atmosphere完整指南10步解锁Nintendo Switch终极潜能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价