我有一个关于在健身房环境中表示观察的问题。 我实际上有几个不同尺寸的观察空间,比如说我有一个 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 个问题:
此时我只看到两种方法:
如果能就如何在性能和简单性方面最好地解决这个问题提供一些意见,我们将不胜感激。
谢谢!
答案 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)