如何解释OpenAI健身房中RAM环境的观察结果?

时间:2017-07-20 07:03:56

标签: python openai-gym

在一些OpenAI健身房环境中,有一个" ram"版。例如:Breakout-v0Breakout-ram-v0

使用Breakout-ram-v0,每个观察是一个长度为128的数组。

问题:如何将Breakout-v0(160 x 210图像)的观察转换为Breakout-ram-v0(这是一个数组)的观察形式长度128)?

我的想法是在Breakout-ram-v0上训练模型,并使用Breakout-v0环境显示训练模型。

3 个答案:

答案 0 :(得分:8)

有几种方法可以理解ram选项。

让我们说你想学习乒乓球。如果你从像素训练,你可能会使用几层的卷积网。有趣的是,convnet的最终输出是一维特征。这些传递到完全连接的层,并可能输出正确的“动作”。基于图像中识别出的特征。或者您可以使用加固层处理一维特征数组。

现在让我们说你发现pong非常简单,并且可能用16x16图像而不是160x160表示。直接下采样并没有给你足够的细节,所以你使用openCV来提取球和桨的位置,并创建你的迷你版16x16乒乓。具有漂亮,清晰的像素。所需的计算比你的深网更能代表游戏的本质,而你的新网站很好而且很小。然后你意识到你甚至不再需要你的预定了。您可以为每个16x16像素执行完全连接的图层。

所以,想想你拥有的东西。现在,您有两种不同的方式来获得游戏的简单表示,以便训练完全连接的图层。 (或RL算法)

  1. 您的深度信号通过多个层并输出一维数组,比如说最后一层有256个特征。你将它传递给完全连接的层。
  2. 你的手动特征提取用OpenCV提取blob(pattles / ball),制作一个16x16 pong。通过将其传递给完全连接的图层,它实际上只是一组16x16 = 256'提取的功能'。
  3. 所以模式是你找到一种简单的方式代表'游戏状态,然后将其传递给完全连接的图层。

    输入选项3.游戏的RAM可能只是一个256字节的数组。但是你知道这包含了'#state;'游戏,所以它就像你的16x16版本的乒乓球。它最有可能是一个更好的'代表比你的16x16,因为它可能有关于球的方向的信息等。

    所以现在你有3种不同的方法来简化游戏的状态,以便训练完全连接的层或你的增强算法。

    因此,OpenAI通过为您提供RAM所做的工作正在帮助您避免学习“表示”的任务。这个游戏,让你直接转向学习一个政策'或根据游戏状态做什么。

    OpenAI可能会提供一种方法来查看' ram版本的视觉输出。如果他们没有,你可以要求他们提供。但那是你得到的最好的。他们不会对代码进行反向工程以“渲染”#39; RAM,他们也不会对代码进行反向工程以生成' ' RAM'基于像素,这实际上是不可能的,因为像素只是游戏状态的一部分。

    他们只是简单地提供ram,如果它很容易为他们所用,那么你可以尝试算法学习做什么,假设有一些东西给他们一个良好的状态表示。

    没有(简单)方法可以按照你的要求进行操作,例如将像素转换为RAM,但很可能有一种方法可以让Atari系统同时为你提供ram和像素,这样你就可以工作了在ram但显示像素。

答案 1 :(得分:1)

您只需使用Atari的ram环境进行培训,然后调用 A B C 0 hello [all, say, hello] [False, False, True] 1 good [good, for, you] [True, False, False] 2 my [so, hard] [False, False] 3 pandas [pandas] [True] 4 wrong [] [0] 对象即可自动保存经过培训的视频。

wrappers

答案 2 :(得分:0)

虽然上述答案在强化学习策略上是正确的,并且无法直接将ram转换为图像,反之亦然,但是要从图像环境中获取ram状态,则可以使用

# this is an image based environment
env = gym.make('Breakout-v0')
env.reset()

# put in the 0 action 
observation_image, reward, done, info = env.step(0)

# get the ram observation with the code below
observation_ram = env.unwrapped._get_ram()