DiscreteActionProjection¶
- class torchrl.envs.transforms.DiscreteActionProjection(num_actions_effective: int, max_actions: int, action_key: NestedKey = 'action', include_forward: bool = True)[source]¶
将离散动作从高维空间投影到低维空间。
给定一个作为单热向量编码的离散动作(从 1 到 N)和一个最大动作索引 num_actions(其中 num_actions < N),转换动作,使 action_out 最多为 num_actions。
如果输入动作 > num_actions,则将其替换为 0 到 num_actions-1 之间的随机值。否则保留相同的动作。这旨在与应用于具有不同动作空间的多个离散控制环境的策略一起使用。
对 DiscreteActionProjection.forward 的调用(例如来自回放缓冲区或在 nn.Modules 序列中)将在
"in_keys"
上调用 num_actions_effective -> max_actions 的转换,而对 _call 的调用将被忽略。实际上,转换后的环境被指示仅针对内部 base_env 更新输入键,但原始输入键将保持不变。- 参数:
num_actions_effective (int) – 考虑的最大动作数。
max_actions (int) – 此模块可以读取的最大动作数。
action_key (NestedKey, optional) – 动作的键名称。默认为“action”。
include_forward (bool, optional) – 如果
True
,则当模块由回放缓冲区或 nn.Module 链调用时,对 forward 的调用也将动作从一个域映射到另一个域。默认为 True。
示例
>>> torch.manual_seed(0) >>> N = 3 >>> M = 2 >>> action = torch.zeros(N, dtype=torch.long) >>> action[-1] = 1 >>> td = TensorDict({"action": action}, []) >>> transform = DiscreteActionProjection(num_actions_effective=M, max_actions=N) >>> _ = transform.inv(td) >>> print(td.get("action")) tensor([1])
- transform_input_spec(input_spec: CompositeSpec)[source]¶
转换输入规范,以便生成的规范与转换映射匹配。
- 参数:
input_spec (TensorSpec) – 转换前的规范
- 返回值:
转换后的预期规范