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) – 变换前的规约
- 返回:
变换后的预期规约