在一些OpenAI健身房环境中,有一个" ram"版。例如:Breakout-v0
和Breakout-ram-v0
。
使用Breakout-ram-v0
,每个观察是一个长度为128的数组。
问题:如何将Breakout-v0
(160 x 210图像)的观察转换为Breakout-ram-v0
(这是一个数组)的观察形式长度128)?
我的想法是在Breakout-ram-v0
上训练模型,并使用Breakout-v0
环境显示训练模型。
答案 0 :(得分:8)
有几种方法可以理解ram选项。
让我们说你想学习乒乓球。如果你从像素训练,你可能会使用几层的卷积网。有趣的是,convnet的最终输出是一维特征。这些传递到完全连接的层,并可能输出正确的“动作”。基于图像中识别出的特征。或者您可以使用加固层处理一维特征数组。
现在让我们说你发现pong非常简单,并且可能用16x16图像而不是160x160表示。直接下采样并没有给你足够的细节,所以你使用openCV来提取球和桨的位置,并创建你的迷你版16x16乒乓。具有漂亮,清晰的像素。所需的计算比你的深网更能代表游戏的本质,而你的新网站很好而且很小。然后你意识到你甚至不再需要你的预定了。您可以为每个16x16像素执行完全连接的图层。
所以,想想你拥有的东西。现在,您有两种不同的方式来获得游戏的简单表示,以便训练完全连接的图层。 (或RL算法)
所以模式是你找到一种简单的方式代表'游戏状态,然后将其传递给完全连接的图层。
输入选项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()