快捷方式

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 (bool, 可选) –

    如果 True,则变换将为

    \[obs = (obs-loc)/scale\]

    因为它用于标准化。默认值为 False

  • eps (float, 可选) – 在 standard_normal 情况下,比例的 epsilon 增量。如果无法直接从比例 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 统计信息。

理想情况下,标准化常数应使观测统计信息接近标准高斯分布的统计信息。此方法计算位置和比例张量,该张量将经验性地计算高斯分布的均值和标准差,该高斯分布拟合在给定步数内使用父环境随机生成的数据上。

参数:
  • num_iter (int) – 环境中要运行的随机迭代次数。

  • reduce_dim (intint 元组, 可选) – 计算均值和标准差的维度。默认为 0。

  • cat_dim (int, 可选) – 批次沿其连接的维度。它必须是 reduce_dim 的一部分(如果为整数)或 reduce_dim 元组的一部分。默认为与 reduce_dim 相同的值。

  • key (NestedKey, 可选) – 如果提供,则将从结果 tensordict 中的该键检索摘要统计信息。否则,将使用 ObservationNorm.in_keys 中的第一个键。

  • keep_dims (int 元组, 可选) – 要在 loc 和 scale 中保留的维度。例如,当标准化最后两个维度上的 3D 张量时,可能希望位置和比例具有形状 [C, 1, 1],而不是第三个维度。默认为 None。

transform_input_spec(input_spec)[source]

转换输入规范,使结果规范与变换映射匹配。

参数:

input_spec (TensorSpec) – 变换前的规范

返回:

变换后的预期规范

transform_observation_spec(observation_spec: TensorSpec) TensorSpec[source]

转换观测规范,使结果规范与变换映射匹配。

参数:

observation_spec (TensorSpec) – 变换前的规范

返回:

变换后的预期规范

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取面向初学者和高级开发者的深入教程

查看教程

资源

查找开发资源并获得您的问题解答

查看资源