强化学习基础篇 OpenAI Gym 环境搭建demo

1. Gym介绍

Gym是一个研究和开发强化学习相关算法的仿真平台,无需智能体先验知识,由以下两部分组成

  • Gym开源库:测试问题的集合。当你测试强化学习的时候,测试问题就是环境,比如机器人玩游戏,环境的集合就是游戏的画面。这些环境有一个公共的接口,允许用户设计通用的算法。
  • OpenAI Gym服务:提供一个站点和API(比如经典控制问题:CartPole-v0),允许用户对他们的测试结果进行比较。

2. Gym安装

我们需要在Python 3.5+的环境中简单得使用pip安装gym

pip install gym

如果需要从源码安装gym,那么可以:

git clone https://github.com/openai/gym
cd gym
pip install -e .

可以运行pip install -e .[all]执行包含所有环境的完整安装。 这需要安装一些依赖包,包括cmake和最新的pip版本。

3. Gym使用demo

简单来说OpenAI Gym提供了许多问题和环境(或游戏)的接口,而用户无需过多了解游戏的内部实现,通过简单地调用就可以用来测试和仿真。接下来以经典控制问题CartPole-v0为例,简单了解一下Gym的特点

# 导入gym环境
import gym
# 声明所使用的环境
env = gym.make('CartPole-v0')
# 环境初始化
env.reset()# 对环境进行迭代执行1000次
for _ in range(1000):env.render()observation, reward, done, info = env.step(env.action_space.sample()) # 采取随机动作if done:env.reset()
env.close()

运行效果如下


 

以上代码中可以看出,gym的核心接口是Env。作为统一的环境接口,Env包含下面几个核心方法:

  • reset(self):重置环境的状态,返回观察。
  • step(self, action):推进一个时间步长,返回observation, reward, done, info。
  • render(self, mode=‘human’, close=False):重绘环境的一帧。默认模式一般比较友好,如弹出一个窗口。
  • close(self):关闭环境,并清除内存

以上代码首先导入gym库,然后创建CartPole-v0环境,并重置环境状态。在for循环中进行1000个时间步长控制,env.render()刷新每个时间步长环境画面,对当前环境状态采取一个随机动作(0或1),在环境返回done为True时,重置环境,最后循环结束后关闭仿真环境。

4、观测(Observations)

在上面代码中使用了env.step()函数来对每一步进行仿真,在Gym中,env.step()会返回 4 个参数:

  • 观测 Observation (Object):当前step执行后,环境的观测(类型为对象)。例如,从相机获取的像素点,机器人各个关节的角度或棋盘游戏当前的状态等;
  • 奖励 Reward (Float): 执行上一步动作(action)后,智能体( agent)获得的奖励(浮点类型),不同的环境中奖励值变化范围也不相同,但是强化学习的目标就是使得总奖励值最大;
  • 完成 Done (Boolen): 表示是否需要将环境重置 env.reset。大多数情况下,当 DoneTrue 时,就表明当前回合(episode)或者试验(tial)结束。例如当机器人摔倒或者掉出台面,就应当终止当前回合进行重置(reset);
  • 信息 Info (Dict): 针对调试过程的诊断信息。在标准的智体仿真评估当中不会使用到这个info,具体用到的时候再说。

Gym 仿真中,每一次回合开始,需要先执行 reset() 函数,返回初始观测信息,然后根据标志位 done 的状态,来决定是否进行下一次回合。所以更恰当的方法是遵守done的标志。

import gym
env = gym.make('CartPole-v0')
for i_episode in range(20):observation = env.reset()for t in range(100):env.render()print(observation)action = env.action_space.sample()observation, reward, done, info = env.step(action)if done:print("Episode finished after {} timesteps".format(t+1))break
env.close()

代码运行结果的片段如下所示:

[ 0.04025062 -0.04312649  0.00186348  0.02288173]
[ 0.03938809 -0.23827512  0.00232111  0.31615203]
[ 0.03462259 -0.43343005  0.00864416  0.60956605]
[ 0.02595398 -0.23843     0.02083548  0.31961824]
[ 0.02118538 -0.43384239  0.02722784  0.6187984 ]
[ 0.01250854 -0.23911113  0.03960381  0.33481376]
[ 0.00772631 -0.43477369  0.04630008  0.63971794]
[-0.00096916 -0.63050954  0.05909444  0.94661444]
[-0.01357935 -0.43623107  0.07802673  0.67306909]
[-0.02230397 -0.24227538  0.09148811  0.40593731]
[-0.02714948 -0.43856752  0.09960686  0.72600415]
[-0.03592083 -0.24495361  0.11412694  0.46625881]
[-0.0408199  -0.05161354  0.12345212  0.21161588]
[-0.04185217  0.14154693  0.12768444 -0.03971694]
[-0.03902123 -0.05515279  0.1268901   0.29036807]
[-0.04012429 -0.25183418  0.13269746  0.6202239 ]
[-0.04516097 -0.05879065  0.14510194  0.37210296]
[-0.04633679  0.13400401  0.152544    0.12846047]
[-0.04365671 -0.06293669  0.15511321  0.46511532]
[-0.04491544 -0.25987115  0.16441551  0.80239106]
[-0.05011286 -0.45681992  0.18046333  1.14195086]
[-0.05924926 -0.65378152  0.20330235  1.48536419]
Episode finished after 22 timesteps

上面的结果可以看到这个迭代中,输出的观测为一个列表。这是CartPole环境特有的状态,其规则是。

其中:

  • 表示小车在轨道上的位置(position of the cart on the track
  • 表示杆子与竖直方向的夹角(angle of the pole with the vertical
  • 表示小车速度(cart velocity
  • 表示角度变化率(rate of change of the angle

5、空间(Spaces

每次执行的动作(action)都是从环境动作空间中随机进行选取的,但是这些动作 (action) 是什么?在 Gym 的仿真环境中,有运动空间 action_space 和观测空间observation_space 两个指标,程序中被定义为 Space类型,用于描述有效的运动和观测的格式和范围。下面是一个代码示例:

import gym
env = gym.make('CartPole-v0')
print(env.action_space)
print(env.observation_space)

Discrete(2)
Box(-3.4028234663852886e+38, 3.4028234663852886e+38, (4,), float32)

从程序运行结果可以看出:

  • action_space 是一个离散Discrete类型,从discrete.py源码可知,范围是一个{0,1,…,n-1} 长度为 n 的非负整数集合,在CartPole-v0例子中,动作空间表示为{0,1}。
  • observation_space 是一个Box类型,从box.py源码可知,表示一个 n 维的盒子,所以在上一节打印出来的observation是一个长度为 4 的数组。数组中的每个元素都具有上下界。

6. 奖励(reward)

gymCart Pole环境(env)里面,左移或者右移小车的action之后,env会返回一个+1的reward。其中CartPole-v0中到达200个reward之后,游戏也会结束,而CartPole-v1中则为500。最大奖励(reward)阈值可通过前面介绍的注册表进行修改。

7. 注册表

Gym是一个包含各种各样强化学习仿真环境的大集合,并且封装成通用的接口暴露给用户,查看所有环境的代码如下

from gym import envs
print(envs.registry.all())

8.注册模拟器

Gym支持将用户制作的环境写入到注册表中,需要执行 gym.make()和在启动时注册register。如果要注册自己的环境,那么假设你在以下结构中定义了自己的环境:

myenv/__init__.pymyenv.py

i. myenv.py包含适用于我们自己的环境的类。 在init.py中,输入以下代码:

from gym.envs.registration import register
register(id='MyEnv-v0',entry_point='myenv.myenv:MyEnv', # 第一个myenv是文件夹名字,第二个myenv是文件名字,MyEnv是文件内类的名字
)

ii. 要使用我们自己的环境:

import gym
import myenv # 一定记得导入自己的环境,这是很容易忽略的一点
env = gym.make('MyEnv-v0')

iii. 在PYTHONPATH中安装myenv目录或从父目录启动python。

目录结构:
myenv/__init__.pymy_hotter_colder.py
-------------------
__init__.py 文件:
-------------------
from gym.envs.registration import register
register(id='MyHotterColder-v0',entry_point='myenv.my_hotter_colder:MyHotterColder',
)
-------------------
my_hotter_colder.py文件:
-------------------
import gym
from gym import spaces
from gym.utils import seeding
import numpy as npclass MyHotterColder(gym.Env):"""Hotter ColderThe goal of hotter colder is to guess closer to a randomly selected numberAfter each step the agent receives an observation of:0 - No guess yet submitted (only after reset)1 - Guess is lower than the target2 - Guess is equal to the target3 - Guess is higher than the targetThe rewards is calculated as:(min(action, self.number) + self.range) / (max(action, self.number) + self.range)Ideally an agent will be able to recognise the 'scent' of a higher reward andincrease the rate in which is guesses in that direction until the reward reachesits maximum"""def __init__(self):self.range = 1000  # +/- value the randomly select number can be betweenself.bounds = 2000  # Action space boundsself.action_space = spaces.Box(low=np.array([-self.bounds]), high=np.array([self.bounds]))self.observation_space = spaces.Discrete(4)self.number = 0self.guess_count = 0self.guess_max = 200self.observation = 0self.seed()self.reset()def seed(self, seed=None):self.np_random, seed = seeding.np_random(seed)return [seed]def step(self, action):assert self.action_space.contains(action)if action < self.number:self.observation = 1elif action == self.number:self.observation = 2elif action > self.number:self.observation = 3reward = ((min(action, self.number) + self.bounds) / (max(action, self.number) + self.bounds)) ** 2self.guess_count += 1done = self.guess_count >= self.guess_maxreturn self.observation, reward[0], done, {"number": self.number, "guesses": self.guess_count}def reset(self):self.number = self.np_random.uniform(-self.range, self.range)self.guess_count = 0self.observation = 0return self.observation

9. OpenAI Gym评估平台

用户可以记录和上传算法在环境中的表现或者上传自己模型的Gist,生成评估报告,还能录制模型玩游戏的小视频。在每个环境下都有一个排行榜,用来比较大家的模型表现。

上传于录制方法如下所示

import gym
from gym import wrappers
env = gym.make('CartPole-v0')
env = wrappers.Monitor(env, '/tmp/cartpole-experiment-1')
for i_episode in range(20):observation = env.reset()for t in range(100):env.render()print(observation)action = env.action_space.sample()observation, reward, done, info = env.step(action)if done:print("Episode finished after {} timesteps".format(t+1))break

使用Monitor Wrapper包装自己的环境,在自己定义的路径下将记录自己模型的性能。支持将一个环境下的不同模型性能写在同一个路径下。

在官网注册账号后,可以在个人页面上看到自己的API_Key,接下来可以将结果上传至OpenAI Gym:

import gym
gym.upload('/tmp/cartpole-experiment-1', api_key='YOUR_API_KEY')

然后得到如下结果:

打开链接会有当前模型在环境下的评估报告,并且还录制了小视频:

每次上传结果,OpenAI Gym都会对其进行评估。

创建一个Github Gist将结果上传,或者直接在upload时传入参数:

import gym
gym.upload('/tmp/cartpole-experiment-1', writeup='https://gist.github.com/gdb/b6365e79be6052e7531e7ba6ea8caf23', api_key='YOUR_API_KEY')

评估将自动计算得分,并生成一个漂亮的页面。

在大多数环境中,我们的目标是尽量减少达到阈值级别的性能所需的步骤数。不同的环境都有不同的阈值,在某些环境下,尚不清楚该阈值是什么,此时目标是使最终的表现最大化。在cartpole这个环境中,阈值就是立杆能够直立的帧数。

任何程序错误,以及技术疑问或需要解答的,请添加

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

九、PyQt5 QLineEdit输入的子网字符串校验QRegExp

自己编写的用于对lineEdit编辑框输入的子网,例如:192.168.60.1/24字符串校验是否合规。 # 限制lineEdit编辑框只能输入./字符和数字reg = QRegExp([0-9./]+$)validator = QRegExpValidator(self)validator.setRegExp(reg)self.lineEditSubNet.setValidator(validator)

为什么阿里巴巴不建议在for循环中使用+进行字符串拼接

本文&#xff0c;也是对于Java中字符串相关知识的一个补充&#xff0c;主要来介绍一下字符串拼接相关的知识。本文基于jdk1.8.0_181。字符串拼接字符串拼接是我们在Java代码中比较经常要做的事情&#xff0c;就是把多个字符串拼接到一起。我们都知道&#xff0c;String是Java中…

Google强化学习框架SEED RL环境部署

如上述博客有任何错误或者疑问&#xff0c;请加VX&#xff1a;1755337994&#xff0c;及时告知&#xff01;万分感激&#xff01; 本框架是Google发布于ICLR2020顶会上&#xff0c;这两天发布于Google Blog上 **论文Arxiv&#xff1a;**https://arxiv.org/abs/1910.06591 ||…

PLSQL连接oracel数据库_用户无法登陆_oci.dll_配置问题

为什么80%的码农都做不了架构师&#xff1f;>>> 由于工作需要换了台新电脑&#xff0c;在抚摸新笔记本满怀新鲜感和喜悦心情之余&#xff08;其实纯屌丝味尽显无余&#xff0c;就基本和双手捧托一颗高大上的茶叶蛋般内心激动且泪眼汪汪&#xff09;&#xff0c;重新…

CentOS7搭建部署Ambari 2.6.2.0最新版(HDP-UTILS、HDP-GPL)大数据平台

如上述博客有任何错误或者疑问&#xff0c;请加VX&#xff1a;1755337994&#xff0c;及时告知&#xff01;万分感激&#xff01; 注&#xff1a;本文基于root用户操作 一、安装环境准备 操作系统 centos7.5 hdc-data1&#xff1a;192.168.163.51 hdc-data2&#xff1a;192.16…

阿里面试题BIO和NIO数量问题附答案和代码

一、问题 BIO 和 NIO 作为 Server 端&#xff0c;当建立了 10 个连接时&#xff0c;分别产生多少个线程&#xff1f; 答案&#xff1a; 因为传统的 IO 也就是 BIO 是同步线程堵塞的&#xff0c;所以每个连接都要分配一个专用线程来处理请求&#xff0c;这样 10 个连接就会创建…

CentOS7搭建离线部署Cloudera CDH 6.2.0大数据平台

如上述博客有任何错误或者疑问&#xff0c;请加VX&#xff1a;1755337994&#xff0c;及时告知&#xff01;万分感激&#xff01; 1.概述 CDH&#xff0c;全称Clouderas Distribution, including Apache Hadoop。是Hadoop众多分支中对应中的一种&#xff0c;由Cloudera维护&a…

负载均衡实现的几种方式

负载均衡&#xff0c;英文名Load Balance&#xff0c;作用是将操作分摊到多个执行单元上执行。随着如今网络流量的不断增大&#xff0c;服务的负载均衡是必须的&#xff0c;这里就来讲一讲负载均衡的结构。 说到负载均衡&#xff0c;同学最容易想到的可能就是nginx了&…

CheckBox as Image use button

为什么80%的码农都做不了架构师&#xff1f;>>> <CheckBox android:id"id/notificationPhoneIcon" android:layout_width"wrap_content" android:layout_height"wrap_content" android:layout_centerVertical"true" an…

1-1.Win10系统利用Pycharm社区版安装Django搭建一个简单Python Web项目的步骤之一

首先&#xff0c;安装python3.8和pycharm参考其他教程。 一、安装django 使用下面命令默认安装最新版的django pip install django也可以从django官网查看安装一个LTS长期稳定支持版本&#xff0c;从下图看到3.2是LTS版本&#xff0c;能够长期支持2021年&#xff5e;2024年&…

python装饰器函数传参

python装饰器函数传参 装饰器 装饰器是一个返回函数的高阶函数。 装饰器常见用法&#xff1a; 打印日志 def logger(func):def wrapper(*args, **kw):print do {}.format(func.__name__)func(*args, **kw)print finishreturn wrapperlogger def add(x,y):print {} {} {}.…

Tomcat工作原理及简单模拟实现

Tomcat应该都不陌生&#xff0c;我们经常会把写好的代码打包放在Tomcat里并启动&#xff0c;然后在浏览器里就能愉快的调用我们写的代码来实现相应的功能了&#xff0c;那么Tomcat是如何工作的&#xff1f;一、Tomcat工作原理我们启动Tomcat时双击的startup.bat文件的主要作用是…

苹果怎么调字体大小?详细教程在这,赶快get起来!

在我们使用苹果手机时&#xff0c;可能会遇到需要调整字体大小的情况。合适的字体大小能够提高阅读体验和舒适度&#xff0c;使得手机使用更加便捷。然而&#xff0c;还有很多用户并不知道苹果怎么调字体大小。别着急&#xff01;本文将为您详细介绍操作方法&#xff0c;帮助您…

PyQt5树形结构控件QTreeWidget操作

QTreeWidget 类根据预设的模型提供树形显示控件。 QTreeWidget 使用类似于 QListView 类的方式提供一种典型的基于 item 的树形交互方法类&#xff0c;该类基于QT的“模型/视图”结构&#xff0c;提供了默认的模型来支撑 item 的显示&#xff0c;这些 item 类为 QTreeWidgetIt…

Python3之logging输出写入日志

Python3之logging模块浅析 目录 Python3之logging模块浅析 简单用法日志与控制台同时输出 一个同时输出到屏幕、文件的完成例子日志文件截取日志重复打印问题解决 问题分析解决方案 1.使用不同的日志对象2.及时清理&#xff08;logger.handlers.clear&#xff09;3.使用前先判…

HashMap线程安全问题

HashMap是线程不安全的&#xff0c;在多线程环境下对某个对象中HashMap类型的实例变量进行操作时&#xff0c;可能会产生各种不符合预期的问题。本文详细说明一下HashMap存在的几个线程安全问题。注&#xff1a;以下基于JDK1.8HashMap原理请走传送门通过简单例子来探索HashMap原…

四、PyCharm PyQt5创建主窗口详细教程

1.打开PyCharm,新建工程MyMainTest 2.按照Tools-External Tools-QtDesigner,打开QT设计界面,保存窗体文件。

java8 lambda表达式实现自定义用户组件,Don't Repeat Yourself

2019独角兽企业重金招聘Python工程师标准>>> 一、用户组件的功能 使用java8 lambda表达式实现实现世界的一个例子&#xff1a;用户组件。此用户组件有以下几个操作&#xff1a;获取用户列表&#xff0c;获取单个用户&#xff0c;增加用户&#xff0c;删除用户&am…

如何在CDH5上部署Dolphin Scheduler 1.3.1

本文记录了在CDH5.16.2集群上集成Dolphin Scheduler 1.3.1的详细流程&#xff0c;特别注意一下MySQL数据库的连接串&#xff01; 1 文档编写目的 详细记录CDH5上Dolphin Scheduler 1.3.1的部署流程分布式部署Dolphin Scheduler 2 部署环境和依赖组件 为了适配CDH5上的Hive…

Kafka面试题全套整理 | 划重点要考!

做积极的人&#xff0c;而不是积极废人&#xff01;有很多人问过我要过Kafka相关的面试题&#xff0c;我一直懒得整理&#xff0c;这几天花了点时间&#xff0c;结合之前面试被问过的、别人咨询过的、我会问别人的进行了相关的整理&#xff0c;也就几十题&#xff0c;大家花个几…