Wrappers

Wrappers 是一種修改現有環境的便捷方式,無需直接更改底層程式碼。

使用 wrappers 可以讓您避免大量重複程式碼,並使您的環境更模組化。重要的是,wrappers 可以鏈式組合以結合它們的效果,並且大多數透過 gymnasium.make() 產生的環境預設已經被包裹 (wrapped) 了。

為了包裹 (wrap) 環境,您必須先初始化一個基礎環境。然後,您可以將此環境連同(可能可選的)參數傳遞給 wrapper 的建構子。

>>> import gymnasium as gym
>>> from gymnasium.wrappers import RescaleAction
>>> base_env = gym.make("Hopper-v4")
>>> base_env.action_space
Box(-1.0, 1.0, (3,), float32)
>>> wrapped_env = RescaleAction(base_env, min_action=0, max_action=1)
>>> wrapped_env.action_space
Box(0.0, 1.0, (3,), float32)

您可以使用 gymnasium.Wrapper.env 屬性存取 **第一個** wrapper 底下的環境。由於 gymnasium.Wrapper 類別繼承自 gymnasium.Env,因此 gymnasium.Wrapper.env 可以是另一個 wrapper。

>>> wrapped_env
<RescaleAction<TimeLimit<OrderEnforcing<PassiveEnvChecker<HopperEnv<Hopper-v4>>>>>>
>>> wrapped_env.env
<TimeLimit<OrderEnforcing<PassiveEnvChecker<HopperEnv<Hopper-v4>>>>>

如果您想取得 **所有** wrapper 層級底下的環境,可以使用 gymnasium.Wrapper.unwrapped 屬性。如果環境已經是裸環境,則 gymnasium.Wrapper.unwrapped 屬性將只會回傳自身。

>>> wrapped_env
<RescaleAction<TimeLimit<OrderEnforcing<PassiveEnvChecker<HopperEnv<Hopper-v4>>>>>>
>>> wrapped_env.unwrapped 
<gymnasium.envs.mujoco.hopper_v4.HopperEnv object at 0x7fbb5efd0490>

您可能希望 wrapper 執行的三種常見操作如下:

  • 在將動作應用於基礎環境之前轉換動作

  • 轉換基礎環境回傳的觀察

  • 轉換基礎環境回傳的獎勵

此類 wrappers 可以透過繼承 gymnasium.ActionWrappergymnasium.ObservationWrappergymnasium.RewardWrapper 並實作各自的轉換來輕鬆實作。如果您需要 wrapper 執行更複雜的任務,您可以直接繼承 gymnasium.Wrapper 類別。

如果您想實作自己的自訂 wrapper,請查看 相應的教學

class gymnasium.Wrapper(env: Env[ObsType, ActType])[source]

包裹 (Wraps) gymnasium.Env 以允許模組化轉換 step()reset() 方法。

此類別是所有 wrapper 的基底類別,用於更改底層環境的行為。繼承自此類別的 Wrappers 可以修改 action_spaceobservation_spacemetadata 屬性,而無需更改底層環境的屬性。此外,這些 wrappers 可以更改 step()reset() 方法的行為。

某些屬性(specrender_modenp_random)將指回 wrapper 的環境(即指向 env 的相應屬性)。

注意

如果您繼承自 Wrapper,請不要忘記呼叫 super().__init__(env)

參數:

env – 要包裹 (wrap) 的環境

方法

Wrapper.step(action: WrapperActType) tuple[WrapperObsType, SupportsFloat, bool, bool, dict[str, Any]][source]

使用 envstep(),可以覆寫以更改回傳的資料。

Wrapper.reset(*, seed: int | None = None, options: dict[str, Any] | None = None) tuple[WrapperObsType, dict[str, Any]][source]

使用 envreset(),可以覆寫以更改回傳的資料。

Wrapper.render() RenderFrame | list[RenderFrame] | None[source]

使用 envrender(),可以覆寫以更改回傳的資料。

Wrapper.close()[source]

關閉 wrapper 和 env

classmethod Wrapper.wrapper_spec(**kwargs: Any) WrapperSpec[source]

為 wrappers 生成 WrapperSpec

Wrapper.get_wrapper_attr(name: str) Any[source]

如果 name 在此物件中不存在,則從 wrapper 和較低層級環境取得屬性。

參數:

name – 要取得的變數名稱

回傳:

wrapper 或較低層級環境中具有 name 的變數

Wrapper.set_wrapper_attr(name: str, value: Any, *, force: bool = True) bool[source]

如果 name 已經定義,則在此 wrapper 或較低層級環境上設定屬性。

參數:
  • name – 變數名稱

  • value – 新的變數值

  • force – 如果較低層級環境中不存在該屬性,是否強制在此 wrapper 上建立屬性,而不是引發例外

回傳:

如果變數已在此 wrapper 或較低層級 wrapper 中設定。

屬性

Wrapper.env

此 wrapper 底下的環境(低一層級)。

這本身可能是一個被包裹 (wrapped) 的環境。若要取得所有 wrapper 層級底下的環境,請使用 gymnasium.Wrapper.unwrapped

property Wrapper.action_space: spaces.Space[ActType] | spaces.Space[WrapperActType]

回傳 Env action_space,除非被覆寫,否則會使用 wrapper 的 action_space

property Wrapper.observation_space: spaces.Space[ObsType] | spaces.Space[WrapperObsType]

回傳 Env observation_space,除非被覆寫,否則會使用 wrapper 的 observation_space

property Wrapper.spec: EnvSpec | None

如果 wrapper 繼承自 EzPickle,則回傳具有 WrapperSpecEnv spec 屬性。

property Wrapper.metadata: dict[str, Any]

回傳 Env metadata

property Wrapper.np_random: Generator

回傳 Env np_random 屬性。

property Wrapper.np_random_seed: int | None

回傳基礎環境的 np_random_seed

property Wrapper.unwrapped: Env[ObsType, ActType]

回傳 wrapper 的基礎環境。

這將是裸露的 gymnasium.Env 環境,位於所有 wrapper 層級之下。