ObservationNorm¶
- class torchrl.envs.transforms.ObservationNorm(loc: Optional[float, torch.Tensor] = None, scale: Optional[float, torch.Tensor] = 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)[source]¶
觀測值仿射變換層。
根據以下公式對觀測值進行歸一化:
\[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 (布林值, 可選) –
如果為
True,則變換公式為\[obs = (obs-loc)/scale\]如同標準化一樣。預設為 False。
eps (
float, 可選) – 在standard_normal情況下,用於縮放的 epsilon 增量。如果無法直接從 scale dtype 恢復,則預設為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: Union[int, Tuple[int]] = 0, cat_dim: Optional[int] = None, key: Optional[NestedKey] = None, keep_dims: Optional[Tuple[int]] = None) None[source]¶
初始化父環境的 loc 和 scale 統計資訊。
歸一化常數理想情況下應使觀測值統計資訊接近標準高斯分佈的統計資訊。此方法計算一個位置 (loc) 和縮放 (scale) 張量,這些張量將根據使用父環境隨機生成給定步數的資料,經驗性地計算擬合到這些資料上的高斯分佈的均值和標準差。
- 引數:
num_iter (整數) – 在環境中執行的隨機迭代次數。
reduce_dim (整數 或 整數元組, 可選) – 計算均值和標準差的維度。預設為 0。
cat_dim (整數, 可選) – 收集的批次將沿其連線的維度。它必須與 reduce_dim 相等(如果是整數)或屬於 reduce_dim 元組的一部分。預設為與 reduce_dim 相同的值。
key (NestedKey, 可選) – 如果提供,則從結果 tensordict 中該鍵檢索彙總統計資訊。否則,將使用
ObservationNorm.in_keys中的第一個鍵。keep_dims (整數元組, 可選) – 在 loc 和 scale 中保留的維度。例如,當對一個 3D 張量按後兩個維度進行歸一化,但不按第三個維度時,可能希望 location 和 scale 的形狀為 [C, 1, 1]。預設為 None。
- transform_action_spec(action_spec: TensorSpec) TensorSpec[source]¶
轉換動作規約,使得結果規約與變換對映匹配。
- 引數:
action_spec (TensorSpec) – 變換前的規約
- 返回:
變換後的預期規約
- transform_observation_spec(observation_spec: TensorSpec) TensorSpec[source]¶
轉換觀測值規約,使得結果規約與變換對映匹配。
- 引數:
observation_spec (TensorSpec) – 變換前的規約
- 返回:
變換後的預期規約
- transform_state_spec(state_spec: TensorSpec) TensorSpec[source]¶
轉換狀態規約,使得結果規約與變換對映匹配。
- 引數:
state_spec (TensorSpec) – 變換前的規約
- 返回:
變換後的預期規約