openai健身房观察空间表示

时间:2021-06-24 10:08:27

标签: python reinforcement-learning

我有一个关于在健身房环境中表示观察的问题。 我实际上有几个不同尺寸的观察空间,比如说我有一个 24x24 像素的相机,然后是一个 1x25 值的 x 射线机,然后是 10 个温度传感器,所以 1x1 10 次。 所以目前我已经用空格表示了这一点。Dict 用一些空格封装了连续值。Box

class MyEnv(gym.Env):
    def __init__(self, ...):
        spaces = {
                'xray': gym.spaces.Box(low=-np.inf, high=np.inf, shape=(nbcaptors, )),
                'cam1': gym.spaces.Box(low=-np.inf, high=np.inf, shape=(cam1width, cam1height)),
                'cam2': gym.spaces.Box(low=-np.inf, high=np.inf, shape=(cam2width, cam2height)),
                'thermal': gym.spaces.Box(low=-np.inf, high=np.inf, shape=(thermalwidth, thermalheight))
                    }
        self.observation_space = gym.spaces.Dict(spaces)

然后自定义代理可以通过以下方式处理数据: 观察['cam1'] 或观察['xray'] 等...

问题是当我想使用第三方算法时,例如来自 stable-baselines3,他们不支持空格。Dict。 所以我的问题是:如何解决这个问题?我应该用一个 1xn 的盒子来代表我的 obervation_space,例如:

self.observation_space = 
    gym.spaces.Box(low=-np.inf, high=np.inf, 
                   shape=(nbcaptors*cam1width*cam1height*cam2width*cam2height*thermalwidth*thermalheight,)

有意义吗? 即使我看到这种方法存在 3 个问题:

  1. 我的一维空间的低和高可能不够好,因为例如其他空间可能有一些定义的边界。
  2. 在实施中更容易出错
  3. 实际上那些是 2d 矩阵,所以我必须将 4 个矩阵转换为 1d obervation_space 中的一个位置,然后自定义代理必须从 1d 观察中重建 4 个矩阵。最初的快速非基于强化学习的实现已经需要很长时间才能运行,所以我担心这种开销会减慢速度。

此时我只看到两种方法:

  1. 将我所有的 4 个矩阵映射到一个一维数组
  2. 用另一个gym.Env封装我的spaces.Dictgym.Env,它将处理从spaces.Dict到spaces.Box的转换并使用一个代理或另一个取决于我是想使用自定义代理还是第三方一个。

如果能就如何在性能和简单性方面最好地解决这个问题提供一些意见,我们将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

实际上,封装部分似乎正是 OpenAI 的好人所做的:

from gym.wrappers import FlattenObservation
from gym.spaces.utils import unflatten
wrapped_env = FlattenObservation(env)
obs1 = wrapped_env.reset()
unflatted_obs = unflatten(wrapped_env.unwrapped.observation_space, obs1)