包裝器

包裝器是一種方便的方法,可以在不直接變更底層程式碼的情況下修改現有的環境。

使用包裝器可以讓您避免大量的樣板程式碼,並使您的環境更模組化。重要的是,包裝器可以串聯以結合它們的效果,並且大多數透過 gymnasium.make() 產生的環境預設會被包裝。

為了包裝環境,您必須先初始化一個基礎環境。然後,您可以將此環境以及(可能可選的)參數傳遞給包裝器的建構函式。

>>> 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 屬性來存取第一個包裝器下的環境。由於 gymnasium.Wrapper 類別繼承自 gymnasium.Env,因此 gymnasium.Wrapper.env 可以是另一個包裝器。

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

如果您想要取得所有包裝器層下的環境,您可以使用 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>

您可能希望包裝器執行的三個常見事項是

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

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

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

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

如果您想要實作自己的自訂包裝器,請查看對應的教學

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

包裝 gymnasium.Env 以允許對 step()reset() 方法進行模組化轉換。

此類別是所有包裝器的基底類別,用於變更底層環境的行為。繼承自此類別的包裝器可以修改 action_spaceobservation_spacemetadata 屬性,而不會變更底層環境的屬性。此外,這些包裝器可以變更 step()reset() 方法的行為。

某些屬性(specrender_modenp_random)將會指向包裝器的環境(即指向 env 的對應屬性)。

注意

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

參數:

env – 要包裝的環境

方法

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

使用 envstep(),可以覆寫該方法來變更回傳的資料。

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

使用 reset() 方法,此方法來自 env,可以覆寫以變更返回的資料。

Wrapper.render() RenderFrame | list[RenderFrame] | None[原始碼]

使用 render() 方法,此方法來自 env,可以覆寫以變更返回的資料。

Wrapper.close()[原始碼]

關閉 wrapper 以及 env

classmethod Wrapper.wrapper_spec(**kwargs: Any) WrapperSpec[原始碼]

為 wrappers 產生 WrapperSpec

Wrapper.get_wrapper_attr(name: str) Any[原始碼]

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

參數:

name – 要取得的變數名稱

返回:

在 wrapper 或較底層環境中具有 name 的變數

Wrapper.set_wrapper_attr(name: str, value: Any)[原始碼]

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

參數:
  • name – 變數名稱

  • value – 新的變數值

屬性

Wrapper.env

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

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

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

返回 Envaction_space,除非覆寫,否則使用 wrapper 的 action_space

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

返回 Envobservation_space,除非覆寫,否則使用 wrapper 的 observation_space

property Wrapper.spec: EnvSpec | None

返回 Envspec 屬性,如果 wrapper 繼承自 EzPickle,則包含 WrapperSpec

property Wrapper.metadata: dict[str, Any]

返回 Envmetadata

property Wrapper.np_random: Generator

返回 Envnp_random 屬性。

property Wrapper.np_random_seed: int | None

返回基礎環境的 np_random_seed

屬性 Wrapper.unwrapped: Env[ObsType, ActType]

返回包裝器的基礎環境。

這將是赤裸的 gymnasium.Env 環境,在所有包裝層之下。