CatFrames¶
- class torchrl.envs.transforms.CatFrames(N: int, dim: int, in_keys: Optional[Sequence[NestedKey]] = None, out_keys: Optional[Sequence[NestedKey]] = None, padding='same', padding_value=0, as_inverse=False, reset_key: Optional[NestedKey] = None, done_key: Optional[NestedKey] = None)[source]¶
将连续的观测帧连接成单个张量。
例如,这可以解释所观测特征的运动/速度。在“Playing Atari with Deep Reinforcement Learning”中提出( https://arxiv.org/pdf/1312.5602.pdf)。
当在转换后的环境中使用时,
CatFrames
是一个有状态的类,可以通过调用reset()
方法将其重置为其原始状态。此方法接受带有"_reset"
条目的 tensordict,该条目指示要重置哪个缓冲区。- 参数:
N (int) – 要连接的观测数量。
dim (int) – 连接观测值所沿的维度。应为负数,以确保它与不同 batch_size 的环境兼容。
in_keys (sequence of NestedKey, optional) – 指向要连接的帧的键。默认为 [“pixels”]。
out_keys (sequence of NestedKey, optional) – 指向输出写入位置的键。默认为 in_keys 的值。
padding (str, optional) – 填充方法。可以是
"same"
或"constant"
之一。默认为"same"
,即第一个值用于填充。padding_value (float, optional) – 如果
padding="constant"
,则用作填充的值。默认为 0。as_inverse (bool, optional) – 如果
True
,则将转换应用为逆转换。默认为False
。reset_key (NestedKey, optional) – 用作部分重置指示符的重置键。必须是唯一的。如果未提供,则默认为父环境的唯一重置键(如果只有一个),否则引发异常。
done_key (NestedKey, optional) – 用作部分完成指示符的完成键。必须是唯一的。如果未提供,则默认为
"done"
。
示例
>>> from torchrl.envs.libs.gym import GymEnv >>> env = TransformedEnv(GymEnv('Pendulum-v1'), ... Compose( ... UnsqueezeTransform(-1, in_keys=["observation"]), ... CatFrames(N=4, dim=-1, in_keys=["observation"]), ... ) ... ) >>> print(env.rollout(3))
CatFrames
转换也可以离线使用,以重现不同规模的在线帧连接效果(或用于限制内存消耗的目的)。以下示例给出了完整的图景,以及torchrl.data.ReplayBuffer
的用法示例
>>> from torchrl.envs.utils import RandomPolicy >>> from torchrl.envs import UnsqueezeTransform, CatFrames >>> from torchrl.collectors import SyncDataCollector >>> # Create a transformed environment with CatFrames: notice the usage of UnsqueezeTransform to create an extra dimension >>> env = TransformedEnv( ... GymEnv("CartPole-v1", from_pixels=True), ... Compose( ... ToTensorImage(in_keys=["pixels"], out_keys=["pixels_trsf"]), ... Resize(in_keys=["pixels_trsf"], w=64, h=64), ... GrayScale(in_keys=["pixels_trsf"]), ... UnsqueezeTransform(-4, in_keys=["pixels_trsf"]), ... CatFrames(dim=-4, N=4, in_keys=["pixels_trsf"]), ... ) ... ) >>> # we design a collector >>> collector = SyncDataCollector( ... env, ... RandomPolicy(env.action_spec), ... frames_per_batch=10, ... total_frames=1000, ... ) >>> for data in collector: ... print(data) ... break >>> # now let's create a transform for the replay buffer. We don't need to unsqueeze the data here. >>> # however, we need to point to both the pixel entry at the root and at the next levels: >>> t = Compose( ... ToTensorImage(in_keys=["pixels", ("next", "pixels")], out_keys=["pixels_trsf", ("next", "pixels_trsf")]), ... Resize(in_keys=["pixels_trsf", ("next", "pixels_trsf")], w=64, h=64), ... GrayScale(in_keys=["pixels_trsf", ("next", "pixels_trsf")]), ... CatFrames(dim=-4, N=4, in_keys=["pixels_trsf", ("next", "pixels_trsf")]), ... ) >>> from torchrl.data import TensorDictReplayBuffer, LazyMemmapStorage >>> rb = TensorDictReplayBuffer(storage=LazyMemmapStorage(1000), transform=t, batch_size=16) >>> data_exclude = data.exclude("pixels_trsf", ("next", "pixels_trsf")) >>> rb.add(data_exclude) >>> s = rb.sample(1) # the buffer has only one element >>> # let's check that our sample is the same as the batch collected during inference >>> assert (data.exclude("collector")==s.squeeze(0).exclude("index", "collector")).all()
注意
CatFrames
目前仅支持根目录下的"done"
信号。嵌套的done
(例如在 MARL 设置中找到的那些)目前不受支持。如果需要此功能,请在 TorchRL 代码库上提出问题。- transform_observation_spec(observation_spec: TensorSpec) TensorSpec [source]¶
转换观测规范,使结果规范与转换映射匹配。
- 参数:
observation_spec (TensorSpec) – 转换前的规范
- 返回:
转换后预期的规范