簡體   English   中英

openai 健身房觀察空間表示

[英]openai gym observation space representation

我有一個關於在健身房環境中表示觀察的問題。 我實際上有幾個不同尺寸的觀察空間,比如說我有一個 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)

然后,自定義代理可以使用以下方法處理數據:observation['cam1'] 或 obervation['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. 我的一維空間的低和高可能不夠好,因為例如其他空間可能有一些定義的邊界。
  2. 執行中更容易出錯
  3. 實際上那些是 2d 矩陣,所以我必須將 4 個矩陣轉換為 1d obervation_space 中的一個位置,然后自定義代理必須從 1d 觀察中重建 4 個矩陣。 最初的快速非基於強化學習的實現已經需要很長時間才能運行,所以我擔心這種開銷會減慢速度。

在這一點上,我只看到兩種方法:

  1. 將我所有的 4 個矩陣映射到一個一維數組
  2. 用另一個gym.Env封裝我的spaces.Dictgym.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)

你可以試試這個方法來定義觀察空間:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM