openai gym observation space 代表

openai gym observation space representation

我对健身房环境中观察结果的表示有疑问。 我实际上有几个不同尺寸的观察 spaces,比方说我有一个 24x24 像素的相机,然后是一个 1x25 值的 x 射线机,然后是 10 个温度传感器,所以 1x1 10 次。 所以目前我用 spaces.Dict 来表示,用一些 space.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 的算法,它们不支持 spaces.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. 我的 1d space 的低点和高点可能不够好,因为例如其他 space 可能有一些定义的界限。
  2. 执行起来会更容易出错
  3. 实际上那些是二维矩阵,所以我必须将 4 个矩阵转换到一维 obervation_space 中的一个位置,然后自定义代理必须从一维观察重建 4 个矩阵。最初的快速非基于 RL 的实现已经永远 运行,所以我担心这种开销会减慢速度。

在这一点上,我只看到两种方法:

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

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

谢谢!

实际上,封装部分似乎正是 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)

你可以试试这个方法来定义观察space:

low = np.array([nbcaptors_low, cam1width_low, cam1height_low, cam2width_low, cam2height_low, thermalwidth_low, thermalheight_low])
high = np.array([nbcaptors_high, cam1width_high, cam1height_high, cam2width_high, cam2height_high, thermalwidth_high, thermalheight_high])

self.observation_space = gym.spaces.Box(low=-np.inf, high=np.inf)