ObservationNorm¶
- class torchrl.envs.transforms.ObservationNorm(loc: float | torch.Tensor | None = None, scale: float | torch.Tensor | None = None, in_keys: Sequence[NestedKey] | None = None, out_keys: Sequence[NestedKey] | None = None, in_keys_inv: Sequence[NestedKey] | None = None, out_keys_inv: Sequence[NestedKey] | None = None, standard_normal: bool = False, eps: float | None = None)[原始碼]¶
觀測仿射變換層。
根據以下公式對觀測進行歸一化:
\[obs = obs * scale + loc\]- 引數:
loc (數字或張量) – 仿射變換的中心點。
scale (數字或張量) – 仿射變換的尺度。
in_keys (NestedKey 序列, 可選) – 需要歸一化的條目。預設為 [“observation”, “pixels”]。所有條目將使用相同的值進行歸一化:如果需要不同的行為(例如,畫素和狀態的歸一化不同),則應使用不同的
ObservationNorm物件。out_keys (NestedKey 序列, 可選) – 輸出條目。預設為 in_keys 的值。
in_keys_inv (NestedKey 序列, 可選) – ObservationNorm 也支援逆變換。只有當為
in_keys_inv提供一個鍵列表時,才會發生這種情況。如果未提供,則只調用前向變換。out_keys_inv (NestedKey 序列, 可選) – 逆變換的輸出條目。預設為 in_keys_inv 的值。
standard_normal (bool, 可選) –
如果為
True,則變換將為\[obs = (obs-loc)/scale\]如同標準化一樣。預設值為 False。
eps (
float, 可選) – 在standard_normal情況下的尺度增量。如果無法直接從尺度資料型別中恢復,則預設為1e-6。
示例
>>> torch.set_default_tensor_type(torch.DoubleTensor) >>> r = torch.randn(100, 3)*torch.randn(3) + torch.randn(3) >>> td = TensorDict({'obs': r}, [100]) >>> transform = ObservationNorm( ... loc = td.get('obs').mean(0), ... scale = td.get('obs').std(0), ... in_keys=["obs"], ... standard_normal=True) >>> _ = transform(td) >>> print(torch.isclose(td.get('obs').mean(0), ... torch.zeros(3)).all()) tensor(True) >>> print(torch.isclose(td.get('next_obs').std(0), ... torch.ones(3)).all()) tensor(True)
歸一化統計量可以自動計算: .. rubric:: 示例
>>> from torchrl.envs.libs.gym import GymEnv >>> torch.manual_seed(0) >>> env = GymEnv("Pendulum-v1") >>> env = TransformedEnv(env, ObservationNorm(in_keys=["observation"])) >>> env.set_seed(0) >>> env.transform.init_stats(100) >>> print(env.transform.loc, env.transform.scale) tensor([-1.3752e+01, -6.5087e-03, 2.9294e-03], dtype=torch.float32) tensor([14.9636, 2.5608, 0.6408], dtype=torch.float32)
- init_stats(num_iter: int, reduce_dim: int | tuple[int] = 0, cat_dim: int | None = None, key: NestedKey | None = None, keep_dims: tuple[int] | None = None) None[原始碼]¶
初始化父環境的中心點和尺度統計量。
歸一化常數理想情況下應該使觀測統計量接近標準高斯分佈的統計量。此方法計算一箇中心點和尺度張量,該張量將經驗性地計算高斯分佈的均值和標準差,該分佈擬合在從父環境隨機生成的資料上,經過給定步數。
- 引數:
num_iter (int) – 在環境中執行的隨機迭代次數。
reduce_dim (int或int 元組, 可選) – 計算均值和標準差的維度。預設為 0。
cat_dim (int, 可選) – 收集的批次將被連線的維度。它必須是 reduce_dim(如果是整數)的一部分,或者屬於 reduce_dim 元組。預設為與 reduce_dim 相同的值。
key (NestedKey, 可選) – 如果提供,將從結果張量字典的該鍵中檢索摘要統計資訊。否則,將使用
ObservationNorm.in_keys中的第一個鍵。keep_dims (int 元組, 可選) – loc 和 scale 中要保留的維度。例如,當對最後一個維度為 3D 的張量進行歸一化時,可能希望中心點和尺度具有形狀 [C, 1, 1],但不是第三個維度。預設為 None。
- transform_action_spec(action_spec: TensorSpec) TensorSpec[原始碼]¶
轉換動作規範,使結果規範與變換對映匹配。
- 引數:
action_spec (TensorSpec) – 變換前的規範
- 返回:
轉換後的預期規範
- transform_observation_spec(observation_spec: TensorSpec) TensorSpec[原始碼]¶
轉換觀察規範,使結果規範與轉換對映匹配。
- 引數:
observation_spec (TensorSpec) – 轉換前的規範
- 返回:
轉換後的預期規範
- transform_state_spec(state_spec: TensorSpec) TensorSpec[原始碼]¶
轉換狀態規範,使結果規範與變換對映匹配。
- 引數:
state_spec (TensorSpec) – 變換前的規範
- 返回:
轉換後的預期規範