当前位置: 首页 > 编程日记 > 正文

安装gym库_强化学习Gym库学习实践(一)

26b554d53e02fc59db2338481039c24b.png

最近看了一篇研究方向相关的文章,介绍了一种DQN的应用,感觉还挺新鲜的。想着把这篇文章复现出来,就开始学习强化学习的相关知识,作为一名小白,这一路走的可是真的十分艰难(我太菜了啊!)

看了莫烦Python的教程介绍,了解到有一个用于构造强化学习环境的库叫做gym,我就跑去学习了,还处于慢慢摸索中吧,一点一点来,把学习过程记录在这里。

这篇文章主要会记录以下两点:

  • Gym库的官网,在我电脑上是gym支持windows10了,安装很简单,就是pip3 install gym/gym[all],后者gym[all]我也是后来知道的,就是更加完整的gym库,但是前者就够用了
  • Gym库中几个最重要的基类的源代码的介绍

一、Gym库的"Hello World"

现在开始介绍Gym库,它的官网上的文档说明在这:

https://gym.openai.com/docs/​gym.openai.com

a38f4f40ef039a6b46d8f469d11c3bbd.png

这段代码被称为gym库的Hello World,但是说实话,作为小白的我看到这些是懵逼的。尤其是这句:

env=gym.make('CartPole-v0')

这行代码是生成了一个已经在gym中注册的环境,这个环境名叫做CartPole,这个环境的代码在这里:

https://github.com/openai/gym/blob/master/gym/envs/classic_control/cartpole.py​github.com

在知乎上有一位前辈写了一个格子世界环境,github上有源代码,对这个CartPole的源代码进行了注释,他的文章链接和github代码链接在这里,感谢他:

Orion Nebula:强化学习快速上手:编写自定义通用gym环境类+主流开源强化学习框架调用​zhuanlan.zhihu.com
cacd9c83e06771d8fa1f2108b0436099.png
https://github.com/gxnk/reinforcement-learning-code/blob/master/%E7%AC%AC%E4%B8%80%E8%AE%B2%20%20gym%20%E5%AD%A6%E4%B9%A0%E5%8F%8A%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91/cartpole_notes.py​github.com

这个环境是gym库中写好的一个Env类,就是环境的基类。此处插播小白必备,如果你跟我一样不熟悉Python的类与继承的语法,这边请:

Python 面向对象 | 菜鸟教程​www.runoob.com
beb185445cdb5c6564e7a9ab41c9685c.png

我们都知道强化学习中最基本的模型是马尔可夫过程,其中最核心的过程就是智能体与环境的交互,所以在实现强化学习算法时的第一步就是构造环境,这也是gym库的最大优势:

我们只需要继承基类,重写其中的方法就可以。

二、环境基类Env源代码介绍

Env基类的代码在这里:

https://github.com/openai/gym/blob/0cd9266d986d470ed9c0dd87a41cd680b65cfe1c/gym/core.py​github.com

现在我就把源码读一遍,然后把重要的部分放到这里来:

1c49031dc7641fcd88de456698e842aa.png

它介绍说这是主要的一个类,它可以覆盖拥有任意动态特性的环境,这些环境可以是完全观测的(MDP),也可以是部分观测的。(POMDP)

28edd4a8a46ff77ca92d924475f5e6fe.png
主要的5个方法,也是我们构建环境时要重写的几个方法

321a7f19d88052605edb415bb6c16f88.png

环境基类中的几个可以设置的属性,主要是前两个吧,动作空间action_space与状态空间observation_space,这个还需要了解另一个重要的基类Spaces的源代码,后面会做介绍。第三个是reward_range,默认是[负无穷,正无穷],需要的话再修改。

c3a7cf6d8f5ec66114e754d69e2a9605.png

前者是在需要可视化的时候用到的元组数据,需要选择render中的模式,后面看了render的源代码我会再补充过来。然后spec我不知道是什么。

第二个就是在所有的子类中都要去设定的,default值的None

几个函数的说明

因为我的使用过程中不太会涉及到可视化的内容,所以我这里只讲Env类中最直接相关的三个方法:Reset() Step() 与 _init_()

Reset() 是初始化函数,在每一个训练episode之后都要对环境进行初始化,功能很简单,就是回到初始状态

8d510cfad37a4bd4fc1cc66b8d969c71.png
reset方法的说明

Step() 是用来描述智能体与环境的交互过程的函数,也是我们在编写自己的环境的时候重点要重写的。用大白话讲就是我们要在这里定义我们的环境里的游戏规则

e451a723e691474d421927f4fe7ca7b5.png
Step方法的说明

此方法的输入是智能体可以产生的动作,输出是四个,分别是:

Observation:智能体观测到的当前环境的状态

Reward: 由上一个动作产生的奖励值

done:一个指示位,表示这一训练周期是否结束,True or False

info:包含一些其余信息,结构是字典

最后一行的raise是我新学到的知识,可以看这篇博客,目的是防止step方法在继承的子类中未被声明却被调用。

https://blog.csdn.net/grey_csdn/article/details/77074707​blog.csdn.net

_Init_() 环境的初始化函数

我在源代码里第一次看到初始化函数是在这里

55bb8153789486a097328cd256119c03.png
Wrapper子类的说明

原谅我的水平不够,我只能理解到Wrapper的作用是一种包装,可以在不改动源代码的情况下重写某些方法来改变环境的属性,也就是改变强化学习的游戏规则。

简单的理解就是要在初始化函数中声明动作空间,状态空间,奖励值范围,元组数据(如果需要)。

Subclass GoalEnv()

Gym库还提供了一种环境子类叫做GoalEnv

f6fbe01aaa8bfc4bbc3a7c78689d6728.png

在这个子类中 ,会有一个desired_goal的变量,大概理解就是一种目的性很强的强化学习吧,有需要的各位可以去看看。

三、空间基类Space源代码介绍

另外一个很重要的基类就是Space类

8c2bc25b42177f94a18a8652b445ce1b.png

在这里在介绍两个常用的子类 : Discrete类 与 Box类

427f39c85a1aedeb91ac67fc70d1257c.png

简单理解的话Discrete类是一个一维离散空间

989942bfa35dfc84ab5628f4994f1fed.png

Box类是一个多维空间,不同维度的上下界可以是不同的,如下图所示:

955a1c0da8329739d11847ede36711ba.png

关于空间的这部分之后后面还要补充,把几个基本的方法的功能介绍一下,今天累了就先写到这里。两个基本方法有:

Sample()

Contains()

在编写自己的环境的时候只要 from gym import spaces就可以使用Box 和 Discrete啦,因为他们都在spaces这个文件夹下:

openai/gym​github.com
569eb80f203a8f1ee2f7982ecfdad86a.png

9c85e8ca987b7c4a868d9b6a92650b64.png

下一篇文章里我会先学习gym库中的官方环境和前辈们写的环境,然后尝试编写自己的一个无线网络资源调度问题的强化学习环境。

四、感谢各位前辈

感谢各位知乎的前辈们的文章对我的帮助,他们的文章是我学习路上不可或缺的助力(都是大佬,太强了,膜拜!)

强化学习知识大讲堂

天津包子馅儿:强化学习实战 第一讲 gym学习及二次开发​zhuanlan.zhihu.com
叶强:强化学习实践二 理解gym的建模思想​zhuanlan.zhihu.com

沫凡大神的系列教程

https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/​morvanzhou.github.io

相关文章:

VS2005编译QT4.8.2

为什么要编译? 因为安装安装版的QT4.8.2,vs2005编译报错。 1.下载QT4.8.2,qt-everywhere-opensource-src-4.8.2.zip,下载vs-AddIn1.1.11. 2.解压QT源码包到C盘, 这里路径为 c:\qt\4.8.2\。 3.配置系统环境变量&#xf…

Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads(翻译)

大龙的博客C博客 | 首页 | 发新随笔 | 发新文章 | 联系 | 聚合 | 管理 Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads(翻译) Don’t Use the Win32 API PostThreadMessage() to Post Messages to UI Threads不要用Win32 API PostThreadMessage…

Matlab编程与数据类型 -- 文本M文件

本微信图文详细介绍了Matlab中的文本M文件。

安卓x86_Android:虚拟机体验基于安卓10的BlissOS V12.2 Android X86版

我是科技鲁工,今天带来基于Android10的x86版本的Bliss os的安装体验。喜欢的朋友可以关注支持一下。Bliss OS是一个基于Android x86项目的开源操作系统,能让您在PC电脑或平板电脑设备上运行最新的Android 10操作系统。该系统基于AOSP(Android开放源代码项…

《C#精彩实例教程》小组阅读10 -- C#属性与方法

本微信图文详细介绍了C#的属性与方法。

JavaScript中几个重要的知识点(1) ---- 面向对象

JavaScript中几个最重要的大知识点 面向对象DOM事件异步交互ajax面向对象 在JS中可以把任意的引用和变量都看成是一个对象。面向对象的主要三个表现形式: 封装继承多态1. 封装 1.1 单例模式 var obj{name: "sam",age: 12,method: function(){var objNamet…

scrollLeft,scrollWidth,clientWidth,offsetWidth到底指的哪到哪的距离

轉自:http://www.cnblogs.com/mrhgw/archive/2006/11/08/553737.html 补充: scrollHeight: 获取对象的滚动高度。 scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离 scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的…

连接服务器_命令行连接FTP服务器

Windows下: 打开命令行窗口,输入 ftp,进入ftp命令模式: 输入 open ip地址 端口,进入ftp服务器,如open 172.16.3.77 2121。如下图: 输入Windows下的用户名,然后输入密码(注意:密码是不显示的,输入用户名密码不能时间太长,否则连接断掉)。 查看ftp服务器中的文件,输…

mapreduce作业reduce被大量kill掉

之前有一段时间。我们的hadoop2.4集群压力非常大。导致提交的job出现大量的reduce被kill掉。同样的job执行时间比在hadoop0.20.203上面长了非常多。这个问题事实上是reduce 任务启动时机的问题,因为yarn中没有map slot和reduce slot的概念,且ResourceMan…

Matlab编程与数据类型 -- M文件的编辑和存储

本微信图文详细介绍了Matlab中M文件的编辑和存储。

一个老工程师对理工科学生的忠告

[1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行…

64 安装_解决“不能安装 64 位Office,因已安装 32 位 Office 产品”问题

换了个电脑装64位的Office 2010(Office_64),双击setup刚准备装,就收到以下错误提示:“不能安装 64 位版本的 Office 2010,因为您当前已经安装 32 位 Office 产品。64 位安装不支持 32 位产品安装:如果要安装 64 位 Off…

Python---内置函数

一、数值类操作 abs(x)求绝对值 1、参数可以是整型,也可以是复数 2、若参数是复数,则返回复数的模complex([real[, imag]])创建一个复数divmod(a, b)分别取商和余数 注意:整型、浮点型都可以float([x])将一个字符串或数转换为浮点数。如果无参…

《C#精彩实例教程》小组阅读11 -- C#结构与类

本微信图文详细介绍了C#的结构与类。

软件测试工程师职业介绍和规划

如存在没有任何错误的程序,那么世界也会不复存在。” 因错误而存在,因修正错误而存在,这就是软件测试工程师的存在之道。虽然测试不是解决错误的根本举措,但却是必须的手段。 软件测试工程师(Software Testing Engine…

python selenium脚本_怎样开始写第一个基于python的selenium脚本

1、下载并安装python(http://www.python.org/geti/)。2、安装selenium(http://pypi.python.org/pypi/selenium)下载并解压缩selenium-2.32.0.tar.gz. 把selenium-2.32.0\py\下的selenium整个文件夹放入Python33\Lib\site-packages目录下。3 下载Eclipse后安装pydev插件4 打…

《C#精彩实例教程》小组阅读12 -- C#面向对象技术高级应用

本微信图文详细介绍了C#面向对象技术高级应用。

linux php --ini

$ php --ini

文档类型定义DTD

XML系列:文档类型定义DTD (转) 一,什么是DTD?1,XMl是一种元标记语言,是描叙语言的语言,定义标记的语法结构,从而生成新标记。而DTD则是为新标记建立文档并进行规范说明。也就是说XML定义标记的语…

gis中的擦除_擦除—帮助 | ArcGIS for Desktop

输出 coverage 已不存在。如果注记的左下起点位于擦除多边形内部,则擦除该注记。新结点的属性将设置为零。移除与擦除 coverage 多边形重叠的输入 coverage 多边形。擦除 coverage 必须具有面拓扑。输出 coverage 中所有要素的 User-ID 与输入 coverage 中所有要素的…

C# 3.0/3.5语法新特性示例汇总[转]

//作者:杨卫国//时间:2008年2月21日//说明:C#语法新特型示例usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespaceC3{ class Program { //新特性1:简单属性,无需另外多写一个私有字段,比较适合于…

Matlab编程与数据类型 -- 循环控制语句之二:while/end

本微信图文详细介绍了Matlab中while/end循环控制语句。

Centos6,7默认启动模式的更改

有时候我们想以为图形页面启动,启动后直接到图形页面,但是有时候也想启动后直接进入文本页面,我们只需要修改init即可; Centos6启动模式配置文件路径:/etc/inittab Centos7启动模式配置文件路径:/usr/lib/s…

python中计数_Python中的统计计数

关闭。此问题不符合堆栈溢出准则。它当前不接受答案。想改善这个问题吗?更新问题,使其成为Stack Overflow的主题。6年前关闭。我有一组五个字母A..E。我想将它们分成3个一组,不重复字母,但是对于从哪里开始我一无所知。解决方案假…

angular2 学习笔记 ( Rxjs, Promise, Async/Await 的区别 )

Promise 是 ES 6 Async/Await 是 ES 7 Rxjs 是一个 js 库 在使用 angular 时,你会经常看见这 3 个东西. 它们都和异步编程有关,有些情况下你会觉得用它们其中任何一个效果都一样. 但又觉得好像哪里不太对.... 这篇就来说说,我在开发时的应用方…

【转】Flex Application 初始化顺序

转自&#xff1a;http://www.jexchen.com 大家都知道&#xff0c;我们在编写Flex应用程序时&#xff0c;通常是以<mx:Application>标签作为开头&#xff0c;实际上&#xff0c;Flex应用程序在启动运行的时候并不是直接从Application开始运行&#xff0c;在这之前还有一部…

Matlab编程与数据类型 -- 分支条件选择语句if/end

本微信图文详细介绍了Matlab中if/end分支条件选择语句。

插槽 查看硬盘状态_摄影路上的“全能”伴侣 | LaCie DJI Copilot 移动硬盘

照片的安全是摄影人不得不考虑的问题&#xff0c;尤其是长时间外出拍摄时&#xff0c;一旦出现意外&#xff0c;比如存储卡损坏或丢失&#xff0c;那么千辛万苦拍摄的照片将付之东流&#xff0c;造成无法挽回的损失。虽然意外发生的概率并不高&#xff0c;但是为了保险起见&…

【转载】C语言变量详解

原链接&#xff1a;http://gaga.yo2.cn/articles/detailed-c-language-variables-review.html 刚做题时发现全局变量会自动初始化&#xff0c;如int型则自动初始化为0&#xff0c;double则初始化为0.000000....。而局部变量如果没有初始化的话&#xff0c;初值为一随机数。于是…

Matlab编程与数据类型 -- 多分支条件选择语句if/elseif/…/else/end

本微信图文详细介绍了Matlab中if/elseif/…/else/end多分支条件选择语句。