使用OpenAI Gym开发新的
机器学习算法
OpenAI Gym是一个工具包,提供了广泛的模拟环境(Atari游戏,棋盘游戏,2D和3D物理模拟等),因此您可以训练代理,对其进行比较或开发新的机器学习算法(强化学习) 。
OpenAI是一家
人工智能研究公司,部分由Elon Musk资助。其既定目标是促进和发展有益于人类(而不是消灭人类)的友好型AI。
安装OpenAI Gym
在本文中,我将使用OpenAI健身房,这是用于开发和比较强化学习算法的出色工具包。它为学习代理提供了许多与之交互的环境。
在安装工具箱之前,如果您使用virtualenv创建了隔离环境,则首先需要激活它:
$ cd $ ML_PATH#您的ML工作目录(例如$ HOME / ml)
$ source my_env / bin / activate#在Linux或MacOS上
$ .my_envScriptsactivate#在Windows上
接下来,安装OpenAI Gym(如果您不使用虚拟环境,则需要添加–user选项或具有管理员权限):
$ python3 -m pip install -U健身房
根据您的系统,您可能还需要安装Mesa OpenGL Utility(GLU)库(例如,在Ubuntu 18.04上,您需要运行apt install libglu1-mesa)。需要该库来呈现第一个环境。
接下来,打开一个Python shell或Jupyter笔记本或Google Colab,我将首先导入所有必需的库,然后使用make()创建一个环境:
#需要Python≥3.5
导入系统
assert sys.version_info> =(3,5)#需要Scikit-Learn≥0.20
导入sklearn
断言sklearn .__ version__> =“ 0.20”尝试:
#%tensorflow_version仅存在于Colab中。
%tensorflow_version 2.x
!apt更新&& apt安装-y libpq-dev libsdl2-dev swig xorg-dev xvfb
!pip install -q -U tf-agents-nightly pyvirtualdisplay Gym [atari]
IS_COLAB =真
例外:
IS_COLAB = False #需要TensorFlow≥2.0
将tensorflow作为tf导入
从tensorflow import keras如果不是tf.config.list_physical_devices('GPU'),则
断言tf .__ version__ > =“ 2.0” :
print(“未检测到GPU。如果没有GPU,CNN可能会非常慢。”)
如果是IS_COLAB:
print(“转到运行时>更改运行时并选择GPU硬件加速器。”)#常见导入
将numpy导入为np
导入os #以使此笔记本的输出在各个运行过程中保持稳定
np.random.seed(42)
tf.random.set_seed(42)#绘制漂亮的数字
%matplotlib内联
导入matplotlib为mpl
导入matplotlib.pyplot作为plt
mpl.rc('axes',标签大小= 14)
mpl.rc('xtick',标签大小= 12)
mpl.rc('ytick',labelsize = 12)#要获得平滑的动画
导入matplotlib.animation作为动画
mpl.rc('animation',html ='jshtml')导入健身房
让我们列出所有可用的环境:
gym.envs.registry.all()
推车杆是一个非常简单的环境,由可以向左或向右移动的推车以及垂直放置在其顶部的一根杆组成。代理商必须向左或向右移动推车,以保持立杆竖直。
env = gym.make('CartPole-v1')
让我们通过调用reset()方法来初始化环境。这将返回一个观察结果:
种子(42)
obs = env.reset()
观察结果因环境而异。在这种情况下,它是一个由4个浮点组成的一维NumPy数组:它们表示购物车的水平位置,其速度,磁极角度(0 =垂直)和角速度。
肥胖
数组([-0.01258566,-0.00156614,0.04207708,-0.00180545])
可以通过调用环境的render()方法来可视化环境,并且可以选择渲染模式(渲染选项取决于环境)。
env.render()
在此示例中,我们将设置mode =” rgb_array”以NumPy数组的形式获取环境图像:
img = env.render(mode =“ rgb_array”)
img.shape
(400、600、3)
def plot_environment(env,figsize =(5
plt.figure(figsize = figsize)
img = env.render(mode =“ rgb_array”)
plt.imshow(img)
plt.axis(“ off”)
返回img
plot_environment(env)
plt.show()
图片发布
OpenAI体育馆
让我们看看如何与OpenAI Gym环境进行交互。您的代理将需要从“动作空间”(一组可能的动作)中选择一个动作。让我们看看这个环境的动作空间是什么样的:
env.action_space
离散的(2)
Discrete(2)表示可能的操作是整数0和1,它们表示向左加速(0)或向右加速(1)。其他环境可能具有其他离散操作或其他类型的操作(例如,连续操作)。由于极点向右倾斜(obs [2]> 0),所以我们将推车向右加速:
动作= 1#加速对
肥胖,奖励,完成,信息= env.step(动作)
肥胖
数组([-0.01261699,0.19292789,0.04204097,-0.28092127])
请注意,购物车现在正在向右(obs[1] > 0)移动。磁极仍向右(obs[2] > 0)倾斜,但是其角速度现在为负(obs[3] < 0),因此在下一步之后极有可能向左倾斜。
plot_environment(env)
图片发布
OpenAI体育馆
看起来它正在执行我们要执行的操作!该环境还告诉代理在最后一步中获得了多少奖励:
奖励
1.0
游戏结束后,环境返回done=True:
完成
假
最后,info是一本特定于环境的词典,可以提供一些额外的信息,您可能会发现这些信息对于调试或培训很有用。例如,在某些游戏中,它可能指示代理商有多少生命。
信息
{}
从重置环境到完成环境之间的步骤顺序称为“情节”。在情节结束时(即,当step()return时done=True),您应该在继续使用之前重置环境。
如果完成:
obs = env.reset()
使用简单策略算法对OpenAI Gym进行硬编码
让我们硬编码一个简单的策略,当极点向左倾斜时向左加速,而当极点向右倾斜时向右加速。我们将执行此政策,以查看其获得500集以上的平均奖励:
env.seed(42)def basic_policy(obs):
角度= obs [2]
如果角度<0,则返回0,否则总计1 = []
适用范围(500):
Episode_rewards = 0
obs = env.reset()
对于范围(200):
动作= basic_policy(obs)
肥胖,奖励,完成,信息= env.step(动作)
Episode_rewards + =奖励
如果完成:
打破
totals.append(episode_rewards)
希望这段代码是不言自明的。让我们看一下结果:
np.mean(总计),np.std(总计),np.min(总计),np.max(总计)
(41.718,8.858356280936096,24.0,68.0)
好了,正如预期的那样,该策略有点太基础了:它所做的最好的事情是仅使民意调查保持68个步骤。当代理将轮询保持200步时,可以认为此环境已解决。
env.seed(42)frames = [] obs = env.reset()
对于范围(200):
img = env.render(mode =“ rgb_array”)
frame.append(img)
动作= basic_policy(obs)肥胖,奖励,完成,信息= env.step(动作)
如果完成:
打破
现在显示动画:
def update_scene(数字,帧,补丁):
patch.set_data(frames [num])
返回补丁,def plot_animation(frames,repeat = False,interval = 40):
无花果= plt.figure()
补丁= plt.imshow(帧[0])
plt.axis('off')
日本动漫= animation.FuncAnimation(
无花果,update_scene,fargs =(框架,补丁),
frame = len(frames),repeat = repeat,interval = interval)
plt.close()
返回动画
plot_animation(帧)
图片发布
OpenAI体育馆
希望您喜欢OpenAI Gym上的这篇文章。如果您希望我为您进一步探索该主题,请在评论部分中提及它。
题库