找回密码
 立即注册

QQ登录

只需一步,快速开始

本帖最后由 lou 于 2020-4-27 11:26 编辑

Geek专栏:OpenAI Gym 源码阅读:创建自定义强化学习环境



今天Geek专栏为大家带来
乐聚机器人王松博士的
“OpenAIGym 源码阅读:创建自定义强化学习环境”

Gym 介绍


Gymhttps://gym.openai.com/)是一套开发强化学习算法的工具箱,包含了一系列内置的环境(https://gym.openai.com/docs/#environments),结合强化学习算法就可以对内置的环境进行求解。


95.png

例如,调用CartPole-v0 环境的示例如下:

  1.    import gym
  2.    env = gym.make('CartPole-v0')
  3.    for i_episode in range(20):
  4.        observation = env.reset()
  5.        for t in range(100):
  6.            env.render()
  7.            print(observation)
  8.            action = env.action_space.sample()
  9.            observation, reward, done, info = env.step(action)
  10.           if done:
  11.               print("Episode finished after {} timesteps".format(t+1))
  12.               break
  13.   env.close()
复制代码

Gym 仿真主要包括:

  • 导入环境 gym.make('CartPole-v0')
  • 初始化环境 env.reset(),将强化学习环境设置为初始状态
  • 一步仿真 env.step(action),输入动作,获得环境反馈
  • 渲染可视化当前状态 env.render()
虽然 Gym 内置了大量强化学习环境,如果想训练自定义的强化学习问题,就必须要创建自定义的强化学习环境。

源码解析

根据上一节的Gym 主要函数调用接口,CartPoleEnv
https://github.com/openai/gym/bl ... control/cartpole.py)继承了基类 gym.Env(https://github.com/openai/gym/blob/master/gym/core.py),里面定义了主要的 API 方法
  • step
  • reset
  • render
  • close
  • seed
创建了自定义的环境,需要由 gym/envs/init.py
https://github.com/openai/gym/blob/master/gym/envs/__init__.py)进行注册,注册id 名,指定路径gym.envs.classic_control:CartPoleEnv 和其他参数。

  1.    from gym.envs.registration import registry, register, make, spec
  2.    register(
  3.        id='CartPole-v0',
  4.        entry_point='gym.envs.classic_control:CartPoleEnv',
  5.        max_episode_steps=200,
  6.        reward_threshold=195.0,
  7.    )
复制代码

gym/envs/registration.pyhttps://github.com/openai/gym/bl ... egistration.py#L150)实例化了 1 个全局的 registry =EnvRegistry()

  1. def make(self, **kwargs):
  2.        """Instantiates an instance of the environment with appropriate kwargs"""
  3.        if self.entry_point is None:
  4.            raise error.Error('Attempting to make deprecated env {}. (HINT: is there a newer registered version of this env?)'.format(self.id))
  5.        _kwargs = self._kwargs.copy()
  6.        _kwargs.update(kwargs)
  7.        if callable(self.entry_point):
  8.            env = self.entry_point(**_kwargs)
  9.        else:
  10.           cls = load(self.entry_point)
  11.           env = cls(**_kwargs)
  12.       # Make the enviroment aware of which spec it came from.
  13.       env.unwrapped.spec = self
  14.       return env
复制代码


所以,总结一下,如果希望导入自定义环境的话,只需要在自定义的 package 中注册 id,并指定自定义 Env 类的路径


  1. from gym.envs.registration import register

  2.    register(
  3.        id='custom-env-name',
  4.        entry_point='path.to:CusEnvClassName',
  5.    )
复制代码

然后调用 gym.make('custom-env-name') 就能导入自定义的环境
创建自定义环境
根据上面注册环境的流程分析,可知,要引入自定义环境,不必改动 Gym 的源码,只需创建一个 Python 模块 即可。目录结构解释如下:

97.png

为了方便调试调用,以 pip install -e . 安装自定义模块。测试代码中,引入模块时,即可将自定义环境注册到 Gym 环境中。

  1. import gym
  2. import gym_foo
  3. env = gym.make('foo-v0')
复制代码

自定义环境模块参考代码


参考

分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册