快捷方式

TensorDictParams

class tensordict.TensorDictParams(parameters: Optional[Union[TensorDictBase, dict]] = None, *, no_convert=False, lock: bool = False, **kwargs)

TensorDictBase 的包装器,具有参数暴露功能。

此类旨在保存一个包含参数的 TensorDictBase 实例,使其可供父 Module 访问。这允许将 tensordict 参数无缝集成到 PyTorch 模块中,从而实现参数迭代和优化等操作。

主要特点

  • 参数暴露:tensordict 中的参数会暴露给父模块,使其可以包含在 named_parameters() 等操作中。

  • 索引:索引的工作方式与包装的 tensordict 类似。但是,参数名称(在 named_parameters() 中)使用 TensorDict.flatten_keys(“_”) 注册,这可能会导致与 tensordict 内容不同的键名。

  • 自动转换:除非通过 no_convert 关键字参数另有指定,否则 tensordict 中设置的任何张量都会自动转换为 torch.nn.Parameter

参数
parameters (TensorDictBase 或 dict):要表示为参数的 tensordict。值被转换为

参数,除非 no_convert=True。如果提供了 dict,它将被包装在 TensorDict 实例中。也可以使用关键字参数。

关键字参数:
  • no_convert (bool) – 如果 True,则不会进行到 nn.Parameter 的转换,并且所有非参数、非缓冲区张量都将转换为 Buffer 实例。如果 False,则所有具有非整数 dtype 的张量都将转换为 Parameter,而整数 dtype 将转换为 Buffer 实例。默认为 False

  • lock (bool) –

    如果 True,则 TensorDictParams 托管的 tensordict 将被锁定,从而阻止修改,并且在需要 unlock_() 时可能会影响性能。默认为 False

    警告

    由于默认情况下内部 tensordict 未被复制或锁定,因此在 TensorDictParams 中注册 tensordict 并在之后修改其内容将__不会__更新 TensorDictParams parameters()buffers() 序列中的值。

  • **kwargs – 用于填充 TensorDictParams 的键值对。与 parameters 输入互斥。

示例
>>> from torch import nn
>>> from tensordict import TensorDict
>>> module = nn.Sequential(nn.Linear(3, 4), nn.Linear(4, 4))
>>> params = TensorDict.from_module(module)
>>> params.lock_()
>>> p = TensorDictParams(params)
>>> print(p)
TensorDictParams(params=TensorDict(
    fields={
        0: TensorDict(
            fields={
                bias: Parameter(shape=torch.Size([4]), device=cpu, dtype=torch.float32, is_shared=False),
                weight: Parameter(shape=torch.Size([4, 3]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False),
        1: TensorDict(
            fields={
                bias: Parameter(shape=torch.Size([4]), device=cpu, dtype=torch.float32, is_shared=False),
                weight: Parameter(shape=torch.Size([4, 4]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False))
>>> class CustomModule(nn.Module):
...     def __init__(self, params):
...         super().__init__()
...         self.params = params
>>> m = CustomModule(p)
>>> # The wrapper supports assignment, and values are converted to Parameters
>>> m.params['other'] = torch.randn(3)
>>> assert isinstance(m.params['other'], nn.Parameter)
abs() T

计算 TensorDict 中每个元素的绝对值。

abs_() T

就地计算 TensorDict 中每个元素的绝对值。

acos() T

计算 TensorDict 中每个元素的 acos() 值。

acos_() T

就地计算 TensorDict 中每个元素的 acos() 值。

add(other: tensordict.base.TensorDictBase | torch.Tensor, *, alpha: float | None = None, default: str | torch.Tensor | None = None) TensorDictBase

将由 alpha 缩放的 other 添加到 self

\[\text{{out}}_i = \text{{input}}_i + \text{{alpha}} \times \text{{other}}_i\]
参数:

other (TensorDictBasetorch.Tensor) – 要添加到 self 的张量或 TensorDict。

关键字参数:
  • alpha (Number, optional) – other 的乘数。

  • default (torch.Tensorstr, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递 default="intersection",则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default 将用于操作两侧所有缺失的条目。

add_(other: tensordict.base.TensorDictBase | torch.Tensor | float, *, alpha: Optional[float] = None)

add() 的原地(in-place)版本。

注意

原地 add 不支持 default 关键字参数。

add_module(name: str, module: Optional[Module]) None

向当前模块添加子模块。

可以使用给定的名称作为属性访问该模块。

参数:
  • name (str) – 子模块的名称。可以使用给定的名称从该模块访问子模块

  • module (Module) – 要添加到模块的子模块。

addcdiv(other1: tensordict.base.TensorDictBase | torch.Tensor, other2: tensordict.base.TensorDictBase | torch.Tensor, value: float | None = 1)

执行 other1 除以 other2 的逐元素除法,将结果乘以标量 value 并将其加到 self

\[\text{out}_i = \text{input}_i + \text{value} \times \frac{\text{tensor1}_i}{\text{tensor2}_i}\]

selfother1other2 的元素的形状必须是可广播的。

对于 FloatTensorDoubleTensor 类型的输入,value 必须是实数,否则为整数。

参数:
  • other1 (TensorDictTensor) – 分子 tensordict (或 tensor)

  • tensor2 (TensorDictTensor) – 分母 tensordict (或 tensor)

关键字参数:

value (Number, 可选) – \(\text{tensor1} / \text{tensor2}\) 的乘数

addcdiv_(other1, other2, *, value: float | None = 1)

addcdiv() 的原地版本。

addcmul(other1: tensordict.base.TensorDictBase | torch.Tensor, other2: tensordict.base.TensorDictBase | torch.Tensor, *, value: float | None = 1)

执行 other1 乘以 other2 的逐元素乘法,将结果乘以标量 value 并将其加到 self

\[\text{out}_i = \text{input}_i + \text{value} \times \text{other1}_i \times \text{other2}_i\]

selfother1other2 的形状必须是可广播的。

对于 FloatTensorDoubleTensor 类型的输入,value 必须是实数,否则为整数。

参数:
  • other1 (TensorDictTensor) – 要相乘的 tensordict 或 tensor

  • other2 (TensorDictTensor) – 要相乘的 tensordict 或 tensor

关键字参数:

value (Number, 可选) – \(other1 .* other2\) 的乘数

addcmul_(other1, other2, *, value: float | None = 1)

addcmul() 的原地版本。

all(dim: int = None) bool | tensordict.base.TensorDictBase

检查 tensordict 中是否所有值均为 True/非空。

参数:

dim (int, optional) – 如果为 None,则返回一个布尔值,指示是否所有 tensor 都返回 tensor.all() == True。 如果是整数,则仅当此维度与 tensordict 的形状兼容时,才会对指定的维度调用 all。

amax(dim: int | NO_DEFAULT = _NoDefault.ZERO, keepdim: bool = False, *, reduce: bool | None = None) TensorDictBase | torch.Tensor

返回输入 tensordict 中所有元素的最大值。

max() 相同,只是 return_indices=False

amin(dim: int | NO_DEFAULT = _NoDefault.ZERO, keepdim: bool = False, *, reduce: bool | None = None) TensorDictBase | torch.Tensor

返回输入 tensordict 中所有元素的最小值。

min() 相同,只是 return_indices=False

any(dim: int = None) bool | tensordict.base.TensorDictBase

检查 tensordict 中是否存在任何 True/非空值。

参数:

dim (int, optional) – 如果为 None,则返回一个布尔值,指示是否所有 tensor 都返回 tensor.any() == True。如果是整数,则仅当此维度与 tensordict 的形状兼容时,才会对指定的维度调用 all。

apply(fn: Callable, *others: TensorDictBase, batch_size: Optional[Sequence[int]] = None, device: torch.device | None = _NoDefault.ZERO, names: Optional[Sequence[str]] = _NoDefault.ZERO, inplace: bool = False, default: Any = _NoDefault.ZERO, filter_empty: bool | None = None, call_on_nested: bool = False, **constructor_kwargs) tensordict.base.TensorDictBase | None

将可调用对象应用于 tensordict 中存储的所有值,并将它们设置在一个新的 tensordict 中。

可调用对象的签名必须为 Callable[Tuple[Tensor, ...], Optional[Union[Tensor, TensorDictBase]]]

参数:
  • fn (Callable) – 要应用于 tensordict 中 tensor 的函数。

  • *others (TensorDictBase 实例, optional) – 如果提供,这些 tensordict 实例应具有与 self 匹配的结构。 fn 参数应接收与 tensordict 数量一样多的未命名输入,包括 self。 如果其他 tensordict 缺少条目,则可以通过 default 关键字参数传递默认值。

关键字参数:
  • batch_size (int 序列, 可选) – 如果提供,生成的 TensorDict 将具有所需的 batch_size。 batch_size 参数应与转换后的 batch_size 匹配。 这是一个仅关键字参数。

  • device (torch.device, 可选) – 生成的设备(如果有)。

  • names (str 列表, 可选) – 新的维度名称,以防修改了 batch_size。

  • inplace (bool, 可选) – 如果为 True,则进行原地更改。 默认为 False。 这是一个仅关键字参数。

  • default (Any, 可选) – 其他 tensordict 中缺失条目的默认值。 如果未提供,缺失的条目将引发 KeyError

  • filter_empty (bool, 可选) – 如果 True,则将滤除空 tensordict。 这也降低了计算成本,因为不会创建和销毁空数据结构。 非张量数据被视为叶子,因此即使该函数未触及,也会保留在 tensordict 中。 出于向后兼容性的目的,默认为 False

  • propagate_lock (bool, 可选) – 如果 True,则锁定的 tensordict 将生成另一个锁定的 tensordict。 默认为 False

  • call_on_nested (bool, 可选) –

    如果 True,则将在第一级张量和容器(TensorDict 或 tensorclass)上调用该函数。 在这种情况下,func 负责将其调用传播到嵌套级别。 这允许在将调用传播到嵌套 tensordict 时进行细粒度控制。 如果 False,则仅在叶子上调用该函数,并且 apply 将负责将该函数分派到所有叶子上。

    >>> td = TensorDict({"a": {"b": [0.0, 1.0]}, "c": [1.0, 2.0]})
    >>> def mean_tensor_only(val):
    ...     if is_tensor_collection(val):
    ...         raise RuntimeError("Unexpected!")
    ...     return val.mean()
    >>> td_mean = td.apply(mean_tensor_only)
    >>> def mean_any(val):
    ...     if is_tensor_collection(val):
    ...         # Recurse
    ...         return val.apply(mean_any, call_on_nested=True)
    ...     return val.mean()
    >>> td_mean = td.apply(mean_any, call_on_nested=True)
    

  • out (TensorDictBase, 可选) –

    一个用于写入结果的 tensordict。 这可以用于避免创建新的 tensordict

    >>> td = TensorDict({"a": 0})
    >>> td.apply(lambda x: x+1, out=td)
    >>> assert (td==1).all()
    

    警告

    如果在 tensordict 上执行的操作需要访问多个键才能进行单个计算,则提供等于 selfout 参数可能会导致操作静默地提供错误的结果。 例如

    >>> td = TensorDict({"a": 1, "b": 1})
    >>> td.apply(lambda x: x+td["a"])["b"] # Right!
    tensor(2)
    >>> td.apply(lambda x: x+td["a"], out=td)["b"] # Wrong!
    tensor(3)
    

  • **constructor_kwargs – 要传递给 TensorDict 构造函数的其他关键字参数。

返回值:

一个具有 transformed_in 张量的新 tensordict。

示例

>>> td = TensorDict({
...     "a": -torch.ones(3),
...     "b": {"c": torch.ones(3)}},
...     batch_size=[3])
>>> td_1 = td.apply(lambda x: x+1)
>>> assert (td_1["a"] == 0).all()
>>> assert (td_1["b", "c"] == 2).all()
>>> td_2 = td.apply(lambda x, y: x+y, td)
>>> assert (td_2["a"] == -2).all()
>>> assert (td_2["b", "c"] == 2).all()

注意

如果该函数返回 None,则忽略该条目。 这可用于过滤 tensordict 中的数据

>>> td = TensorDict({"1": 1, "2": 2, "b": {"2": 2, "1": 1}}, [])
>>> def filter(tensor):
...     if tensor == 1:
...         return tensor
>>> td.apply(filter)
TensorDict(
    fields={
        1: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False),
        b: TensorDict(
            fields={
                1: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)

注意

apply 方法将返回一个 TensorDict 实例,无论输入类型如何。 要保持相同的类型,可以执行

>>> out = td.clone(False).update(td.apply(...))
apply_(fn: Callable, *others, **kwargs) T

将可调用对象应用于 tensordict 中存储的所有值,并将其重写到原地。

参数:
  • fn (Callable) – 要应用于 tensordict 中 tensor 的函数。

  • *others (TensorDictBase 序列, 可选) – 要使用的其他 tensordict。

关键字参数:参见 apply()

返回值:

应用该函数的 self 或 self 的副本

asin() T

计算 TensorDict 的每个元素的 asin() 值。

asin_() T

计算 TensorDict 的每个元素的 asin() 值(原地计算)。

atan() T

计算 TensorDict 的每个元素的 atan() 值。

atan_() T

计算 TensorDict 的每个元素的 atan() 值(原地计算)。

auto_batch_size_(batch_dims: Optional[int] = None) T

设置 tensordict 的最大批量大小,最多可达可选的 batch_dims。

参数:

batch_dims (int, 可选) – 如果提供,则批量大小最多为 batch_dims 长。

返回值:

self

示例

>>> from tensordict import TensorDict
>>> import torch
>>> td = TensorDict({"a": torch.randn(3, 4, 5), "b": {"c": torch.randn(3, 4, 6)}}, batch_size=[])
>>> td.auto_batch_size_()
>>> print(td.batch_size)
torch.Size([3, 4])
>>> td.auto_batch_size_(batch_dims=1)
>>> print(td.batch_size)
torch.Size([3])
auto_device_() T

如果设备是唯一的,则自动设置设备。

返回值:具有已编辑的 device 属性的 self。

property batch_dims: int

tensordict 批量大小的长度。

返回值:

描述 tensordict 维度的 int。

property batch_size: Size

TensorDict 的形状(或批量大小)。

tensordict 的形状对应于其包含的张量的公共第一个 N 维度,其中 N 是任意数字。 批量大小与“特征大小”形成对比,后者表示张量的语义相关形状。 例如,一批视频的形状可能为 [B, T, C, W, H],其中 [B, T] 是批量大小(批量和时间维度),[C, W, H] 是特征维度(通道和空间维度)。

TensorDict 形状由用户在初始化时控制(即,它不是从张量形状推断出来的)。

如果新大小与 TensorDict 内容兼容,则可以动态编辑 batch_size。 例如,始终允许将批量大小设置为空值。

返回值:

一个 Size 对象,描述 TensorDict 的批量大小。

示例

>>> data = TensorDict({
...     "key 0": torch.randn(3, 4),
...     "key 1": torch.randn(3, 5),
...     "nested": TensorDict({"key 0": torch.randn(3, 4)}, batch_size=[3, 4])},
...     batch_size=[3])
>>> data.batch_size = () # resets the batch-size to an empty value
bfloat16()

将所有张量转换为 torch.bfloat16

bitwise_and(other: tensordict.base.TensorDictBase | torch.Tensor, *, default: str | torch.Tensor | None = None) TensorDictBase

执行 selfother 之间的按位与操作。

\[\text{{out}}_i = \text{{input}}_i \land \text{{other}}_i\]
参数:

other (TensorDictBasetorch.Tensor) – 用于执行按位与操作的张量或 TensorDict。

关键字参数:

default (torch.Tensorstr, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递 default="intersection",则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default 将用于操作两侧所有缺失的条目。

bool()

将所有张量转换为 torch.bool 类型。

buffers(recurse: bool = True) Iterator[Tensor]

返回模块缓冲区的迭代器。

参数:

recurse (bool) – 如果为 True,则产生此模块和所有子模块的缓冲区。 否则,仅产生作为此模块直接成员的缓冲区。

Yields:

torch.Tensor – 模块缓冲区

示例

>>> # xdoctest: +SKIP("undefined vars")
>>> for buf in model.buffers():
>>>     print(type(buf), buf.size())
<class 'torch.Tensor'> (20L,)
<class 'torch.Tensor'> (20L, 1L, 5L, 5L)
bytes(*, count_duplicates: bool = True) int

计算包含的张量的字节数。

关键字参数:

count_duplicates (bool) – 是否将重复的张量视为独立的。 如果为 False,则只会丢弃完全相同的张量(来自公共基础张量的相同视图但不同的 ID 将被计算两次)。 默认为 True(假设每个张量都是单个副本)。

classmethod cat(input, dim=0, *, out=None)

沿给定维度将 tensordict 连接成一个 tensordict。

此调用等效于调用 torch.cat(),但与 torch.compile 兼容。

cat_from_tensordict(dim: int = 0, *, sorted: Optional[Union[bool, List[NestedKey]]] = None, out: Tensor = None) Tensor

将 tensordict 的所有条目连接成一个张量。

参数:

dim (int, optional) – 条目应连接的维度。

关键字参数:
  • sorted (bool or list of NestedKeys) – 如果为 True,条目将按字母顺序连接。 如果为 False(默认),将使用字典顺序。 或者,可以提供密钥名称列表,并且将相应地连接张量。 这会产生一些开销,因为将根据 tensordict 中的叶名称列表检查密钥列表。

  • out (torch.Tensor, optional) – 用于 cat 操作的可选目标张量。

cat_tensors(*keys: NestedKey, out_key: NestedKey, dim: int = 0, keep_entries: bool = False) T

将条目连接到新条目中,并可能删除原始值。

参数:

keys (NestedKey 序列) – 要连接的条目。

关键字参数

out_key (NestedKey): 连接的输入的新密钥名称。 keep_entries (bool, optional): 如果为 False,则将删除 keys 中的条目。

默认为 False

dim (int, optional): 必须进行连接的维度。

默认为 0

返回: self

示例

>>> td = TensorDict(a=torch.zeros(1), b=torch.ones(1))
>>> td.cat_tensors("a", "b", out_key="c")
>>> assert "a" not in td
>>> assert (td["c"] == torch.tensor([0, 1])).all()
ceil() T

计算 TensorDict 中每个元素的 ceil() 值。

ceil_() T

就地计算 TensorDict 中每个元素的 ceil() 值。

children() Iterator[Module]

返回直接子模块的迭代器。

Yields:

Module – 子模块

chunk(chunks: int, dim: int = 0) tuple[tensordict.base.TensorDictBase, ...]

如果可能,将 tensordict 分割成指定数量的块。

每个块都是输入 tensordict 的一个视图。

参数:
  • chunks (int) – 要返回的块数

  • dim (int, optional) – 沿哪个维度分割 tensordict。默认为 0。

示例

>>> td = TensorDict({
...     'x': torch.arange(24).reshape(3, 4, 2),
... }, batch_size=[3, 4])
>>> td0, td1 = td.chunk(dim=-1, chunks=2)
>>> td0['x']
tensor([[[ 0,  1],
         [ 2,  3]],
        [[ 8,  9],
         [10, 11]],
        [[16, 17],
         [18, 19]]])
clamp(min: tensordict.base.TensorDictBase | torch.Tensor = None, max: tensordict.base.TensorDictBase | torch.Tensor = None, *, out=None)

self 中的所有元素限制在范围 [ min, max ] 内。

令 min_value 和 max_value 分别为 minmax,则返回

\[y_i = \min(\max(x_i, \text{min\_value}_i), \text{max\_value}_i)\]

如果 minNone,则没有下限。 或者,如果 maxNone,则没有上限。

注意

如果 min 大于 max,则 torch.clamp(..., min, max)input 中的所有元素设置为 max 的值。

clamp_max(other: tensordict.base.TensorDictBase | torch.Tensor, *, default: str | torch.Tensor | None = None) T

如果 self 的元素大于 other,则将其限制为 other 的值。

参数:

other (TensorDict or Tensor) – 另一个输入 tensordict 或 tensor。

关键字参数:

default (torch.Tensorstr, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递 default="intersection",则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default 将用于操作两侧所有缺失的条目。

clamp_max_(other: tensordict.base.TensorDictBase | torch.Tensor) T

clamp_max() 的原地版本。

注意

原地 clamp_max 不支持 default 关键字参数。

clamp_min(other: tensordict.base.TensorDictBase | torch.Tensor, default: str | torch.Tensor | None = None) T

如果 self 的元素小于 other,则将其限制为 other 的值。

参数:

other (TensorDict or Tensor) – 另一个输入 tensordict 或 tensor。

关键字参数:

default (torch.Tensorstr, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递 default="intersection",则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default 将用于操作两侧所有缺失的条目。

clamp_min_(other: tensordict.base.TensorDictBase | torch.Tensor) T

clamp_min() 的原地版本。

注意

原地 clamp_min 不支持 default 关键字参数。

clear() T

清除 tensordict 的内容。

clear_device_() T

清除 tensordict 的设备。

返回: self

clear_refs_for_compile_() T

清除 weakrefs,以便 tensordict 安全地退出编译区域。

在返回 TensorDict 之前,如果遇到 torch._dynamo.exc.Unsupported: reconstruct: WeakRefVariable() 错误,请使用此方法。

返回: self

clone(recurse: bool = True, **kwargs) T

将 TensorDictBase 子类的实例克隆到相同类型的新 TensorDictBase 子类实例上。

要从任何其他 TensorDictBase 子类型创建 TensorDict 实例,请改为调用 to_tensordict() 方法。

参数:

recurse (bool, 可选) – 如果为 True,则 TensorDict 中包含的每个张量也会被复制。 否则,只会复制 TensorDict 树结构。 默认为 True

注意

与其他许多操作(逐点算术、形状操作等)不同,clone 不会继承原始的锁属性。 这种设计选择是为了可以创建克隆并对其进行修改,这是最常见的用法。

compile(*args, **kwargs)

使用 torch.compile() 编译此模块的 forward 函数。

编译此模块的 __call__ 方法,并将所有参数原封不动地传递给 torch.compile()

有关此函数的参数的详细信息,请参阅 torch.compile()

complex128()

将所有张量转换为 torch.complex128

complex32()

将所有张量转换为 torch.complex32

complex64()

将所有张量转换为 torch.complex64

consolidate(filename: Optional[Union[Path, str]] = None, *, num_threads=0, device: Optional[device] = None, non_blocking: bool = False, inplace: bool = False, return_early: bool = False, use_buffer: bool = False, share_memory: bool = False, pin_memory: bool = False, metadata: bool = False) None

将 tensordict 内容整合到单个存储中,以便快速序列化。

参数:

filename (Path, 可选) – 用于内存映射张量的可选文件路径,用作 tensordict 的存储。

关键字参数:
  • num_threads (integer, 可选) – 用于填充存储的线程数。

  • device (torch.device, 可选) – 可选的设备,用于实例化存储。

  • non_blocking (bool, 可选) – 传递给 copy_()non_blocking 参数。

  • inplace (bool, 可选) – 如果为 True,则生成的 tensordict 与具有更新值的 self 相同。 默认为 False

  • return_early (bool, 可选) – 如果为 Truenum_threads>0,则该方法将返回 tensordict 的 future 对象。 可以使用 future.result() 查询生成的 tensordict。

  • use_buffer (bool, 可选) – 如果为 True 并且传递了文件名,则将在共享内存中创建一个中间本地缓冲区,并且数据将在最后一步复制到存储位置。 这可能比直接写入远程物理内存(例如,NFS)更快。 默认为 False

  • share_memory (bool, 可选) – 如果为 True,则存储将放置在共享内存中。 默认为 False

  • pin_memory (bool, 可选) – 是否应将整合的数据放置在 pinned 内存中。 默认为 False

  • metadata (bool, 可选) – 如果为 True,则元数据将与公共存储一起存储。 如果提供了文件名,则无效。 当需要控制序列化的实现方式时,存储元数据可能很有用,因为如果元数据可用或不可用,TensorDict 以不同的方式处理整合的 TD 的 pickle/unpickle。

注意

如果 tensordict 已经整合,则所有参数都将被忽略并返回 self。 调用 contiguous() 重新整合。

示例

>>> import pickle
>>> import tempfile
>>> import torch
>>> import tqdm
>>> from torch.utils.benchmark import Timer
>>> from tensordict import TensorDict
>>> data = TensorDict({"a": torch.zeros(()), "b": {"c": torch.zeros(())}})
>>> data_consolidated = data.consolidate()
>>> # check that the data has a single data_ptr()
>>> assert torch.tensor([
...     v.untyped_storage().data_ptr() for v in data_c.values(True, True)
... ]).unique().numel() == 1
>>> # Serializing the tensordict will be faster with data_consolidated
>>> with open("data.pickle", "wb") as f:
...    print("regular", Timer("pickle.dump(data, f)", globals=globals()).adaptive_autorange())
>>> with open("data_c.pickle", "wb") as f:
...     print("consolidated", Timer("pickle.dump(data_consolidated, f)", globals=globals()).adaptive_autorange())
contiguous(*args, **kwargs)

返回具有连续值的相同类型的新 tensordict(如果值已连续,则返回 self)。

copy()

返回 tensordict 的浅拷贝(即,复制结构但不复制数据)。

等效于 TensorDictBase.clone(recurse=False)

copy_(tensordict: T, non_blocking: bool = None) T

请参阅 TensorDictBase.update_

non-blocking 参数将被忽略,仅为了与 torch.Tensor.copy_() 兼容而存在。

copy_at_(tensordict: T, idx: Union[None, int, slice, str, Tensor, List[Any], Tuple[Any, ...]], non_blocking: bool = False) T

请参阅 TensorDictBase.update_at_

cos() T

计算 TensorDict 中每个元素的 cos() 值。

cos_() T

就地计算 TensorDict 中每个元素的 cos() 值。

cosh() T

计算 TensorDict 中每个元素的 cosh() 值。

cosh_() T

就地计算 TensorDict 中每个元素的 cosh() 值。

cpu()

将 tensordict 转换为 CPU。

此函数还支持 to() 的所有关键字参数。

create_nested(key)

创建与当前 tensordict 具有相同形状、设备和维度名称的嵌套 tensordict。

如果该值已存在,此操作会将其覆盖。此操作在锁定的 tensordict 中被阻止。

示例

>>> data = TensorDict({}, [3, 4, 5])
>>> data.create_nested("root")
>>> data.create_nested(("some", "nested", "value"))
>>> print(data)
TensorDict(
    fields={
        root: TensorDict(
            fields={
            },
            batch_size=torch.Size([3, 4, 5]),
            device=None,
            is_shared=False),
        some: TensorDict(
            fields={
                nested: TensorDict(
                    fields={
                        value: TensorDict(
                            fields={
                            },
                            batch_size=torch.Size([3, 4, 5]),
                            device=None,
                            is_shared=False)},
                    batch_size=torch.Size([3, 4, 5]),
                    device=None,
                    is_shared=False)},
            batch_size=torch.Size([3, 4, 5]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([3, 4, 5]),
    device=None,
    is_shared=False)
cuda(device=None)

将 tensordict 转换为 cuda 设备(如果尚未在其上)。

参数:

device (int, 可选) – 如果提供,则为应该转换 tensor 的 cuda 设备。

此函数还支持 to() 的所有关键字参数。

cummax(dim: int, *, reduce: Optional[bool] = None, return_indices: bool = True) tensordict.base.TensorDictBase | torch.Tensor

返回输入 tensordict 中所有元素的累积最大值。

参数:

dim (int) – 表示执行 cummax 操作的维度的整数。

关键字参数:
  • reduce (bool, 可选) – 如果为 True,则将在所有 TensorDict 值上进行规约,并返回单个规约后的 tensor。默认为 False

  • return_argmins (bool, 可选) – 当传递 dim 参数时,cummax() 返回一个具有 values 和 indices 的命名元组。 等效的 TensorDict 是返回一个 tensorclass,其中包含具有相同结构的 "values""indices" 条目。默认为 True

示例

>>> from tensordict import TensorDict
>>> import torch
>>> td = TensorDict(
...     a=torch.randn(3, 4, 5),
...     b=TensorDict(
...         c=torch.randn(3, 4, 5, 6),
...         d=torch.randn(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.cummax(dim=0)
cummax(
    indices=TensorDict(
        fields={
            a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.int64, is_shared=False),
            b: TensorDict(
                fields={
                    c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.int64, is_shared=False),
                    d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.int64, is_shared=False)},
                batch_size=torch.Size([4]),
                device=None,
                is_shared=False)},
        batch_size=torch.Size([4]),
        device=None,
        is_shared=False),
    vals=TensorDict(
        fields={
            a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
            b: TensorDict(
                fields={
                    c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False),
                    d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
                batch_size=torch.Size([4]),
                device=None,
                is_shared=False)},
        batch_size=torch.Size([4]),
        device=None,
        is_shared=False),
    batch_size=torch.Size([4]),
    device=None,
    is_shared=False)
>>> td = TensorDict(
...     a=torch.randn(3, 4, 5),
...     b=TensorDict(
...         c=torch.randn(3, 4, 5),
...         d=torch.randn(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.cummax(reduce=True, dim=0)
torch.return_types.cummax(...)
cummin(dim: int, *, reduce: Optional[bool] = None, return_indices: bool = True) tensordict.base.TensorDictBase | torch.Tensor

返回输入 tensordict 中所有元素的累积最小值。

参数:

dim (int) – 表示执行 cummin 操作的维度的整数。

关键字参数:
  • reduce (bool, 可选) – 如果为 True,则将在所有 TensorDict 值上进行规约,并返回单个规约后的 tensor。默认为 False

  • return_argmins (bool, 可选) – 当传递 dim 参数时,cummin() 返回一个具有 values 和 indices 的命名元组。 等效的 TensorDict 是返回一个 tensorclass,其中包含具有相同结构的 "values""indices" 条目。默认为 True

示例

>>> from tensordict import TensorDict
>>> import torch
>>> td = TensorDict(
...     a=torch.randn(3, 4, 5),
...     b=TensorDict(
...         c=torch.randn(3, 4, 5, 6),
...         d=torch.randn(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.cummin(dim=0)
cummin(
    indices=TensorDict(
        fields={
            a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.int64, is_shared=False),
            b: TensorDict(
                fields={
                    c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.int64, is_shared=False),
                    d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.int64, is_shared=False)},
                batch_size=torch.Size([4]),
                device=None,
                is_shared=False)},
        batch_size=torch.Size([4]),
        device=None,
        is_shared=False),
    vals=TensorDict(
        fields={
            a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
            b: TensorDict(
                fields={
                    c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False),
                    d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
                batch_size=torch.Size([4]),
                device=None,
                is_shared=False)},
        batch_size=torch.Size([4]),
        device=None,
        is_shared=False),
    batch_size=torch.Size([4]),
    device=None,
    is_shared=False)
>>> td = TensorDict(
...     a=torch.randn(3, 4, 5),
...     b=TensorDict(
...         c=torch.randn(3, 4, 5),
...         d=torch.randn(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.cummin(reduce=True, dim=0)
torch.return_types.cummin(...)
property data

返回一个 tensordict,其中包含叶张量的 .data 属性。

data_ptr(*, storage: bool = False)

返回 tensordict 叶子的 data_ptr。

这可以用于检查两个 tensordict 是否共享相同的 data_ptr()

关键字参数:

storage (bool, 可选) – 如果 True,将调用 tensor.untyped_storage().data_ptr()。默认为 False

示例

>>> from tensordict import TensorDict
>>> td = TensorDict(a=torch.randn(2), b=torch.randn(2), batch_size=[2])
>>> assert (td0.data_ptr() == td.data_ptr()).all()

注意

LazyStackedTensorDict 实例将显示为嵌套的 tensordict,以反映其叶节点的真实 data_ptr()

>>> td0 = TensorDict(a=torch.randn(2), b=torch.randn(2), batch_size=[2])
>>> td1 = TensorDict(a=torch.randn(2), b=torch.randn(2), batch_size=[2])
>>> td = TensorDict.lazy_stack([td0, td1])
>>> td.data_ptr()
TensorDict(
    fields={
        0: TensorDict(
            fields={
                a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False),
                b: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)},
            batch_size=torch.Size([]),
            device=cpu,
            is_shared=False),
        1: TensorDict(
            fields={
                a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False),
                b: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)},
            batch_size=torch.Size([]),
            device=cpu,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=cpu,
    is_shared=False)
del_(*args, **kwargs)

删除 tensordict 的键。

参数:

key (NestedKey) – 要删除的键

返回值:

self

densify(layout: layout = torch.strided)

尝试使用连续张量(普通张量或嵌套张量)表示延迟堆栈。

关键字参数:

layout (torch.layout) – 嵌套张量的布局(如果有)。默认为 strided

property depth: int

返回 tensordict 的深度 - 最大层数。

最小深度为 0(没有嵌套的 tensordict)。

detach() T

分离 tensordict 中的张量。

返回值:

一个新的 tensordict,其中没有需要梯度的张量。

detach_(*args, **kwargs)

就地分离 tensordict 中的张量。

返回值:

self.

property device

TensorDict 的设备。

如果 TensorDict 具有指定的设备,则其所有张量(包括嵌套张量)必须位于同一设备上。 如果 TensorDict 设备为 None,则不同的值可以位于不同的设备上。

返回值:

torch.device 对象,指示张量所在的设备,如果 TensorDict 没有设备,则为 None。

示例

>>> td = TensorDict({
...     "cpu": torch.randn(3, device='cpu'),
...     "cuda": torch.randn(3, device='cuda'),
... }, batch_size=[], device=None)
>>> td['cpu'].device
device(type='cpu')
>>> td['cuda'].device
device(type='cuda')
>>> td = TensorDict({
...     "x": torch.randn(3, device='cpu'),
...     "y": torch.randn(3, device='cuda'),
... }, batch_size=[], device='cuda')
>>> td['x'].device
device(type='cuda')
>>> td['y'].device
device(type='cuda')
>>> td = TensorDict({
...     "x": torch.randn(3, device='cpu'),
...     "y": TensorDict({'z': torch.randn(3, device='cpu')}, batch_size=[], device=None),
... }, batch_size=[], device='cuda')
>>> td['x'].device
device(type='cuda')
>>> td['y'].device # nested tensordicts are also mapped onto the appropriate device.
device(type='cuda')
>>> td['y', 'x'].device
device(type='cuda')
dim() int

参见 batch_dims()

div(other: tensordict.base.TensorDictBase | torch.Tensor, *, default: str | torch.Tensor | None = None) T

将输入 self 的每个元素除以 other 的相应元素。

\[\text{out}_i = \frac{\text{input}_i}{\text{other}_i}\]

支持广播、类型提升以及整数、浮点数、tensordict 或张量输入。 始终将整数类型提升为默认标量类型。

参数:

other (TensorDict, TensorNumber) – 除数。

关键字参数:

default (torch.Tensorstr, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递 default="intersection",则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default 将用于操作两侧所有缺失的条目。

div_(other: tensordict.base.TensorDictBase | torch.Tensor) T

div() 的就地版本。

注意

就地 div 不支持 default 关键字参数。

double()

将所有张量转换为 torch.bool 类型。

property dtype

返回 tensordict 中值的 dtype(如果它是唯一的)。

dumps(prefix: Optional[str] = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False) T

将 tensordict 保存到磁盘。

此函数是 memmap() 的代理。

empty(recurse=False, *, batch_size=None, device=_NoDefault.ZERO, names=None) T

返回一个新的,空的 tensordict,具有相同的设备和批量大小。

参数:

recurse (bool, optional) – 如果 True,则会复制 TensorDict 的整个结构,但不包含内容。 否则,只会复制根节点。 默认为 False

关键字参数:
  • batch_size (torch.Size, optional) – tensordict 的新批量大小。

  • device (torch.device, optional) – 新设备。

  • names (字符串列表, optional) – 维度名称。

entry_class(*args, **kwargs)

返回条目的类,可能避免调用 isinstance(td.get(key), type)

只要 get() 的执行成本很高,就应优先使用此方法,而不是 tensordict.get(key).shape

erf() T

计算 TensorDict 中每个元素的 erf() 值。

erf_() T

就地计算 TensorDict 中每个元素的 erf() 值。

erfc() T

计算 TensorDict 中每个元素的 erfc() 值。

erfc_() T

就地计算 TensorDict 中每个元素的 erfc() 值。

eval() T

将模块设置为评估模式。

这仅对某些模块有效。 有关其在训练/评估模式下的行为的详细信息(即,它们是否受到影响),请参阅特定模块的文档,例如 DropoutBatchNorm 等。

这等效于 self.train(False)

有关 .eval() 与可能与其混淆的几种类似机制的比较,请参阅 本地禁用梯度计算

返回值:

self

返回类型:

模块

exclude(*keys: NestedKey, inplace: bool = False) T

排除 tensordict 的键,并返回一个不包含这些条目的新 tensordict。

这些值不会被复制:就地修改原始或新 tensordict 的张量会导致两个 tensordict 都发生更改。

参数:
  • *keys (str) – 要排除的键。

  • inplace (bool) – 如果为 True,则就地修剪 tensordict。 默认为 False

返回值:

一个新的 tensordict(如果 inplace=True 则为同一个)不包含排除的条目。

示例

>>> from tensordict import TensorDict
>>> td = TensorDict({"a": 0, "b": {"c": 1, "d": 2}}, [])
>>> td.exclude("a", ("b", "c"))
TensorDict(
    fields={
        b: TensorDict(
            fields={
                d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> td.exclude("a", "b")
TensorDict(
    fields={
    },
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
exp() T

计算 TensorDict 中每个元素的 exp() 值。

exp_() T

就地计算 TensorDict 中每个元素的 exp() 值。

expand(*args, **kwargs) T

根据 expand() 函数展开 tensordict 的每个张量,忽略特征维度。

支持使用可迭代对象来指定形状。

示例

>>> td = TensorDict({
...     'a': torch.zeros(3, 4, 5),
...     'b': torch.zeros(3, 4, 10)}, batch_size=[3, 4])
>>> td_expand = td.expand(10, 3, 4)
>>> assert td_expand.shape == torch.Size([10, 3, 4])
>>> assert td_expand.get("a").shape == torch.Size([10, 3, 4, 5])
expand_as(other: tensordict.base.TensorDictBase | torch.Tensor) TensorDictBase

将 tensordict 的形状广播到 other 的形状,并相应地展开它。

如果输入是张量集合(tensordict 或 tensorclass),则叶子将以一对一的基础进行扩展。

示例

>>> from tensordict import TensorDict
>>> import torch
>>> td0 = TensorDict({
...     "a": torch.ones(3, 1, 4),
...     "b": {"c": torch.ones(3, 2, 1, 4)}},
...     batch_size=[3],
... )
>>> td1 = TensorDict({
...     "a": torch.zeros(2, 3, 5, 4),
...     "b": {"c": torch.zeros(2, 3, 2, 6, 4)}},
...     batch_size=[2, 3],
... )
>>> expanded = td0.expand_as(td1)
>>> assert (expanded==1).all()
>>> print(expanded)
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([2, 3, 5, 4]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([2, 3, 2, 6, 4]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([2, 3]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([2, 3]),
    device=None,
    is_shared=False)
expm1() T

计算 TensorDict 中每个元素的 expm1() 值。

expm1_() T

就地计算 TensorDict 中每个元素的 expm1() 值。

extra_repr() str

返回模块的额外表示。

要打印自定义的额外信息,您应该在自己的模块中重新实现此方法。 单行和多行字符串都是可以接受的。

fill_(key: NestedKey, value: float | bool) T

用给定的标量值填充键指向的张量。

参数:
  • key (str嵌套键) – 要填充的条目。

  • value (数字bool) – 用于填充的值。

返回值:

self

filter_empty_()

就地过滤掉所有空的 tensordict。

filter_non_tensor_data() T

过滤掉所有非张量数据。

flatten(start_dim=0, end_dim=- 1)

扁平化 tensordict 的所有张量。

参数:
  • start_dim (int) – 要扁平化的第一个维度

  • end_dim (int) – 要扁平化的最后一个维度

示例

>>> td = TensorDict({
...     "a": torch.arange(60).view(3, 4, 5),
...     "b": torch.arange(12).view(3, 4)}, batch_size=[3, 4])
>>> td_flat = td.flatten(0, 1)
>>> td_flat.batch_size
torch.Size([12])
>>> td_flat["a"]
tensor([[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19],
        [20, 21, 22, 23, 24],
        [25, 26, 27, 28, 29],
        [30, 31, 32, 33, 34],
        [35, 36, 37, 38, 39],
        [40, 41, 42, 43, 44],
        [45, 46, 47, 48, 49],
        [50, 51, 52, 53, 54],
        [55, 56, 57, 58, 59]])
>>> td_flat["b"]
tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
flatten_keys(separator: str = '.', inplace: bool = False) TensorDictBase

递归地将嵌套的 tensordict 转换为扁平的 tensordict。

TensorDict 类型将会丢失,结果将会是一个简单的 TensorDict 实例。

参数:
  • separator (str, optional) – 嵌套项之间的分隔符。默认为 '.'

  • inplace (bool, optional) – 如果 True,则结果 tensordict 将与调用它的 tensordict 具有相同的标识。默认为 False

  • is_leaf (callable, optional) –

    一个可调用对象,接受一个类类型作为参数,返回一个布尔值,指示该类是否应被视为叶节点。

    注意

    is_leaf 的目的不是阻止对嵌套 tensordict 的递归调用,而是将某些类型标记为“叶节点”,以便在 leaves_only=True 时进行过滤。 即使 is_leaf(cls) 返回 True,如果 include_nested=True,tensordict 的嵌套结构仍将被遍历。 换句话说,is_leaf 不控制递归深度,而是提供了一种在 leaves_only=True 时从结果中过滤掉某些类型的方法。 这意味着树中的一个节点可以既是叶节点,又是带有子节点的节点。 实际上,is_leaf 的默认值会将 tensordict 和 tensorclass 实例从叶节点集中排除。

示例

>>> data = TensorDict({"a": 1, ("b", "c"): 2, ("e", "f", "g"): 3}, batch_size=[])
>>> data.flatten_keys(separator=" - ")
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False),
        b - c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False),
        e - f - g: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)

此方法和 unflatten_keys() 在处理 state-dicts 时特别有用,因为它们可以无缝地将扁平字典转换为模仿模型结构的数据结构。

示例

>>> model = torch.nn.Sequential(torch.nn.Linear(3 ,4))
>>> ddp_model = torch.ao.quantization.QuantWrapper(model)
>>> state_dict = TensorDict(ddp_model.state_dict(), batch_size=[]).unflatten_keys(".")
>>> print(state_dict)
TensorDict(
    fields={
        module: TensorDict(
            fields={
                0: TensorDict(
                    fields={
                        bias: Tensor(shape=torch.Size([4]), device=cpu, dtype=torch.float32, is_shared=False),
                        weight: Tensor(shape=torch.Size([4, 3]), device=cpu, dtype=torch.float32, is_shared=False)},
                    batch_size=torch.Size([]),
                    device=None,
                    is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> model_state_dict = state_dict.get("module")
>>> print(model_state_dict)
TensorDict(
    fields={
        0: TensorDict(
            fields={
                bias: Tensor(shape=torch.Size([4]), device=cpu, dtype=torch.float32, is_shared=False),
                weight: Tensor(shape=torch.Size([4, 3]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> model.load_state_dict(dict(model_state_dict.flatten_keys(".")))
float()

将所有张量转换为 torch.float

float16()

将所有张量转换为 torch.float16

float32()

将所有张量转换为 torch.float32

float64()

将所有张量转换为 torch.float64

floor() T

计算 TensorDict 中每个元素的 floor() 值。

floor_() T

原地计算 TensorDict 中每个元素的 floor() 值。

forward(*input: Any) None

定义每次调用时执行的计算。

应由所有子类重写。

注意

尽管需要在该函数中定义前向传递的配方,但之后应调用 Module 实例而不是此函数,因为前者负责运行注册的钩子,而后者会默默地忽略它们。

frac() T

计算 TensorDict 中每个元素的 frac() 值。

frac_() T

原地计算 TensorDict 中每个元素的 frac() 值。

classmethod from_any(obj, *, auto_batch_size: bool = False, batch_dims: Optional[int] = None, device: Optional[device] = None, batch_size: Optional[Size] = None)

递归地将任何对象转换为 TensorDict。

注意

from_any 比常规 TensorDict 构造函数的限制更少。 它可以利用自定义启发式方法将 dataclasses 或 tuples 等数据结构转换为 tensordict。 这种方法可能会产生一些额外的开销,并且在映射策略方面涉及更多主观选择。

注意

此方法递归地将输入对象转换为 TensorDict。 如果对象已经是 TensorDict(或任何类似的张量集合对象),它将按原样返回。

参数:

obj – 要转换的对象。

关键字参数:
  • auto_batch_size (bool, optional) – 如果 True,将自动计算批次大小。 默认为 False

  • batch_dims (int, optional) – 如果 auto_batch_size 为 True,则定义输出 tensordict 应具有的维度数。 默认为 None(每个级别的完整批次大小)。

  • device (torch.device, optional) – TensorDict 将被创建在其上的设备。 (可选)

  • batch_size (torch.Size, optional) – TensorDict 的批量大小。与 auto_batch_size 互斥。(可选)

返回值:

输入对象的 TensorDict 表示。

支持的对象

classmethod from_dataclass(dataclass, *, auto_batch_size: bool = False, batch_dims: Optional[int] = None, as_tensorclass: bool = False, device: Optional[device] = None, batch_size: Optional[Size] = None)

将 dataclass 转换为 TensorDict 实例。

参数:

dataclass – 要转换的 dataclass 实例。

关键字参数:
  • auto_batch_size (bool, optional) – 如果为 True,自动确定并将批量大小应用于生成的 TensorDict。默认为 False。(可选)

  • batch_dims (int, optional) – 如果 auto_batch_sizeTrue,则定义输出 tensordict 应具有的维度数。默认为 None (每一级的完整批量大小)。 (可选)

  • as_tensorclass (bool, optional) – 如果为 True,则将转换委托给自由函数 from_dataclass() 并返回一个 tensor 兼容的类 (tensorclass()) 或实例,而不是 TensorDict。默认为 False。(可选)

  • device (torch.device, optional) – TensorDict 将被创建在其上的设备。默认为 None。(可选)

  • batch_size (torch.Size, optional) – TensorDict 的批量大小。默认为 None。(可选)

返回值:

从提供的 dataclass 派生的 TensorDict 实例,除非 as_tensorclass 为 True,在这种情况下,将返回 tensor 兼容的类或实例。

引发:

TypeError – 如果提供的输入不是 dataclass 实例。

警告

此方法与自由函数 from_dataclass 不同,并且用途不同。虽然自由函数返回一个 tensor 兼容的类或实例,但此方法返回一个 TensorDict 实例。

classmethod from_dict(*args, **kwargs)

返回从字典或另一个 TensorDict 创建的 TensorDict。

如果未指定 batch_size,则返回可能的最大批量大小。

此函数也适用于嵌套字典,或者可用于确定嵌套 tensordict 的批量大小。

参数:

input_dict (dictionary, optional) – 要用作数据源的字典(兼容嵌套键)。(可选)

关键字参数:
  • auto_batch_size (bool, optional) – 如果 True,将自动计算批次大小。 默认为 False

  • batch_size (iterable of int, optional) – tensordict 的批量大小。(可选)

  • device (torch.device or compatible type, optional) – TensorDict 的设备。(可选)

  • batch_dims (int, optional) – batch_dims (即要考虑为 batch_size 的前导维度数)。与 batch_size 互斥。请注意,这是 tensordict 的 __最大__ 批量维度数,允许更小的数字。(可选)

  • names (list of str, optional) – tensordict 的维度名称列表。(可选)

示例

>>> input_dict = {"a": torch.randn(3, 4), "b": torch.randn(3)}
>>> print(TensorDict.from_dict(input_dict))
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False),
        b: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False)},
    batch_size=torch.Size([3]),
    device=None,
    is_shared=False)
>>> # nested dict: the nested TensorDict can have a different batch-size
>>> # as long as its leading dims match.
>>> input_dict = {"a": torch.randn(3), "b": {"c": torch.randn(3, 4)}}
>>> print(TensorDict.from_dict(input_dict))
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([3, 4]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([3]),
    device=None,
    is_shared=False)
>>> # we can also use this to work out the batch sie of a tensordict
>>> input_td = TensorDict({"a": torch.randn(3), "b": {"c": torch.randn(3, 4)}}, [])
>>> print(TensorDict.from_dict(input_td))
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([3, 4]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([3]),
    device=None,
    is_shared=False)
from_dict_instance(input_dict, *, auto_batch_size: bool = False, batch_size=None, device=None, batch_dims=None)

from_dict() 的实例方法版本。

from_dict() 不同,此方法将尝试保持现有树中的 tensordict 类型(对于任何现有叶)。

示例

>>> from tensordict import TensorDict, tensorclass
>>> import torch
>>>
>>> @tensorclass
>>> class MyClass:
...     x: torch.Tensor
...     y: int
>>>
>>> td = TensorDict({"a": torch.randn(()), "b": MyClass(x=torch.zeros(()), y=1)})
>>> print(td.from_dict_instance(td.to_dict()))
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
        b: MyClass(
            x=Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
            y=Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False),
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> print(td.from_dict(td.to_dict()))
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                x: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
                y: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
classmethod from_h5(filename, *, mode: str = 'r', auto_batch_size: bool = False, batch_dims: Optional[int] = None, batch_size: Optional[Size] = None)

从 h5 文件创建 PersistentTensorDict。

参数:

filename (str) – h5 文件的路径。

关键字参数

mode (str, 可选): 读取模式。默认为 "r"。auto_batch_size (bool, 可选): 如果为 True,则自动计算批量大小。

默认为 False

batch_dims (int, 可选): 如果 auto_batch_size 为 True,则定义输出

tensordict 应该具有的维度数量。默认为 None(每个级别的完整批量大小)。

batch_size (torch.Size, 可选): TensorDict 的批量大小。默认为 None

返回值:

输入 h5 文件的 PersistentTensorDict 表示。

示例

>>> td = TensorDict.from_h5("path/to/file.h5")
>>> print(td)
PersistentTensorDict(
    fields={
        key1: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False),
        key2: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
classmethod from_module(module, as_module: bool = False, lock: bool = True, use_state_dict: bool = False)

将模块的参数和缓冲区复制到 tensordict 中。

参数:
  • module (nn.Module) – 要从中获取参数的模块。

  • as_module (bool, optional) – 如果为 True,将返回一个 TensorDictParams 实例,该实例可用于在 torch.nn.Module 中存储参数。默认为 False

  • lock (bool, optional) – 如果为 True,则生成的 tensordict 将被锁定。默认为 True

  • use_state_dict (bool, optional) –

    如果为 True,将使用模块的状态字典,并将其展开为具有模型树结构的 TensorDict。默认为 False

    注意

    当必须使用 state-dict 钩子时,这特别有用。

示例

>>> from torch import nn
>>> module = nn.TransformerDecoder(
...     decoder_layer=nn.TransformerDecoderLayer(nhead=4, d_model=4),
...     num_layers=1
... )
>>> params = TensorDict.from_module(module)
>>> print(params["layers", "0", "linear1"])
TensorDict(
    fields={
        bias: Parameter(shape=torch.Size([2048]), device=cpu, dtype=torch.float32, is_shared=False),
        weight: Parameter(shape=torch.Size([2048, 4]), device=cpu, dtype=torch.float32, is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
classmethod from_modules(*modules, as_module: bool = False, lock: bool = True, use_state_dict: bool = False, lazy_stack: bool = False, expand_identical: bool = False)

检索多个模块的参数,用于 ensebmle 学习/期望通过 vmap 的应用功能。

参数:

modules (nn.Module 的序列) – 要从中获取参数的模块。如果模块的结构不同,则需要一个延迟堆叠(请参阅下面的 lazy_stack 参数)。

关键字参数:
  • as_module (bool, optional) – 如果为 True,将返回一个 TensorDictParams 实例,该实例可用于在 torch.nn.Module 中存储参数。默认为 False

  • lock (bool, optional) – 如果为 True,则生成的 tensordict 将被锁定。默认为 True

  • use_state_dict (bool, optional) –

    如果为 True,将使用模块的状态字典,并将其展开为具有模型树结构的 TensorDict。默认为 False

    注意

    当必须使用 state-dict 钩子时,这特别有用。

  • lazy_stack (bool, optional) –

    参数应该密集堆叠还是延迟堆叠。默认为 False(密集堆叠)。

    注意

    lazy_stackas_module 是互斥的功能。

    警告

    延迟输出和非延迟输出之间存在一个关键区别,即非延迟输出将使用所需的批量大小重新实例化参数,而 lazy_stack 将仅将参数表示为延迟堆叠。这意味着虽然原始参数可以在 lazy_stack=True 时安全地传递给优化器,但当设置为 True 时,需要传递新参数。

    警告

    虽然使用延迟堆叠来保持原始参数引用可能很诱人,但请记住,每次调用 get() 时,延迟堆叠都会执行堆叠。这将需要内存(参数大小的 N 倍,如果构建图形则更多)和时间来计算。这也意味着优化器将包含更多参数,并且像 step()zero_grad() 这样的操作将需要更长时间才能执行。一般来说,lazy_stack 应该保留给极少数用例。

  • expand_identical (bool, optional) – 如果 True 并且相同的参数(相同的标识)正在堆叠到自身,则将返回此参数的扩展版本。当 lazy_stack=True 时,将忽略此参数。

示例

>>> from torch import nn
>>> from tensordict import TensorDict
>>> torch.manual_seed(0)
>>> empty_module = nn.Linear(3, 4, device="meta")
>>> n_models = 2
>>> modules = [nn.Linear(3, 4) for _ in range(n_models)]
>>> params = TensorDict.from_modules(*modules)
>>> print(params)
TensorDict(
    fields={
        bias: Parameter(shape=torch.Size([2, 4]), device=cpu, dtype=torch.float32, is_shared=False),
        weight: Parameter(shape=torch.Size([2, 4, 3]), device=cpu, dtype=torch.float32, is_shared=False)},
    batch_size=torch.Size([2]),
    device=None,
    is_shared=False)
>>> # example of batch execution
>>> def exec_module(params, x):
...     with params.to_module(empty_module):
...         return empty_module(x)
>>> x = torch.randn(3)
>>> y = torch.vmap(exec_module, (0, None))(params, x)
>>> assert y.shape == (n_models, 4)
>>> # since lazy_stack = False, backprop leaves the original params untouched
>>> y.sum().backward()
>>> assert params["weight"].grad.norm() > 0
>>> assert modules[0].weight.grad is None

使用 lazy_stack=True 时,情况略有不同

>>> params = TensorDict.from_modules(*modules, lazy_stack=True)
>>> print(params)
LazyStackedTensorDict(
    fields={
        bias: Tensor(shape=torch.Size([2, 4]), device=cpu, dtype=torch.float32, is_shared=False),
        weight: Tensor(shape=torch.Size([2, 4, 3]), device=cpu, dtype=torch.float32, is_shared=False)},
    exclusive_fields={
    },
    batch_size=torch.Size([2]),
    device=None,
    is_shared=False,
    stack_dim=0)
>>> # example of batch execution
>>> y = torch.vmap(exec_module, (0, None))(params, x)
>>> assert y.shape == (n_models, 4)
>>> y.sum().backward()
>>> assert modules[0].weight.grad is not None
classmethod from_namedtuple(named_tuple, *, auto_batch_size: bool = False, batch_dims: Optional[int] = None, device: Optional[device] = None, batch_size: Optional[Size] = None)

递归地将一个 namedtuple 转换为 TensorDict。

参数:

named_tuple – 要转换的 namedtuple 实例。

关键字参数:
  • auto_batch_size (bool, optional) – 如果 True,将自动计算批次大小。 默认为 False

  • batch_dims (int, optional) – 如果 auto_batch_sizeTrue,则定义输出 tensordict 应具有的维度数。默认为 None (每一级的完整批量大小)。 (可选)

  • device (torch.device, optional) – TensorDict 将被创建在其上的设备。默认为 None。(可选)

  • batch_size (torch.Size, optional) – TensorDict 的批量大小。默认为 None。(可选)

返回值:

输入 namedtuple 的 TensorDict 表示。

示例

>>> from tensordict import TensorDict
>>> import torch
>>> data = TensorDict({
...     "a_tensor": torch.zeros((3)),
...     "nested": {"a_tensor": torch.zeros((3)), "a_string": "zero!"}}, [3])
>>> nt = data.to_namedtuple()
>>> print(nt)
GenericDict(a_tensor=tensor([0., 0., 0.]), nested=GenericDict(a_tensor=tensor([0., 0., 0.]), a_string='zero!'))
>>> TensorDict.from_namedtuple(nt, auto_batch_size=True)
TensorDict(
    fields={
        a_tensor: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False),
        nested: TensorDict(
            fields={
                a_string: NonTensorData(data=zero!, batch_size=torch.Size([3]), device=None),
                a_tensor: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([3]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([3]),
    device=None,
    is_shared=False)
classmethod from_pytree(pytree, *, batch_size: Optional[Size] = None, auto_batch_size: bool = False, batch_dims: Optional[int] = None)

将一个 pytree 转换为 TensorDict 实例。

该方法旨在尽可能保留 pytree 的嵌套结构。

添加额外的非 tensor 键来跟踪每个级别的标识,提供了一个内置的 pytree 到 tensordict 的双射变换 API。

当前接受的类包括列表、元组、命名元组和字典。

注意

对于字典,非 NestedKey 键会单独注册为 NonTensorData 实例。

注意

可转换为 Tensor 的类型(例如 int、float 或 np.ndarray)将被转换为 torch.Tensor 实例。 请注意,此转换是满射的:将 tensordict 转换回 pytree 将无法恢复原始类型。

示例

>>> # Create a pytree with tensor leaves, and one "weird"-looking dict key
>>> class WeirdLookingClass:
...     pass
...
>>> weird_key = WeirdLookingClass()
>>> # Make a pytree with tuple, lists, dict and namedtuple
>>> pytree = (
...     [torch.randint(10, (3,)), torch.zeros(2)],
...     {
...         "tensor": torch.randn(
...             2,
...         ),
...         "td": TensorDict({"one": 1}),
...         weird_key: torch.randint(10, (2,)),
...         "list": [1, 2, 3],
...     },
...     {"named_tuple": TensorDict({"two": torch.ones(1) * 2}).to_namedtuple()},
... )
>>> # Build a TensorDict from that pytree
>>> td = TensorDict.from_pytree(pytree)
>>> # Recover the pytree
>>> pytree_recon = td.to_pytree()
>>> # Check that the leaves match
>>> def check(v1, v2):
>>>     assert (v1 == v2).all()
>>>
>>> torch.utils._pytree.tree_map(check, pytree, pytree_recon)
>>> assert weird_key in pytree_recon[1]
classmethod from_struct_array(struct_array: ndarray, *, auto_batch_size: bool = False, batch_dims: Optional[int] = None, device: Optional[device] = None, batch_size: Optional[Size] = None) T

将结构化的 numpy 数组转换为 TensorDict。

生成的 TensorDict 将与 numpy 数组共享相同的内存内容(这是一个零拷贝操作)。就地更改结构化的 numpy 数组的值将影响 TensorDict 的内容。

注意

此方法执行零拷贝操作,这意味着生成的 TensorDict 将与输入 numpy 数组共享相同的内存内容。因此,就地更改 numpy 数组的值将影响 TensorDict 的内容。

参数:

struct_array (np.ndarray) – 要转换的结构化的 numpy 数组。

关键字参数:
  • auto_batch_size (bool, 可选) – 如果为 True,则会自动计算批量大小。默认为 False

  • batch_dims (int, optional) – 如果 auto_batch_sizeTrue,则定义输出 tensordict 应具有的维度数。默认为 None (每一级的完整批量大小)。 (可选)

  • device (torch.device, 可选) –

    TensorDict 将在其上创建的设备。默认为 None

    注意

    更改设备(即,指定任何非 None"cpu" 的设备)将传输数据,从而导致返回的数据的内存位置发生更改。

  • batch_size (torch.Size, 可选) – TensorDict 的批量大小。默认为 None。

返回值:

输入结构化的 numpy 数组的 TensorDict 表示。

示例

>>> x = np.array(
...     [("Rex", 9, 81.0), ("Fido", 3, 27.0)],
...     dtype=[("name", "U10"), ("age", "i4"), ("weight", "f4")],
... )
>>> td = TensorDict.from_struct_array(x)
>>> x_recon = td.to_struct_array()
>>> assert (x_recon == x).all()
>>> assert x_recon.shape == x.shape
>>> # Try modifying x age field and check effect on td
>>> x["age"] += 1
>>> assert (td["age"] == np.array([10, 4])).all()
classmethod from_tuple(obj, *, auto_batch_size: bool = False, batch_dims: Optional[int] = None, device: Optional[device] = None, batch_size: Optional[Size] = None)

将一个元组转换为 TensorDict。

参数:

obj – 要转换的元组实例。

关键字参数:
  • auto_batch_size (bool, 可选) – 如果为 True,则会自动计算批量大小。默认为 False

  • batch_dims (int, optional) – 如果 auto_batch_size 为 True,则定义输出 tensordict 应具有的维度数。 默认为 None(每个级别的完整批次大小)。

  • device (torch.device, optional) – TensorDict 将被创建在其上的设备。默认为 None。(可选)

  • batch_size (torch.Size, optional) – TensorDict 的批量大小。默认为 None。(可选)

返回值:

输入元组的 TensorDict 表示。

示例

>>> my_tuple = (1, 2, 3)
>>> td = TensorDict.from_tuple(my_tuple)
>>> print(td)
TensorDict(
    fields={
        0: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False),
        1: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False),
        2: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
classmethod fromkeys(keys: List[NestedKey], value: Any = 0)

从一个键列表和一个单独的值创建一个 tensordict。

参数:
  • keys (NestedKey 的列表) – 一个可迭代对象,指定新字典的键。

  • value (兼容的类型, 可选) – 所有键的值。默认为 0

gather(dim: int, index: Tensor, out: Optional[T] = None) T

沿着 dim 指定的轴收集值。

参数:
  • dim (int) – 收集元素的维度。

  • index (torch.Tensor) – 一个长整型张量,其维度数与 tensordict 的维度数匹配,且只有收集维度不同。它的元素是指沿所需维度收集的索引。

  • out (TensorDictBase, optional) – 一个目标 tensordict。它必须与索引具有相同的形状。

示例

>>> td = TensorDict(
...     {"a": torch.randn(3, 4, 5),
...      "b": TensorDict({"c": torch.zeros(3, 4, 5)}, [3, 4, 5])},
...     [3, 4])
>>> index = torch.randint(4, (3, 2))
>>> td_gather = td.gather(dim=1, index=index)
>>> print(td_gather)
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([3, 2, 5]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([3, 2, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([3, 2, 5]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([3, 2]),
    device=None,
    is_shared=False)

Gather 保留维度名称。

示例

>>> td.names = ["a", "b"]
>>> td_gather = td.gather(dim=1, index=index)
>>> td_gather.names
["a", "b"]
gather_and_stack(dst: int, group: 'torch.distributed.ProcessGroup' | None = None) T | None

从不同的工作进程收集 tensordict,并将它们堆叠到目标工作进程的 self 上。

参数:
  • dst (int) – 将调用 gather_and_stack() 的目标工作进程的秩。

  • group (torch.distributed.ProcessGroup, 可选) – 如果设置,将使用指定的进程组进行通信。否则,将使用默认进程组。默认为 None

示例

>>> from torch import multiprocessing as mp
>>> from tensordict import TensorDict
>>> import torch
>>>
>>> def client():
...     torch.distributed.init_process_group(
...         "gloo",
...         rank=1,
...         world_size=2,
...         init_method=f"tcp://localhost:10003",
...     )
...     # Create a single tensordict to be sent to server
...     td = TensorDict(
...         {("a", "b"): torch.randn(2),
...          "c": torch.randn(2)}, [2]
...     )
...     td.gather_and_stack(0)
...
>>> def server():
...     torch.distributed.init_process_group(
...         "gloo",
...         rank=0,
...         world_size=2,
...         init_method=f"tcp://localhost:10003",
...     )
...     # Creates the destination tensordict on server.
...     # The first dim must be equal to world_size-1
...     td = TensorDict(
...         {("a", "b"): torch.zeros(2),
...          "c": torch.zeros(2)}, [2]
...     ).expand(1, 2).contiguous()
...     td.gather_and_stack(0)
...     assert td["a", "b"] != 0
...     print("yuppie")
...
>>> if __name__ == "__main__":
...     mp.set_start_method("spawn")
...
...     main_worker = mp.Process(target=server)
...     secondary_worker = mp.Process(target=client)
...
...     main_worker.start()
...     secondary_worker.start()
...
...     main_worker.join()
...     secondary_worker.join()
get(key: NestedKey, default: Any = None) Tensor

获取与输入键存储的值。

参数:
  • key (str, str 的元组) – 要查询的键。如果是 str 的元组,则等效于链式调用 getattr。

  • default

    如果在 tensordict 中未找到键,则返回默认值。默认为 None

    警告

    以前,如果在 tensordict 中不存在某个键且没有传递默认值,则会引发 KeyError。从 v0.7 开始,此行为已更改,而是返回 None 值(与 dict.get 行为一致)。要采用旧的行为,请设置环境变量 export TD_GET_DEFAULTS_TO_NONE=’0’ 或调用 :func`~tensordict.set_get_defaults_to_none(False)`。

示例

>>> td = TensorDict({"x": 1}, batch_size=[])
>>> td.get("x")
tensor(1)
>>> td.get("y")
None
get_at(key: NestedKey, *args, **kwargs) Tensor

从键 key 在索引 idx 处获取 tensordict 的值。

参数:
  • key (str, str 的元组) – 要检索的键。

  • index (int, slice, torch.Tensor, iterable) – 张量的索引。

  • default (torch.Tensor) – 如果在 tensordict 中不存在该键,则返回默认值。

返回值:

索引张量。

示例

>>> td = TensorDict({"x": torch.arange(3)}, batch_size=[])
>>> td.get_at("x", index=1)
tensor(1)
get_buffer(target: str) Tensor

如果存在,则返回由 target 给出的缓冲区,否则抛出错误。

有关此方法的功能以及如何正确指定 target 的更详细说明,请参阅 get_submodule 的文档字符串。

参数:

target – 要查找的缓冲区的完全限定字符串名称。(有关如何指定完全限定字符串,请参阅 get_submodule。)

返回值:

target 引用的缓冲区

返回类型:

torch.Tensor

引发:

AttributeError – 如果目标字符串引用了无效路径或解析为非缓冲区的内容

get_extra_state() Any

返回要包含在模块的 state_dict 中的任何额外状态。

如果您需要存储额外的状态,请为此模块实现此方法和相应的 set_extra_state()。在构建模块的 state_dict() 时调用此函数。

请注意,额外状态应该是可 pickle 化的,以确保 state_dict 的工作序列化。我们仅提供序列化张量的向后兼容性保证;如果其序列化的 pickle 形式发生更改,其他对象可能会破坏向后兼容性。

返回值:

要存储在模块的 state_dict 中的任何额外状态

返回类型:

object

get_item_shape(key: NestedKey)

返回条目的形状,可能避免再次使用 get()

get_non_tensor(key: NestedKey, default=_NoDefault.ZERO)

获取非张量值(如果存在),或者在找不到非张量值时获取 default

此方法对于张量/TensorDict 值是稳健的,这意味着如果收集的值是常规张量,它也将被返回(尽管此方法带有一些开销,不应超出其自然范围使用)。

有关如何在 tensordict 中设置非张量值的更多信息,请参阅 set_non_tensor()

参数:
  • key (NestedKey) – NonTensorData 对象的位置。

  • default (Any, 可选) – 如果找不到键,则返回的值。

返回: tensordict.tensorclass.NonTensorData 的内容,

如果该条目不是 tensordict.tensorclass.NonTensorData 类型,则返回与 key 对应的条目(如果找不到该条目,则返回 default)。

示例

>>> data = TensorDict({}, batch_size=[])
>>> data.set_non_tensor(("nested", "the string"), "a string!")
>>> assert data.get_non_tensor(("nested", "the string")) == "a string!"
>>> # regular `get` works but returns a NonTensorData object
>>> data.get(("nested", "the string"))
NonTensorData(
    data='a string!',
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
get_parameter(target: str) Parameter

如果存在 target 指定的 parameter,则返回该 parameter,否则抛出错误。

有关此方法的功能以及如何正确指定 target 的更详细说明,请参阅 get_submodule 的文档字符串。

参数:

target – 要查找的 Parameter 的完整字符串名称。(有关如何指定完整字符串,请参阅 get_submodule。)

返回值:

target 引用的 Parameter

返回类型:

torch.nn.Parameter

引发:

AttributeError – 如果目标字符串引用了无效路径或解析为非 nn.Parameter 的对象,则引发此异常

get_submodule(target: str) Module

如果存在 target 指定的 submodule,则返回该 submodule,否则抛出错误。

例如,假设你有一个 nn.Module A,其结构如下:

A(
    (net_b): Module(
        (net_c): Module(
            (conv): Conv2d(16, 33, kernel_size=(3, 3), stride=(2, 2))
        )
        (linear): Linear(in_features=100, out_features=200, bias=True)
    )
)

(该图显示了一个 nn.Module AA 具有一个嵌套的 submodule net_b,它本身又有两个 submodule net_clinearnet_c 又有一个 submodule conv。)

要检查是否具有 linear submodule,我们将调用 get_submodule("net_b.linear")。 要检查是否具有 conv submodule,我们将调用 get_submodule("net_b.net_c.conv")

get_submodule 的运行时受 target 中 module 嵌套程度的限制。 对 named_modules 的查询可以实现相同的结果,但它在传递 module 的数量上是 O(N) 的。 因此,对于检查某些 submodule 是否存在的简单检查,应始终使用 get_submodule

参数:

target – 要查找的 submodule 的完整字符串名称。(有关如何指定完整字符串,请参阅上面的示例。)

返回值:

target 引用的 submodule

返回类型:

torch.nn.Module

引发:

AttributeError – 如果目标字符串产生的路径中的任何一点上的(子)路径解析为不存在的属性名称或不是 nn.Module 实例的对象,则会引发此异常。

property grad

返回一个 tensordict,其中包含叶 tensor 的 .grad 属性。

half()

将所有 tensor 转换为 torch.half

int()

将所有 tensor 转换为 torch.int

int16()

将所有 tensor 转换为 torch.int16

int32()

将所有 tensor 转换为 torch.int32

int64()

将所有 tensor 转换为 torch.int64

int8()

将所有 tensor 转换为 torch.int8

ipu(device: Optional[Union[int, device]] = None) T

将所有模型参数和缓冲区移动到 IPU。

这也会使关联的参数和缓冲区成为不同的对象。 因此,如果模块将在 IPU 上进行优化,则应在构建优化器之前调用此方法。

注意

此方法会就地修改模块。

参数:

device (int, optional) – 如果指定,所有参数都将复制到该设备

返回值:

self

返回类型:

模块

irecv(src: int, *, group: 'torch.distributed.ProcessGroup' | None = None, return_premature: bool = False, init_tag: int = 0, pseudo_rand: bool = False) tuple[int, list[torch.Future]] | list[torch.Future] | None

异步接收 tensordict 的内容并使用它更新内容。

有关上下文,请查看 isend() 方法中的示例。

参数:

src (int) – 源 worker 的排名。

关键字参数:
  • group (torch.distributed.ProcessGroup, 可选) – 如果设置,将使用指定的进程组进行通信。否则,将使用默认进程组。默认为 None

  • return_premature (bool) – 如果为 True,则返回一个 futures 列表,用于等待直到 tensordict 被更新。默认为 False,即在调用中等待直到更新完成。

  • init_tag (int) – 源 worker 使用的 init_tag

  • pseudo_rand (bool) – 如果为 True,则标签序列将是伪随机的,允许从不同节点发送多个数据而不会重叠。 请注意,生成这些伪随机数非常耗时(1e-5 秒/数字),这意味着它可能会降低算法的运行时。 该值必须与传递给 isend() 的值匹配。 默认为 False

返回值:

如果 return_premature=True,则为要等待的 futures 列表

直到 tensordict 被更新。

is_consolidated()

检查 TensorDict 是否具有 consolidated 存储。

is_contiguous(*args, **kwargs)

返回一个布尔值,指示所有张量是否都是连续的。

is_empty() bool

检查 tensordict 是否包含任何叶子节点。

property is_memmap: bool

检查 tensordict 是否为内存映射。

如果 TensorDict 实例是内存映射的,则它被锁定(条目无法重命名、删除或添加)。 如果使用都是内存映射的张量创建 TensorDict,这 __并不__ 意味着 is_memmap 将返回 True (因为新的张量可能是也可能不是内存映射的)。 只有当调用 tensordict.memmap_() 时,tensordict 才会被认为是内存映射的。

对于 CUDA 设备上的 tensordict,这始终为 True

property is_shared: bool

检查 tensordict 是否在共享内存中。

如果 TensorDict 实例在共享内存中,则它被锁定(条目无法重命名、删除或添加)。 如果使用都在共享内存中的张量创建 TensorDict,这 __并不__ 意味着 is_shared 将返回 True (因为新的张量可能是也可能不是在共享内存中)。 只有当调用 tensordict.share_memory_() 或将 tensordict 放置在默认情况下内容共享的设备上(例如,"cuda")时,tensordict 才会被认为是在共享内存中。

对于 CUDA 设备上的 tensordict,这始终为 True

isend(dst: int, *, group: 'torch.distributed.ProcessGroup' | None = None, init_tag: int = 0, pseudo_rand: bool = False) int

异步发送 tensordict 的内容。

参数:

dst (int) – 目标 worker 的 rank,内容应发送到该 worker。

关键字参数:
  • group (torch.distributed.ProcessGroup, 可选) – 如果设置,将使用指定的进程组进行通信。否则,将使用默认进程组。默认为 None

  • init_tag (int) – 用于标记张量的初始标签。 请注意,它将增加 TensorDict 中包含的张量数量。

  • pseudo_rand (bool) – 如果为 True,则标签序列将是伪随机的,允许从不同节点发送多个数据而不会重叠。 请注意,生成这些伪随机数非常耗时(1e-5 秒/数字),这意味着它可能会降低算法的运行时。 默认为 False

示例

>>> import torch
>>> from tensordict import TensorDict
>>> from torch import multiprocessing as mp
>>> def client():
...     torch.distributed.init_process_group(
...         "gloo",
...         rank=1,
...         world_size=2,
...         init_method=f"tcp://localhost:10003",
...     )
...
...     td = TensorDict(
...         {
...             ("a", "b"): torch.randn(2),
...             "c": torch.randn(2, 3),
...             "_": torch.ones(2, 1, 5),
...         },
...         [2],
...     )
...     td.isend(0)
...
>>>
>>> def server(queue, return_premature=True):
...     torch.distributed.init_process_group(
...         "gloo",
...         rank=0,
...         world_size=2,
...         init_method=f"tcp://localhost:10003",
...     )
...     td = TensorDict(
...         {
...             ("a", "b"): torch.zeros(2),
...             "c": torch.zeros(2, 3),
...             "_": torch.zeros(2, 1, 5),
...         },
...         [2],
...     )
...     out = td.irecv(1, return_premature=return_premature)
...     if return_premature:
...         for fut in out:
...             fut.wait()
...     assert (td != 0).all()
...     queue.put("yuppie")
...
>>>
>>> if __name__ == "__main__":
...     queue = mp.Queue(1)
...     main_worker = mp.Process(
...         target=server,
...         args=(queue, )
...         )
...     secondary_worker = mp.Process(target=client)
...
...     main_worker.start()
...     secondary_worker.start()
...     out = queue.get(timeout=10)
...     assert out == "yuppie"
...     main_worker.join()
...     secondary_worker.join()
isfinite() T

返回一个新的 tensordict,其中包含布尔元素,表示每个元素是否有限。

当实数值不是 NaN、负无穷或正无穷时,它们是有限的。 当复数的实部和虚部都有限时,它们是有限的。

isnan() T

返回一个新的 tensordict,其中包含布尔元素,表示输入的每个元素是否为 NaN。

当复数的实部和/或虚部为 NaN 时,该复数被认为是 NaN。

isneginf() T

测试输入的每个元素是否为负无穷。

isposinf() T

测试输入的每个元素是否为负无穷。

isreal() T

返回一个新的 tensordict,其中包含布尔元素,表示输入的每个元素是否为实数值。

items(include_nested: bool = False, leaves_only: bool = False, is_leaf: Optional[Callable[[Type], bool]] = None, *, sort: bool = False) Iterator[Tensor]

返回 tensordict 的键值对生成器。

参数:
  • include_nested (bool, optional) – 如果 True, 将返回嵌套的值。默认为 False

  • leaves_only (bool, optional) – 如果 False,则仅返回叶子节点。默认为 False

  • is_leaf (callable, optional) –

    一个可调用对象,接受一个类类型作为参数,返回一个布尔值,指示该类是否应被视为叶节点。

    注意

    is_leaf 的目的不是阻止对嵌套 tensordict 的递归调用,而是将某些类型标记为“叶节点”,以便在 leaves_only=True 时进行过滤。 即使 is_leaf(cls) 返回 True,如果 include_nested=True,tensordict 的嵌套结构仍将被遍历。 换句话说,is_leaf 不控制递归深度,而是提供了一种在 leaves_only=True 时从结果中过滤掉某些类型的方法。 这意味着树中的一个节点可以既是叶节点,又是带有子节点的节点。 实际上,is_leaf 的默认值会将 tensordict 和 tensorclass 实例从叶节点集中排除。

关键字参数:

sort (bool, optional) – 是否应该对键进行排序。对于嵌套键,键将根据它们的连接名称进行排序(即,("a", "key") 将被视为 "a.key" 进行排序)。请注意,处理大型 tensordict 时,排序可能会产生显着的开销。默认为 False

keys(*args, **kwargs)

返回 tensordict 键的生成器。

警告

TensorDict 的 keys() 方法返回键的惰性视图。如果查询了 keys 但未对其进行迭代,然后修改了 tensordict,则稍后迭代键将返回键的新配置。

参数:
  • include_nested (bool, optional) – 如果 True, 将返回嵌套的值。默认为 False

  • leaves_only (bool, optional) – 如果 False,则仅返回叶子节点。默认为 False

  • is_leaf (callable, optional) –

    一个可调用对象,接受一个类类型作为参数,返回一个布尔值,指示该类是否应被视为叶节点。

    注意

    is_leaf 的目的不是阻止对嵌套 tensordict 的递归调用,而是将某些类型标记为“叶节点”,以便在 leaves_only=True 时进行过滤。 即使 is_leaf(cls) 返回 True,如果 include_nested=True,tensordict 的嵌套结构仍将被遍历。 换句话说,is_leaf 不控制递归深度,而是提供了一种在 leaves_only=True 时从结果中过滤掉某些类型的方法。 这意味着树中的一个节点可以既是叶节点,又是带有子节点的节点。 实际上,is_leaf 的默认值会将 tensordict 和 tensorclass 实例从叶节点集中排除。

关键字参数:

sort (bool, optional) – 是否应对键进行排序。对于嵌套键,键将根据它们的连接名称进行排序(即,("a", "key") 将被视为 "a.key" 进行排序)。请注意,处理大型 tensordict 时,排序可能会产生显着的开销。默认为 False

示例

>>> from tensordict import TensorDict
>>> data = TensorDict({"0": 0, "1": {"2": 2}}, batch_size=[])
>>> data.keys()
['0', '1']
>>> list(data.keys(leaves_only=True))
['0']
>>> list(data.keys(include_nested=True, leaves_only=True))
['0', '1', ('1', '2')]
classmethod lazy_stack(input, dim=0, *, out=None, **kwargs)

创建 tensordict 的惰性堆栈。

有关详细信息,请参见 lazy_stack()

lerp(end: tensordict.base.TensorDictBase | torch.Tensor, weight: tensordict.base.TensorDictBase | torch.Tensor | float)

根据标量或张量 weight 对两个张量 start(由 self 给出)和 end 进行线性插值。

\[\text{out}_i = \text{start}_i + \text{weight}_i \times (\text{end}_i - \text{start}_i)\]

startend 的形状必须是可广播的。如果 weight 是一个张量,那么 weightstartend 的形状必须是可广播的。

参数:
lerp_(end: tensordict.base.TensorDictBase | torch.Tensor | float, weight: tensordict.base.TensorDictBase | torch.Tensor | float)

lerp() 的原地版本。

lgamma() T

计算 TensorDict 中每个元素的 lgamma() 值。

lgamma_() T

就地计算 TensorDict 中每个元素的 lgamma() 值。

classmethod load(prefix: str | pathlib.Path, *args, **kwargs) T

从磁盘加载一个 tensordict。

这个类方法是 load_memmap() 的代理。

load_(prefix: str | pathlib.Path, *args, **kwargs)

从磁盘加载一个 tensordict 到当前的 tensordict 中。

这个类方法是 load_memmap_() 的代理。

classmethod load_memmap(prefix: str | pathlib.Path, device: Optional[device] = None, non_blocking: bool = False, *, out: Optional[TensorDictBase] = None) T

从磁盘加载一个内存映射的 tensordict。

参数:
  • prefix (strPath to folder) – 保存的 tensordict 所在的文件夹路径。

  • device (torch.device等价物, 可选) – 如果提供,数据将被异步地转换到该设备。支持 “meta” 设备,在这种情况下,数据不会被加载,而是创建一组空的 “meta” 张量。这对于了解总模型大小和结构而不实际打开任何文件很有用。

  • non_blocking (bool, 可选) – 如果 True,则在设备上加载张量后不会调用 synchronize。默认为 False

  • out (TensorDictBase, 可选) – 可选的 tensordict,数据应写入其中。

示例

>>> from tensordict import TensorDict
>>> td = TensorDict.fromkeys(["a", "b", "c", ("nested", "e")], 0)
>>> td.memmap("./saved_td")
>>> td_load = TensorDict.load_memmap("./saved_td")
>>> assert (td == td_load).all()

此方法还允许加载嵌套的 tensordicts。

示例

>>> nested = TensorDict.load_memmap("./saved_td/nested")
>>> assert nested["e"] == 0

一个 tensordict 也可以被加载到 “meta” 设备上,或者,作为假张量。

示例

>>> import tempfile
>>> td = TensorDict({"a": torch.zeros(()), "b": {"c": torch.zeros(())}})
>>> with tempfile.TemporaryDirectory() as path:
...     td.save(path)
...     td_load = TensorDict.load_memmap(path, device="meta")
...     print("meta:", td_load)
...     from torch._subclasses import FakeTensorMode
...     with FakeTensorMode():
...         td_load = TensorDict.load_memmap(path)
...         print("fake:", td_load)
meta: TensorDict(
    fields={
        a: Tensor(shape=torch.Size([]), device=meta, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([]), device=meta, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([]),
            device=meta,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=meta,
    is_shared=False)
fake: TensorDict(
    fields={
        a: FakeTensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: FakeTensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([]),
            device=cpu,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=cpu,
    is_shared=False)
load_memmap_(prefix: str | pathlib.Path)

在调用 load_memmap_ 的 tensordict 中加载一个内存映射的 tensordict 的内容。

有关更多信息,请参阅 load_memmap()

load_state_dict(state_dict: OrderedDict[str, Any], strict=True, assign=False)

加载一个 state_dict (状态字典), 格式如 state_dict(),到 tensordict 中。

参数:
  • state_dict (OrderedDict) – 要复制的 state_dict。

  • strict (bool, 可选) – 是否严格强制 state_dict 中的键与此 tensordict 的 torch.nn.Module.state_dict() 函数返回的键匹配。默认值:True

  • assign (bool, 可选) – 是否将状态字典中的项目分配给 tensordict 中对应的键,而不是将它们就地复制到 tensordict 的当前张量中。当 False 时,当前模块中张量的属性将被保留,而当 True 时,状态字典中张量的属性将被保留。默认值:False

  • from_flatten (bool, 可选) – 如果 True,则假定输入的 state_dict 已被扁平化。默认为 False

示例

>>> data = TensorDict({"1": 1, "2": 2, "3": {"3": 3}}, [])
>>> data_zeroed = TensorDict({"1": 0, "2": 0, "3": {"3": 0}}, [])
>>> sd = data.state_dict()
>>> data_zeroed.load_state_dict(sd)
>>> print(data_zeroed["3", "3"])
tensor(3)
>>> # with flattening
>>> data_zeroed = TensorDict({"1": 0, "2": 0, "3": {"3": 0}}, [])
>>> data_zeroed.load_state_dict(data.state_dict(flatten=True), from_flatten=True)
>>> print(data_zeroed["3", "3"])
tensor(3)
lock_() T

锁定一个 tensordict,以防止非就地操作。

诸如 set(), __setitem__(), update(), rename_key_() 或其他添加或删除条目的操作将被阻止。

此方法可以用作装饰器。

示例

>>> from tensordict import TensorDict
>>> td = TensorDict({"a": 1, "b": 2, "c": 3}, batch_size=[])
>>> with td.lock_():
...     assert td.is_locked
...     try:
...         td.set("d", 0) # error!
...     except RuntimeError:
...         print("td is locked!")
...     try:
...         del td["d"]
...     except RuntimeError:
...         print("td is locked!")
...     try:
...         td.rename_key_("a", "d")
...     except RuntimeError:
...         print("td is locked!")
...     td.set("a", 0, inplace=True)  # No storage is added, moved or removed
...     td.set_("a", 0) # No storage is added, moved or removed
...     td.update({"a": 0}, inplace=True)  # No storage is added, moved or removed
...     td.update_({"a": 0})  # No storage is added, moved or removed
>>> assert not td.is_locked
log() T

计算 TensorDict 中每个元素的 log() 值。

log10() T

计算 TensorDict 中每个元素的 log10() 值。

log10_() T

就地计算 TensorDict 中每个元素的 log10() 值。

log1p() T

计算 TensorDict 中每个元素的 log1p() 值。

log1p_() T

就地计算 TensorDict 中每个元素的 log1p() 值。

log2() T

计算 TensorDict 中每个元素的 log2() 值。

log2_() T

原地计算 TensorDict 中每个元素的 log2() 值。

log_() T

原地计算 TensorDict 中每个元素的 log() 值。

logical_and(other: tensordict.base.TensorDictBase | torch.Tensor, *, default: str | torch.Tensor | None = None) TensorDictBase

执行 selfother 之间的逻辑与运算。

\[\text{{out}}_i = \text{{input}}_i \land \text{{other}}_i\]
参数:

other (TensorDictBasetorch.Tensor) – 用于执行逻辑与运算的 tensor 或 TensorDict。

关键字参数:

default (torch.Tensorstr, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递 default="intersection",则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default 将用于操作两侧所有缺失的条目。

logsumexp(dim=None, keepdim=False, *, out=None)

返回给定维度 dim 中输入 tensordict 每行的指数和的对数。该计算经过数值稳定处理。

如果 keepdim 为 True,则输出张量的大小与输入张量相同,只是在维度 dim 中大小为 1。 否则,dim 被压缩(参见 squeeze()),导致输出张量的维度减少 1(或 len(dim))。

参数:
  • dim (intint 元组, 可选) – 要减少的维度或多个维度。 如果为 None,则会减少 tensordict 的所有批处理维度。

  • keepdim (bool) – 输出 tensordict 是否保留 dim。

关键字参数:

out (TensorDictBase, 可选) – 输出 tensordict。

make_memmap(key: NestedKey, shape: torch.Size | torch.Tensor, *, dtype: Optional[dtype] = None) MemoryMappedTensor

根据形状(shape)和可能的 dtype 创建一个空的内存映射张量。

警告

此方法在设计上不是锁安全的。 存在于多个节点上的内存映射 TensorDict 实例需要使用方法 memmap_refresh_() 进行更新。

写入现有条目将导致错误。

参数:
  • key (NestedKey) – 要写入的新条目的键。 如果该键已存在于 tensordict 中,则会引发异常。

  • shape (torch.Size等效项, 嵌套张量的 torch.Tensor) – 要写入的张量的形状。

关键字参数:

dtype (torch.dtype, 可选) – 新张量的 dtype。

返回值:

一个新的内存映射张量。

make_memmap_from_storage(key: NestedKey, storage: UntypedStorage, shape: torch.Size | torch.Tensor, *, dtype: Optional[dtype] = None) MemoryMappedTensor

根据存储(storage)、形状(shape)和可能的 dtype 创建一个空的内存映射张量。

警告

此方法在设计上不是锁安全的。 存在于多个节点上的内存映射 TensorDict 实例需要使用方法 memmap_refresh_() 进行更新。

注意

如果存储具有关联的文件名,则它必须与该文件的新文件名匹配。 如果它没有关联的文件名,但 tensordict 具有关联的路径,则会导致异常。

参数:
  • key (NestedKey) – 要写入的新条目的键。 如果该键已存在于 tensordict 中,则会引发异常。

  • storage (torch.UntypedStorage) – 用于新 MemoryMappedTensor 的存储。 必须是物理内存存储。

  • shape (torch.Size等效项, 嵌套张量的 torch.Tensor) – 要写入的张量的形状。

关键字参数:

dtype (torch.dtype, 可选) – 新张量的 dtype。

返回值:

具有给定存储的新内存映射张量。

make_memmap_from_tensor(key: NestedKey, tensor: Tensor, *, copy_data: bool = True) MemoryMappedTensor

根据张量创建一个空的内存映射张量。

警告

此方法在设计上不是锁安全的。 存在于多个节点上的内存映射 TensorDict 实例需要使用方法 memmap_refresh_() 进行更新。

如果 copy_dataTrue (即存储未共享),则此方法始终复制存储内容。

参数:
  • key (NestedKey) – 要写入的新条目的键。 如果该键已存在于 tensordict 中,则会引发异常。

  • tensor (torch.Tensor) – 要在物理内存上复制的张量。

关键字参数:

copy_data (bool, optional) – 如果 False,则新张量将共享输入的元数据,例如形状和数据类型,但内容将为空。 默认为 True

返回值:

具有给定存储的新内存映射张量。

map(fn: Callable, dim: int = 0, num_workers: Optional[int] = None, chunksize: Optional[int] = None, num_chunks: Optional[int] = None, pool: Optional[Pool] = None, generator: Optional[Generator] = None, max_tasks_per_child: Optional[int] = None, worker_threads: int = 1, mp_start_method: Optional[str] = None)

将函数映射到 tensordict 沿一个维度的拆分。

此方法将通过将 tensordict 实例分成大小相等的 tensordict 并将操作分派到所需数量的工作程序,从而将函数应用于 tensordict 实例。

函数签名应为 Callabe[[TensorDict], Union[TensorDict, Tensor]]。 输出必须支持 torch.cat() 操作。 函数必须是可序列化的。

注意

当处理存储在磁盘上的大型数据集(例如,内存映射的 tensordict)时,此方法特别有用,其中块将是原始数据的零拷贝切片,可以几乎零成本地传递到进程。 这允许以很小的代价处理非常大的数据集(例如,超过 Tb)。

参数:
  • fn (callable) – 应用于 tensordict 的函数。 支持类似于 Callabe[[TensorDict], Union[TensorDict, Tensor]] 的签名。

  • dim (int, optional) – tensordict 将被分块的维度。

  • num_workers (int, optional) – 工作程序的数量。 与 pool 互斥。 如果未提供,工作程序的数量将设置为可用 CPU 的数量。

关键字参数:
  • out (TensorDictBase, optional) – 输出的可选容器。 其沿提供的 dim 的批处理大小必须与 self.ndim 匹配。 如果它是共享的或 memmap (is_shared()is_memmap() 返回 True) ,它将在远程进程中填充,从而避免数据向内传输。 否则,来自 self 切片的数据将被发送到进程,在当前进程上收集并就地写入 out

  • chunksize (int, optional) – 每个数据块的大小。 chunksize 为 0 将沿所需的维度解绑定 tensordict 并在应用函数后重新堆叠它,而 chunksize>0 将拆分 tensordict 并在生成的 tensordict 列表上调用 torch.cat()。 如果未提供,块的数量将等于工作程序的数量。 对于非常大的 tensordict,如此大的块可能不适合在内存中进行操作,并且可能需要更多块才能使操作在实践中可行。 此参数与 num_chunks 互斥。

  • num_chunks (int, optional) – 将 tensordict 分成块的数量。 如果未提供,块的数量将等于工作程序的数量。 对于非常大的 tensordict,如此大的块可能不适合在内存中进行操作,并且可能需要更多块才能使操作在实践中可行。 此参数与 chunksize 互斥。

  • pool (mp.Pool, optional) – 用于执行作业的多进程池实例。 如果未提供,则将在 map 方法中创建一个池。

  • generator (torch.Generator, optional) –

    用于播种的生成器。 将从中生成一个基本种子,并且池的每个工作程序都将使用提供的种子递增一个从 0num_workers 的唯一整数来播种。 如果未提供生成器,则将使用一个随机整数作为种子。 要使用未播种的工作程序,应单独创建一个池并直接传递给 map()

    注意

    提供一个低值的种子时应谨慎,因为这可能会导致实验之间的自相关,例如:如果请求了 8 个工作程序,并且种子为 4,则工作程序种子将从 4 到 11。如果种子为 5,则工作程序种子将从 5 到 12。这两个实验将有 7 个种子的重叠,这可能会对结果产生意想不到的影响。

    注意

    worker 初始化的目标是让每个 worker 拥有独立的种子,而**不是**让 map 方法的每次调用都产生可复现的结果。 换句话说,由于无法知道哪个 worker 将选择哪个任务,因此两个实验可能并且很可能会返回不同的结果。但是,我们可以确保每个 worker 都有不同的种子,并且每个 worker 上的伪随机操作是不相关的。

  • max_tasks_per_child (int, optional) – 每个子进程选择的最大任务数。默认为 None,即对任务数量没有限制。

  • worker_threads (int, optional) – worker 使用的线程数。默认为 1

  • index_with_generator (bool, optional) – 如果为 True,则将在查询期间完成 tensordict 的拆分/分块,从而节省初始化时间。请注意,chunk()split() 比索引(在生成器中使用)效率高得多,因此在初始化时节省处理时间可能会对总运行时间产生负面影响。默认为 False

  • pbar (bool, optional) – 如果为 True,将显示进度条。需要安装 tqdm。默认为 False

  • mp_start_method (str, optional) – 多进程的启动方法。如果未提供,将使用默认启动方法。接受的字符串为 "fork""spawn"。请记住,使用 "fork" 启动方法时,"cuda" 张量不能在进程之间共享。如果 pool 传递给 map 方法,则此设置无效。

示例

>>> import torch
>>> from tensordict import TensorDict
>>>
>>> def process_data(data):
...     data.set("y", data.get("x") + 1)
...     return data
>>> if __name__ == "__main__":
...     data = TensorDict({"x": torch.zeros(1, 1_000_000)}, [1, 1_000_000]).memmap_()
...     data = data.map(process_data, dim=1)
...     print(data["y"][:, :10])
...
tensor([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])
map_iter(fn: Callable[[TensorDictBase], TensorDictBase | None], dim: int = 0, num_workers: int | None = None, *, shuffle: bool = False, chunksize: int | None = None, num_chunks: int | None = None, pool: mp.Pool | None = None, generator: torch.Generator | None = None, max_tasks_per_child: int | None = None, worker_threads: int = 1, index_with_generator: bool = True, pbar: bool = False, mp_start_method: str | None = None)

迭代地将函数映射到 tensordict 沿一个维度的拆分。

这是 map() 的可迭代版本。

此方法将通过将 tensordict 实例分块为大小相等的 tensordict,并将操作分派到所需数量的 worker 上来将函数应用于 tensordict 实例。它将一次产生一个结果。

函数签名应为 Callabe[[TensorDict], Union[TensorDict, Tensor]]。该函数必须是可序列化的。

注意

当处理存储在磁盘上的大型数据集(例如,内存映射的 tensordict)时,此方法特别有用,其中块将是原始数据的零拷贝切片,可以几乎零成本地传递到进程。 这允许以很小的代价处理非常大的数据集(例如,超过 Tb)。

注意

此函数可用于表示数据集并从中加载数据,类似于 dataloader 的方式。

参数:
  • fn (callable) – 应用于 tensordict 的函数。 支持类似于 Callabe[[TensorDict], Union[TensorDict, Tensor]] 的签名。

  • dim (int, optional) – tensordict 将被分块的维度。

  • num_workers (int, optional) – 工作程序的数量。 与 pool 互斥。 如果未提供,工作程序的数量将设置为可用 CPU 的数量。

关键字参数:
  • shuffle (bool, optional) – 是否应全局打乱索引。如果为 True,则每个批次将包含非连续样本。如果 index_with_generator=False 并且 shuffle=True`,则会引发错误。默认为 False

  • chunksize (int, optional) – 每个数据块的大小。 chunksize 为 0 将沿所需的维度解绑定 tensordict 并在应用函数后重新堆叠它,而 chunksize>0 将拆分 tensordict 并在生成的 tensordict 列表上调用 torch.cat()。 如果未提供,块的数量将等于工作程序的数量。 对于非常大的 tensordict,如此大的块可能不适合在内存中进行操作,并且可能需要更多块才能使操作在实践中可行。 此参数与 num_chunks 互斥。

  • num_chunks (int, optional) – 将 tensordict 分成块的数量。 如果未提供,块的数量将等于工作程序的数量。 对于非常大的 tensordict,如此大的块可能不适合在内存中进行操作,并且可能需要更多块才能使操作在实践中可行。 此参数与 chunksize 互斥。

  • pool (mp.Pool, optional) – 用于执行作业的多进程池实例。 如果未提供,则将在 map 方法中创建一个池。

  • generator (torch.Generator, optional) –

    用于播种的生成器。 将从中生成一个基本种子,并且池的每个工作程序都将使用提供的种子递增一个从 0num_workers 的唯一整数来播种。 如果未提供生成器,则将使用一个随机整数作为种子。 要使用未播种的工作程序,应单独创建一个池并直接传递给 map()

    注意

    提供一个低值的种子时应谨慎,因为这可能会导致实验之间的自相关,例如:如果请求了 8 个工作程序,并且种子为 4,则工作程序种子将从 4 到 11。如果种子为 5,则工作程序种子将从 5 到 12。这两个实验将有 7 个种子的重叠,这可能会对结果产生意想不到的影响。

    注意

    worker 初始化的目标是让每个 worker 拥有独立的种子,而**不是**让 map 方法的每次调用都产生可复现的结果。 换句话说,由于无法知道哪个 worker 将选择哪个任务,因此两个实验可能并且很可能会返回不同的结果。但是,我们可以确保每个 worker 都有不同的种子,并且每个 worker 上的伪随机操作是不相关的。

  • max_tasks_per_child (int, optional) – 每个子进程选择的最大任务数。默认为 None,即对任务数量没有限制。

  • worker_threads (int, optional) – worker 使用的线程数。默认为 1

  • index_with_generator (bool, optional) –

    如果为 True,则将在查询期间完成 tensordict 的拆分/分块,从而节省初始化时间。请注意,chunk()split() 比索引(在生成器中使用)效率高得多,因此在初始化时节省处理时间可能会对总运行时间产生负面影响。默认为 True

    注意

    对于 map_itermapindex_with_generator 的默认值不同,前者假定将 TensorDict 的拆分版本存储在内存中成本过高。

  • pbar (bool, optional) – 如果为 True,将显示进度条。需要安装 tqdm。默认为 False

  • mp_start_method (str, optional) – 多进程的启动方法。如果未提供,将使用默认启动方法。接受的字符串为 "fork""spawn"。请记住,使用 "fork" 启动方法时,"cuda" 张量不能在进程之间共享。如果 pool 传递给 map 方法,则此设置无效。

示例

>>> import torch
>>> from tensordict import TensorDict
>>>
>>> def process_data(data):
...     data.unlock_()
...     data.set("y", data.get("x") + 1)
...     return data
>>> if __name__ == "__main__":
...     data = TensorDict({"x": torch.zeros(1, 1_000_000)}, [1, 1_000_000]).memmap_()
...     for sample in data.map_iter(process_data, dim=1, chunksize=5):
...         print(sample["y"])
...         break
...
tensor([[1., 1., 1., 1., 1.]])
masked_fill(*args, **kwargs)

masked_fill 的非原地版本。

参数:
  • mask (boolean torch.Tensor) – 要填充的值的掩码。形状必须与 tensordict 的批大小匹配。

  • value – 用于填充张量的值。

返回值:

self

示例

>>> td = TensorDict(source={'a': torch.zeros(3, 4)},
...     batch_size=[3])
>>> mask = torch.tensor([True, False, False])
>>> td1 = td.masked_fill(mask, 1.0)
>>> td1.get("a")
tensor([[1., 1., 1., 1.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]])
masked_fill_(*args, **kwargs)

用所需的值填充对应于掩码的值。

参数:
  • mask (boolean torch.Tensor) – 要填充的值的掩码。形状必须与 tensordict 的批大小匹配。

  • value – 用于填充张量的值。

返回值:

self

示例

>>> td = TensorDict(source={'a': torch.zeros(3, 4)},
...     batch_size=[3])
>>> mask = torch.tensor([True, False, False])
>>> td.masked_fill_(mask, 1.0)
>>> td.get("a")
tensor([[1., 1., 1., 1.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]])
masked_select(mask: Tensor) T

屏蔽 TensorDict 的所有张量,并返回一个新的 TensorDict 实例,该实例具有指向屏蔽值的相似键。

参数:

mask (torch.Tensor) – 用于张量的布尔掩码。形状必须与 TensorDict 的 batch_size 匹配。

示例

>>> td = TensorDict(source={'a': torch.zeros(3, 4)},
...    batch_size=[3])
>>> mask = torch.tensor([True, False, False])
>>> td_mask = td.masked_select(mask)
>>> td_mask.get("a")
tensor([[0., 0., 0., 0.]])
max(dim: int | NO_DEFAULT = _NoDefault.ZERO, keepdim: bool = False, *, reduce: bool | None = None, return_indices: bool = True) TensorDictBase | torch.Tensor

返回输入 tensordict 中所有元素的最大值。

参数:
  • dim (int, 可选) – 如果 None,则返回包含所有叶子的最大值的无维度 tensordict(如果可以计算)。 如果是整数,则仅当此维度与 tensordict 形状兼容时,才对指定的维度调用 max

  • keepdim (bool) – 输出张量是否保留 dim。

关键字参数:
  • reduce (bool, 可选) – 如果为 True,则将在所有 TensorDict 值上进行规约,并返回单个规约后的 tensor。默认为 False

  • return_argmins (bool, 可选) – 当传递 dim 参数时,max() 返回一个具有值和索引的命名元组。 其 TensorDict 等效项是返回一个具有 "values""indices" 条目的 tensorclass,其中具有相同的内部结构。 默认为 True

示例

>>> from tensordict import TensorDict
>>> import torch
>>> td = TensorDict(
...     a=torch.randn(3, 4, 5),
...     b=TensorDict(
...         c=torch.randn(3, 4, 5, 6),
...         d=torch.randn(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.max(dim=0)
max(
    indices=TensorDict(
        fields={
            a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.int64, is_shared=False),
            b: TensorDict(
                fields={
                    c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.int64, is_shared=False),
                    d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.int64, is_shared=False)},
                batch_size=torch.Size([4]),
                device=None,
                is_shared=False)},
        batch_size=torch.Size([4]),
        device=None,
        is_shared=False),
    vals=TensorDict(
        fields={
            a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
            b: TensorDict(
                fields={
                    c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False),
                    d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
                batch_size=torch.Size([4]),
                device=None,
                is_shared=False)},
        batch_size=torch.Size([4]),
        device=None,
        is_shared=False),
    batch_size=torch.Size([4]),
    device=None,
    is_shared=False)
>>> td.max()
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> td.max(reduce=True)
tensor(3.2942)
maximum(other: tensordict.base.TensorDictBase | torch.Tensor, *, default: str | torch.Tensor | None = None) T

计算 selfother 的逐元素最大值。

参数:

other (TensorDict or Tensor) – 另一个输入 tensordict 或 tensor。

关键字参数:

default (torch.Tensorstr, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递 default="intersection",则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default 将用于操作两侧所有缺失的条目。

maximum_(other: tensordict.base.TensorDictBase | torch.Tensor) T

maximum() 的原地版本。

注意

原地 maximum 不支持 default 关键字参数。

classmethod maybe_dense_stack(input, dim=0, *, out=None, **kwargs)

尝试制作 tensordict 的密集堆栈,并在需要时回退到惰性堆栈。

有关详细信息,请参见 maybe_dense_stack()

mean(dim: Union[int, Tuple[int], Literal['feature']] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, dtype: Optional[dtype] = None, reduce: Optional[bool] = None) tensordict.base.TensorDictBase | torch.Tensor

返回输入 tensordict 中所有元素的平均值。

参数:
  • dim (int, int 元组, str, 可选) – 如果为 None,则返回包含所有叶子节点平均值的无维度 tensordict(如果可以计算)。如果为整数或整数元组,则仅当此维度与 tensordict 形状兼容时,才对指定的维度调用 mean。目前只允许使用 “feature” 字符串。使用 dim=”feature” 将实现对所有特征维度的缩减。如果 reduce=True,则返回一个形状与 TensorDict 的 batch-size 相同的张量。否则,将返回一个新的 tensordict,其结构与 self 相同,但特征维度已缩减。

  • keepdim (bool) – 输出张量是否保留 dim。

关键字参数:
  • dtype (torch.dtype, 可选) – 返回张量的所需数据类型。如果指定,输入张量在执行操作之前会被强制转换为 dtype。这对于防止数据类型溢出非常有用。默认值:None

  • reduce (bool, 可选) – 如果为 True,则将在所有 TensorDict 值上进行规约,并返回单个规约后的 tensor。默认为 False

示例

>>> from tensordict import TensorDict
>>> import torch
>>> td = TensorDict(
...     a=torch.randn(3, 4, 5),
...     b=TensorDict(
...         c=torch.randn(3, 4, 5, 6),
...         d=torch.randn(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.mean(dim=0)
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([4, 5]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([4]),
    device=None,
    is_shared=False)
>>> td.mean()
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> td.mean(reduce=True)
tensor(-0.0547)
>>> td.mean(dim="feature")
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([3, 4, 5]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([3, 4]),
    device=None,
    is_shared=False)
>>> td = TensorDict(
...     a=torch.ones(3, 4, 5),
...     b=TensorDict(
...         c=torch.ones(3, 4, 5),
...         d=torch.ones(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.mean(reduce=True, dim="feature")
tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]])
>>> td.mean(reduce=True, dim=0)
tensor([[1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.]])
memmap(prefix: Optional[str] = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False, existsok: bool = True) T

将所有张量写入新 tensordict 中对应的内存映射张量。

参数:
  • prefix (str) – 内存映射张量将存储的目录前缀。目录树结构将模仿 tensordict 的结构。

  • copy_existing (bool) – 如果为 False(默认值),如果 tensordict 中的条目已经是存储在磁盘上的张量,并且有相关联的文件,但没有根据前缀保存在正确的位置,则会引发异常。如果为 True,任何现有张量都将被复制到新位置。

关键字参数:
  • num_threads (int, 可选) – 用于写入 memmap 张量的线程数。默认为 0

  • return_early (bool, 可选) – 如果 Truenum_threads>0,该方法将返回 tensordict 的 future。

  • share_non_tensor (bool, 可选) – 如果为 True,非张量数据将在进程之间共享,并且在单个节点内的任何 worker 上执行的写入操作(例如,就地更新或设置)将更新所有其他 worker 上的值。 如果非张量叶子的数量很高(例如,共享大量的非张量数据堆栈),这可能会导致 OOM 或类似的错误。默认为 False

  • existsok (bool, 可选) – 如果为 False,如果张量已存在于同一路径中,则会引发异常。默认为 True

然后,TensorDict 被锁定,这意味着任何非就地写入操作都会引发异常(例如,重命名、设置或删除条目)。一旦 tensordict 被解锁,memory-mapped 属性将变为 False,因为无法再保证跨进程标识。

返回值:

如果 return_early=False,则返回一个新的 tensordict,其中张量存储在磁盘上,否则返回一个 TensorDictFuture 实例。

注意

以这种方式序列化对于深度嵌套的 tensordict 可能会很慢,因此不建议在训练循环中调用此方法。

memmap_(prefix: Optional[str] = None, copy_existing: bool = False, num_threads: int = 0) TensorDictBase

将所有张量就地写入对应的内存映射张量。

参数:
  • prefix (str) – 内存映射张量将存储的目录前缀。目录树结构将模仿 tensordict 的结构。

  • copy_existing (bool) – 如果为 False(默认值),如果 tensordict 中的条目已经是存储在磁盘上的张量,并且有相关联的文件,但没有根据前缀保存在正确的位置,则会引发异常。如果为 True,任何现有张量都将被复制到新位置。

关键字参数:
  • num_threads (int, 可选) – 用于写入 memmap 张量的线程数。默认为 0

  • return_early (bool, 可选) – 如果为 Truenum_threads>0,则该方法将返回 tensordict 的 future 对象。 可以使用 future.result() 查询生成的 tensordict。

  • share_non_tensor (bool, 可选) – 如果为 True,非张量数据将在进程之间共享,并且在单个节点内的任何 worker 上执行的写入操作(例如,就地更新或设置)将更新所有其他 worker 上的值。 如果非张量叶子的数量很高(例如,共享大量的非张量数据堆栈),这可能会导致 OOM 或类似的错误。默认为 False

  • existsok (bool, 可选) – 如果为 False,如果张量已存在于同一路径中,则会引发异常。默认为 True

然后,TensorDict 被锁定,这意味着任何非就地写入操作都会引发异常(例如,重命名、设置或删除条目)。一旦 tensordict 被解锁,memory-mapped 属性将变为 False,因为无法再保证跨进程标识。

返回值:

如果 return_early=False,则返回 self,否则返回一个 TensorDictFuture 实例。

注意

以这种方式序列化对于深度嵌套的 tensordict 可能会很慢,因此不建议在训练循环中调用此方法。

memmap_like(prefix: str | None = None, copy_existing: bool = False, num_threads: int = 0) T

创建一个与原始 tensordict 具有相同形状的无内容内存映射 tensordict。

参数:
  • prefix (str) – 内存映射张量将存储的目录前缀。目录树结构将模仿 tensordict 的结构。

  • copy_existing (bool) – 如果为 False(默认值),如果 tensordict 中的条目已经是存储在磁盘上的张量,并且有相关联的文件,但没有根据前缀保存在正确的位置,则会引发异常。如果为 True,任何现有张量都将被复制到新位置。

关键字参数:
  • num_threads (int, 可选) – 用于写入 memmap 张量的线程数。默认为 0

  • return_early (bool, 可选) – 如果 Truenum_threads>0,该方法将返回 tensordict 的 future。

  • share_non_tensor (bool, 可选) – 如果为 True,非张量数据将在进程之间共享,并且在单个节点内的任何 worker 上执行的写入操作(例如,就地更新或设置)将更新所有其他 worker 上的值。 如果非张量叶子的数量很高(例如,共享大量的非张量数据堆栈),这可能会导致 OOM 或类似的错误。默认为 False

  • existsok (bool, 可选) – 如果为 False,如果张量已存在于同一路径中,则会引发异常。默认为 True

然后,TensorDict 被锁定,这意味着任何非就地写入操作都会引发异常(例如,重命名、设置或删除条目)。一旦 tensordict 被解锁,memory-mapped 属性将变为 False,因为无法再保证跨进程标识。

返回值:

如果 return_early=False,则返回一个新的 TensorDict 实例,其中数据存储为内存映射张量,否则返回一个 TensorDictFuture 实例。

注意

这是在磁盘上写入一组大型缓冲区的推荐方法,因为 memmap_() 将复制信息,对于大型内容来说,这可能会很慢。

示例

>>> td = TensorDict({
...     "a": torch.zeros((3, 64, 64), dtype=torch.uint8),
...     "b": torch.zeros(1, dtype=torch.int64),
... }, batch_size=[]).expand(1_000_000)  # expand does not allocate new memory
>>> buffer = td.memmap_like("/path/to/dataset")
memmap_refresh_()

如果内存映射 tensordict 具有 saved_path,则刷新其内容。

如果没有与它关联的路径,此方法将引发异常。

min(dim: int | NO_DEFAULT = _NoDefault.ZERO, keepdim: bool = False, *, reduce: bool | None = None, return_indices: bool = True) TensorDictBase | torch.Tensor

返回输入 tensordict 中所有元素的最小值。

参数:
  • dim (int, 可选) – 如果为 None,则返回一个包含所有叶节点的最小值(如果可以计算)的无维度 tensordict。如果为整数,则仅当该维度与 tensordict 形状兼容时,才在指定的维度上调用 min

  • keepdim (bool) – 输出张量是否保留 dim。

关键字参数:
  • reduce (bool, 可选) – 如果为 True,则将在所有 TensorDict 值上进行规约,并返回单个规约后的 tensor。默认为 False

  • return_argmins (bool, 可选) – 当传递 dim 参数时,min() 返回一个包含值和索引的命名元组。等效的 TensorDict 是返回一个 tensorclass,其中包含具有相同结构的 "values""indices" 条目。默认为 True

示例

>>> from tensordict import TensorDict
>>> import torch
>>> td = TensorDict(
...     a=torch.randn(3, 4, 5),
...     b=TensorDict(
...         c=torch.randn(3, 4, 5, 6),
...         d=torch.randn(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.min(dim=0)
min(
    indices=TensorDict(
        fields={
            a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.int64, is_shared=False),
            b: TensorDict(
                fields={
                    c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.int64, is_shared=False),
                    d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.int64, is_shared=False)},
                batch_size=torch.Size([4]),
                device=None,
                is_shared=False)},
        batch_size=torch.Size([4]),
        device=None,
        is_shared=False),
    vals=TensorDict(
        fields={
            a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
            b: TensorDict(
                fields={
                    c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False),
                    d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
                batch_size=torch.Size([4]),
                device=None,
                is_shared=False)},
        batch_size=torch.Size([4]),
        device=None,
        is_shared=False),
    batch_size=torch.Size([4]),
    device=None,
    is_shared=False)
>>> td.min()
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> td.min(reduce=True)
tensor(-2.9953)
minimum(other: tensordict.base.TensorDictBase | torch.Tensor, *, default: str | torch.Tensor | None = None) T

计算 selfother 的逐元素最小值。

参数:

other (TensorDict or Tensor) – 另一个输入 tensordict 或 tensor。

关键字参数:

default (torch.Tensorstr, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递 default="intersection",则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default 将用于操作两侧所有缺失的条目。

minimum_(other: tensordict.base.TensorDictBase | torch.Tensor) T

minimum() 的原地版本。

注意

原地 minimum 不支持 default 关键字参数。

modules() Iterator[Module]

返回网络中所有模块的迭代器。

Yields:

Module – 网络中的一个模块

注意

重复的模块只返回一次。在下面的例子中,l 只会被返回一次。

示例

>>> l = nn.Linear(2, 2)
>>> net = nn.Sequential(l, l)
>>> for idx, m in enumerate(net.modules()):
...     print(idx, '->', m)

0 -> Sequential(
  (0): Linear(in_features=2, out_features=2, bias=True)
  (1): Linear(in_features=2, out_features=2, bias=True)
)
1 -> Linear(in_features=2, out_features=2, bias=True)
mtia(device: Optional[Union[int, device]] = None) T

将所有模型参数和缓冲区移动到 MTIA。

这也使得相关的参数和缓冲区成为不同的对象。因此,如果模块在优化时将驻留在 MTIA 上,则应在构建优化器之前调用此方法。

注意

此方法会就地修改模块。

参数:

device (int, optional) – 如果指定,所有参数都将复制到该设备

返回值:

self

返回类型:

模块

mul(other: tensordict.base.TensorDictBase | torch.Tensor, *, default: str | torch.Tensor | None = None) T

other 乘以 self

\[\text{{out}}_i = \text{{input}}_i \times \text{{other}}_i\]

支持广播、类型提升以及整数、浮点数和复数输入。

参数:

other (TensorDict, TensorNumber) – 要从 self 中减去的 tensor 或数字。

关键字参数:

default (torch.Tensorstr, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递 default="intersection",则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default 将用于操作两侧所有缺失的条目。

mul_(other: tensordict.base.TensorDictBase | torch.Tensor) T

mul() 的原地版本。

注意

原地 mul 不支持 default 关键字参数。

named_apply(fn: Callable, *others: TensorDictBase, batch_size: Optional[Sequence[int]] = None, device: torch.device | None = _NoDefault.ZERO, names: Optional[Sequence[str]] = _NoDefault.ZERO, inplace: bool = False, default: Any = _NoDefault.ZERO, filter_empty: bool | None = None, call_on_nested: bool = False, **constructor_kwargs) tensordict.base.TensorDictBase | None

将一个键条件可调用对象应用于 tensordict 中存储的所有值,并将它们设置在一个新的 tensordict 中。

可调用对象的签名必须是 Callable[Tuple[str, Tensor, ...], Optional[Union[Tensor, TensorDictBase]]]

参数:
  • fn (Callable) – 要应用于 tensordict 中的 (name, tensor) 对的函数。对于每个叶子节点,仅使用其叶子名称(而不是完整的 NestedKey)。

  • *others (TensorDictBase 实例, optional) – 如果提供,这些 tensordict 实例应具有与 self 匹配的结构。 fn 参数应接收与 tensordict 数量一样多的未命名输入,包括 self。 如果其他 tensordict 缺少条目,则可以通过 default 关键字参数传递默认值。

  • nested_keys (bool, 可选) – 如果 True,将使用到叶子节点的完整路径。默认为 False,即仅将最后一个字符串传递给函数。

  • batch_size (int 序列, 可选) – 如果提供,生成的 TensorDict 将具有所需的 batch_size。 batch_size 参数应与转换后的 batch_size 匹配。 这是一个仅关键字参数。

  • device (torch.device, 可选) – 生成的设备(如果有)。

  • names (str 列表, 可选) – 新的维度名称,以防修改了 batch_size。

  • inplace (bool, 可选) – 如果为 True,则进行原地修改。默认为 False。这是一个仅关键字参数。

  • default (Any, 可选) – 其他 tensordict 中缺失条目的默认值。 如果未提供,缺失的条目将引发 KeyError

  • filter_empty (bool, 可选) – 如果 True,将过滤掉空的 tensordict。这也可以降低计算成本,因为不会创建和销毁空的数据结构。为了向后兼容,默认为 False

  • propagate_lock (bool, 可选) – 如果 True,锁定的 tensordict 将生成另一个锁定的 tensordict。默认为 False

  • call_on_nested (bool, 可选) –

    如果 True,则将在第一级张量和容器(TensorDict 或 tensorclass)上调用该函数。 在这种情况下,func 负责将其调用传播到嵌套级别。 这允许在将调用传播到嵌套 tensordict 时进行细粒度控制。 如果 False,则仅在叶子上调用该函数,并且 apply 将负责将该函数分派到所有叶子上。

    >>> td = TensorDict({"a": {"b": [0.0, 1.0]}, "c": [1.0, 2.0]})
    >>> def mean_tensor_only(val):
    ...     if is_tensor_collection(val):
    ...         raise RuntimeError("Unexpected!")
    ...     return val.mean()
    >>> td_mean = td.apply(mean_tensor_only)
    >>> def mean_any(val):
    ...     if is_tensor_collection(val):
    ...         # Recurse
    ...         return val.apply(mean_any, call_on_nested=True)
    ...     return val.mean()
    >>> td_mean = td.apply(mean_any, call_on_nested=True)
    

  • out (TensorDictBase, 可选) –

    一个用于写入结果的 tensordict。 这可以用于避免创建新的 tensordict

    >>> td = TensorDict({"a": 0})
    >>> td.apply(lambda x: x+1, out=td)
    >>> assert (td==1).all()
    

    警告

    如果在 tensordict 上执行的操作需要访问多个键才能进行单个计算,则提供等于 selfout 参数可能会导致操作静默地提供错误的结果。 例如

    >>> td = TensorDict({"a": 1, "b": 1})
    >>> td.apply(lambda x: x+td["a"])["b"] # Right!
    tensor(2)
    >>> td.apply(lambda x: x+td["a"], out=td)["b"] # Wrong!
    tensor(3)
    

  • **constructor_kwargs – 要传递给 TensorDict 构造函数的其他关键字参数。

返回值:

一个具有 transformed_in 张量的新 tensordict。

示例

>>> td = TensorDict({
...     "a": -torch.ones(3),
...     "nested": {"a": torch.ones(3), "b": torch.zeros(3)}},
...     batch_size=[3])
>>> def name_filter(name, tensor):
...     if name == "a":
...         return tensor
>>> td.named_apply(name_filter)
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False),
        nested: TensorDict(
            fields={
                a: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([3]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([3]),
    device=None,
    is_shared=False)
>>> def name_filter(name, *tensors):
...     if name == "a":
...         r = 0
...         for tensor in tensors:
...             r = r + tensor
...         return tensor
>>> out = td.named_apply(name_filter, td)
>>> print(out)
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False),
        nested: TensorDict(
            fields={
                a: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([3]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([3]),
    device=None,
    is_shared=False)
>>> print(out["a"])
tensor([-1., -1., -1.])

注意

如果该函数返回 None,则忽略该条目。 这可用于过滤 tensordict 中的数据

>>> td = TensorDict({"1": 1, "2": 2, "b": {"2": 2, "1": 1}}, [])
>>> def name_filter(name, tensor):
...     if name == "1":
...         return tensor
>>> td.named_apply(name_filter)
TensorDict(
    fields={
        1: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False),
        b: TensorDict(
            fields={
                1: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
named_buffers(prefix: str = '', recurse: bool = True, remove_duplicate: bool = True) Iterator[tuple[str, torch.Tensor]]

返回一个模块缓冲区上的迭代器,产生缓冲区的名称和缓冲区本身。

参数:
  • prefix (str) – 要添加到所有缓冲区名称的前缀。

  • recurse (bool, 可选) – 如果为 True,则产生此模块和所有子模块的缓冲区。 否则,仅产生作为此模块直接成员的缓冲区。 默认为 True。

  • remove_duplicate (bool, 可选) – 是否删除结果中重复的缓冲区。 默认为 True。

Yields:

(str, torch.Tensor) – 包含名称和缓冲区的元组

示例

>>> # xdoctest: +SKIP("undefined vars")
>>> for name, buf in self.named_buffers():
>>>     if name in ['running_var']:
>>>         print(buf.size())
named_children() Iterator[tuple[str, 'Module']]

返回一个直接子模块上的迭代器,产生模块的名称和模块本身。

Yields:

(str, Module) – 包含名称和子模块的元组

示例

>>> # xdoctest: +SKIP("undefined vars")
>>> for name, module in model.named_children():
>>>     if name in ['conv4', 'conv5']:
>>>         print(module)
named_modules(memo: Optional[set['Module']] = None, prefix: str = '', remove_duplicate: bool = True)

返回网络中所有模块上的迭代器,产生模块的名称以及模块本身。

参数:
  • memo – 一个备忘录,用于存储已添加到结果中的模块集

  • prefix – 将被添加到模块名称的前缀

  • remove_duplicate – 是否移除结果中重复的模块实例

Yields:

(str, Module) – 名称和模块的元组

注意

重复的模块只返回一次。在下面的例子中,l 只会被返回一次。

示例

>>> l = nn.Linear(2, 2)
>>> net = nn.Sequential(l, l)
>>> for idx, m in enumerate(net.named_modules()):
...     print(idx, '->', m)

0 -> ('', Sequential(
  (0): Linear(in_features=2, out_features=2, bias=True)
  (1): Linear(in_features=2, out_features=2, bias=True)
))
1 -> ('0', Linear(in_features=2, out_features=2, bias=True))
named_parameters(prefix: str = '', recurse: bool = True, remove_duplicate: bool = True) Iterator[tuple[str, torch.nn.parameter.Parameter]]

返回一个模块参数的迭代器,产生参数的名称和参数本身。

参数:
  • prefix (str) – 添加到所有参数名称的前缀。

  • recurse (bool) – 如果为 True,则产生此模块和所有子模块的参数。 否则,仅产生作为此模块直接成员的参数。

  • remove_duplicate (bool, optional) – 是否移除结果中重复的参数。 默认为 True。

Yields:

(str, Parameter) – 包含名称和参数的元组

示例

>>> # xdoctest: +SKIP("undefined vars")
>>> for name, param in self.named_parameters():
>>>     if name in ['bias']:
>>>         print(param.size())
property names

tensordict的维度名称。

可以使用 names 参数在构造时设置名称。

另请参阅 refine_names(),了解有关如何在构造后设置名称的详细信息。

nanmean(dim: Union[int, Tuple[int], Literal['feature']] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, dtype: Optional[dtype] = None, reduce: Optional[bool] = None) tensordict.base.TensorDictBase | torch.Tensor

返回输入 tensordict 中所有非 NaN 元素的平均值。

参数:
  • dim (int, tuple of int, optional) – 如果 None,则返回一个包含所有叶子的平均值的无维度 tensordict(如果可以计算)。 如果是整数或整数元组,则仅当此维度与 tensordict 形状兼容时,才对指定维度调用 mean。 目前只允许使用 “feature” 字符串。 使用 dim=”feature” 将实现对所有特征维度的缩减。 如果 reduce=True,将返回一个与 TensorDict 的批大小形状相同的张量。 否则,将返回一个与 self 具有相同结构,但特征维度缩减的 tensordict。

  • keepdim (bool) – 输出张量是否保留 dim。

关键字参数:
  • dtype (torch.dtype, 可选) – 返回张量的所需数据类型。如果指定,输入张量在执行操作之前会被强制转换为 dtype。这对于防止数据类型溢出非常有用。默认值:None

  • reduce (bool, 可选) – 如果为 True,则将在所有 TensorDict 值上进行规约,并返回单个规约后的 tensor。默认为 False

示例

>>> from tensordict import TensorDict
>>> import torch
>>> td = TensorDict(
...     a=torch.randn(3, 4, 5),
...     b=TensorDict(
...         c=torch.randn(3, 4, 5, 6),
...         d=torch.randn(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.nanmean(dim=0)
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([4, 5]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([4]),
    device=None,
    is_shared=False)
>>> td.nanmean()
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> td.nanmean(reduce=True)
tensor(-0.0547)
>>> td.nanmean(dim="feature")
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([3, 4, 5]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([3, 4]),
    device=None,
    is_shared=False)
>>> td = TensorDict(
...     a=torch.ones(3, 4, 5),
...     b=TensorDict(
...         c=torch.ones(3, 4, 5),
...         d=torch.ones(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.nanmean(reduce=True, dim="feature")
tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]])
>>> td.nanmean(reduce=True, dim=0)
tensor([[1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.]])
nansum(dim: Union[int, Tuple[int], Literal['feature']] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, dtype: Optional[dtype] = None, reduce: Optional[bool] = None) tensordict.base.TensorDictBase | torch.Tensor

返回输入 tensordict 中所有非 NaN 元素的总和。

参数:
  • dim (int, tuple of int, optional) – 如果 None,则返回一个包含所有叶子的总和值的无维度 tensordict(如果可以计算)。 如果是整数或整数元组,则仅当此维度与 tensordict 形状兼容时,才对指定维度调用 sum。 目前只允许使用 “feature” 字符串。 使用 dim=”feature” 将实现对所有特征维度的缩减。 如果 reduce=True,将返回一个与 TensorDict 的批大小形状相同的张量。 否则,将返回一个与 self 具有相同结构,但特征维度缩减的 tensordict。

  • keepdim (bool) – 输出张量是否保留 dim。

关键字参数:
  • dtype (torch.dtype, 可选) – 返回张量的所需数据类型。如果指定,输入张量在执行操作之前会被强制转换为 dtype。这对于防止数据类型溢出非常有用。默认值:None

  • reduce (bool, 可选) – 如果为 True,则将在所有 TensorDict 值上进行规约,并返回单个规约后的 tensor。默认为 False

示例

>>> from tensordict import TensorDict
>>> import torch
>>> td = TensorDict(
...     a=torch.randn(3, 4, 5),
...     b=TensorDict(
...         c=torch.randn(3, 4, 5, 6),
...         d=torch.randn(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.nansum(dim=0)
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([4, 5]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([4]),
    device=None,
    is_shared=False)
>>> td.nansum()
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> td.nansum(reduce=True)
tensor(-0.)
>>> td.nansum(dim="feature")
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([3, 4, 5]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([3, 4]),
    device=None,
    is_shared=False)
>>> td = TensorDict(
...     a=torch.ones(3, 4, 5),
...     b=TensorDict(
...         c=torch.ones(3, 4, 5),
...         d=torch.ones(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.nansum(reduce=True, dim="feature")
tensor([[15., 15., 15., 15.],
        [15., 15., 15., 15.],
        [15., 15., 15., 15.]])
>>> td.nansum(reduce=True, dim=0)
tensor([[9., 9., 9., 9., 9.],
        [9., 9., 9., 9., 9.],
        [9., 9., 9., 9., 9.],
        [9., 9., 9., 9., 9.]])
property ndim: int

参见 batch_dims()

ndimension() int

参见 batch_dims()

neg() T

计算 TensorDict 中每个元素的 neg() 值。

neg_() T

就地计算 TensorDict 中每个元素的 neg() 值。

new_empty(*size: Size, dtype: Optional[dtype] = None, device: Union[device, str, int] = _NoDefault.ZERO, requires_grad: bool = False, layout: layout = torch.strided, pin_memory: Optional[bool] = None)

返回一个大小为 size 且包含空 tensors 的 TensorDict。

默认情况下,返回的 TensorDict 具有与此 tensordict 相同的 torch.dtypetorch.device

参数:

size (int...) – 定义输出 tensor 形状的整数列表、元组或 torch.Size。

关键字参数:
  • dtype (torch.dtype, 可选) – 返回的 tensordict 的期望类型。默认值:如果 None,则 torch.dtype 将保持不变。

  • device (torch.device, 可选) – 返回的 tensordict 的期望设备。默认值:如果 None,则 torch.device 将保持不变。

  • requires_grad (bool, 可选) – 如果 autograd 应该记录返回 tensors 的操作。默认值:False

  • layout (torch.layout, 可选) – 返回的 TensorDict 值的期望布局。默认值:torch.strided

  • pin_memory (bool, 可选) – 如果设置,返回的 tensor 将分配在锁页内存中。仅适用于 CPU tensors。默认值:False

new_full(size: Size, fill_value, *, dtype: Optional[dtype] = None, device: Union[device, str, int] = _NoDefault.ZERO, requires_grad: bool = False, layout: layout = torch.strided, pin_memory: Optional[bool] = None)

返回一个大小为 size 并填充了 1 的 TensorDict。

默认情况下,返回的 TensorDict 具有与此 tensordict 相同的 torch.dtypetorch.device

参数:
  • size (整数序列) – 定义输出 tensor 形状的整数列表、元组或 torch.Size。

  • fill_value (标量) – 用于填充输出 tensor 的数字。

关键字参数:
  • dtype (torch.dtype, 可选) – 返回的 tensordict 的期望类型。默认值:如果 None,则 torch.dtype 将保持不变。

  • device (torch.device, 可选) – 返回的 tensordict 的期望设备。默认值:如果 None,则 torch.device 将保持不变。

  • requires_grad (bool, 可选) – 如果 autograd 应该记录返回 tensors 的操作。默认值:False

  • layout (torch.layout, 可选) – 返回的 TensorDict 值的期望布局。默认值:torch.strided

  • pin_memory (bool, 可选) – 如果设置,返回的 tensor 将分配在锁页内存中。仅适用于 CPU tensors。默认值:False

new_ones(*size: Size, dtype: Optional[dtype] = None, device: Union[device, str, int] = _NoDefault.ZERO, requires_grad: bool = False, layout: layout = torch.strided, pin_memory: Optional[bool] = None)

返回一个大小为 size 并填充了 1 的 TensorDict。

默认情况下,返回的 TensorDict 具有与此 tensordict 相同的 torch.dtypetorch.device

参数:

size (int...) – 定义输出 tensor 形状的整数列表、元组或 torch.Size。

关键字参数:
  • dtype (torch.dtype, 可选) – 返回的 tensordict 的期望类型。默认值:如果 None,则 torch.dtype 将保持不变。

  • device (torch.device, 可选) – 返回的 tensordict 的期望设备。默认值:如果 None,则 torch.device 将保持不变。

  • requires_grad (bool, 可选) – 如果 autograd 应该记录返回 tensors 的操作。默认值:False

  • layout (torch.layout, 可选) – 返回的 TensorDict 值的期望布局。默认值:torch.strided

  • pin_memory (bool, 可选) – 如果设置,返回的 tensor 将分配在锁页内存中。仅适用于 CPU tensors。默认值:False

new_tensor(data: torch.Tensor | tensordict.base.TensorDictBase, *, dtype: Optional[dtype] = None, device: Union[device, str, int] = _NoDefault.ZERO, requires_grad: bool = False, pin_memory: Optional[bool] = None)

返回一个以 data 张量为数据的新 TensorDict。

默认情况下,返回的 TensorDict 值与此张量具有相同的 torch.dtypetorch.device

data 也可以是一个张量集合(TensorDicttensorclass),在这种情况下,new_tensor 方法会迭代 selfdata 的张量对。

参数:

data (torch.TensorTensorDictBase) – 要复制的数据。

关键字参数:
  • dtype (torch.dtype, 可选) – 返回的 tensordict 的期望类型。默认值:如果 None,则 torch.dtype 将保持不变。

  • device (torch.device, 可选) – 返回的 tensordict 的期望设备。默认值:如果 None,则 torch.device 将保持不变。

  • requires_grad (bool, 可选) – 如果 autograd 应该记录返回 tensors 的操作。默认值:False

  • pin_memory (bool, 可选) – 如果设置,返回的 tensor 将分配在锁页内存中。仅适用于 CPU tensors。默认值:False

new_zeros(*size: Size, dtype: Optional[dtype] = None, device: Union[device, str, int] = _NoDefault.ZERO, requires_grad: bool = False, layout: layout = torch.strided, pin_memory: Optional[bool] = None)

返回一个大小为 size 且填充 0 的 TensorDict。

默认情况下,返回的 TensorDict 具有与此 tensordict 相同的 torch.dtypetorch.device

参数:

size (int...) – 定义输出 tensor 形状的整数列表、元组或 torch.Size。

关键字参数:
  • dtype (torch.dtype, 可选) – 返回的 tensordict 的期望类型。默认值:如果 None,则 torch.dtype 将保持不变。

  • device (torch.device, 可选) – 返回的 tensordict 的期望设备。默认值:如果 None,则 torch.device 将保持不变。

  • requires_grad (bool, 可选) – 如果 autograd 应该记录返回 tensors 的操作。默认值:False

  • layout (torch.layout, 可选) – 返回的 TensorDict 值的期望布局。默认值:torch.strided

  • pin_memory (bool, 可选) – 如果设置,返回的 tensor 将分配在锁页内存中。仅适用于 CPU tensors。默认值:False

non_tensor_items(include_nested: bool = False)

返回所有非张量叶子节点,可能是递归的。

norm(*, out=None, dtype: torch.dtype | None = None)

计算 tensordict 中每个张量的范数。

关键字参数:
  • out (TensorDict, 可选) – 输出的 tensordict。

  • dtype (torch.dtype, 可选) – 输出的数据类型 (torch>=2.4)。

numel() int

批次中的元素总数。

下限为 1,因为两个具有空形状的 tensordict 堆叠将有两个元素,因此我们认为 tensordict 至少是 1 个元素大小的。

numpy()

将 tensordict 转换为 (可能是嵌套的) numpy 数组字典。

非张量数据按原样公开。

示例

>>> from tensordict import TensorDict
>>> import torch
>>> data = TensorDict({"a": {"b": torch.zeros(()), "c": "a string!"}})
>>> print(data)
TensorDict(
    fields={
        a: TensorDict(
            fields={
                b: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
                c: NonTensorData(data=a string!, batch_size=torch.Size([]), device=None)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> print(data.numpy())
{'a': {'b': array(0., dtype=float32), 'c': 'a string!'}}
param_count(*, count_duplicates: bool = True) int

计算参数的数量 (可索引项目的总数),仅考虑张量。

关键字参数:

count_duplicates (bool) – 是否将重复的张量视为独立的。 如果为 False,则只会丢弃完全相同的张量(来自公共基础张量的相同视图但不同的 ID 将被计算两次)。 默认为 True(假设每个张量都是单个副本)。

parameters(recurse: bool = True) Iterator[Parameter]

返回模块参数的迭代器。

这通常传递给优化器。

参数:

recurse (bool) – 如果为 True,则产生此模块和所有子模块的参数。 否则,仅产生作为此模块直接成员的参数。

Yields:

Parameter – 模块参数

示例

>>> # xdoctest: +SKIP("undefined vars")
>>> for param in model.parameters():
>>>     print(type(param), param.size())
<class 'torch.Tensor'> (20L,)
<class 'torch.Tensor'> (20L, 1L, 5L, 5L)
permute(*args, **kwargs)

返回一个 tensordict 的视图,其中批次维度根据 dims 排列。

参数:
  • *dims_list (int) – tensordict 批次维度的新顺序。 或者,可以提供一个整数的可迭代对象。

  • dims (int 列表) – 调用 permute(…) 的另一种方式。

返回值:

一个新的 tensordict,其批次维度按照所需的顺序排列。

示例

>>> tensordict = TensorDict({"a": torch.randn(3, 4, 5)}, [3, 4])
>>> print(tensordict.permute([1, 0]))
PermutedTensorDict(
    source=TensorDict(
        fields={
            a: Tensor(torch.Size([3, 4, 5]), dtype=torch.float32)},
        batch_size=torch.Size([3, 4]),
        device=cpu,
        is_shared=False),
    op=permute(dims=[1, 0]))
>>> print(tensordict.permute(1, 0))
PermutedTensorDict(
    source=TensorDict(
        fields={
            a: Tensor(torch.Size([3, 4, 5]), dtype=torch.float32)},
        batch_size=torch.Size([3, 4]),
        device=cpu,
        is_shared=False),
    op=permute(dims=[1, 0]))
>>> print(tensordict.permute(dims=[1, 0]))
PermutedTensorDict(
    source=TensorDict(
        fields={
            a: Tensor(torch.Size([3, 4, 5]), dtype=torch.float32)},
        batch_size=torch.Size([3, 4]),
        device=cpu,
        is_shared=False),
    op=permute(dims=[1, 0]))
pin_memory(*args, **kwargs)

在存储的张量上调用 pin_memory()

参数:
  • num_threads (intstr) – 如果提供,则用于在叶子上调用 pin_memory 的线程数。 默认为 None,这会在 ThreadPoolExecutor(max_workers=None) 中设置大量的线程。 要在主线程上执行对 pin_memory() 的所有调用,请传递 num_threads=0

  • inplace (bool, 可选) – 如果 True,则 tensordict 会被就地修改。 默认为 False

pin_memory_(num_threads: int | str = 0) T

在存储的张量上调用 pin_memory() 并返回就地修改的 TensorDict。

参数:

num_threads (intstr) – 如果提供,则用于在叶子上调用 pin_memory 的线程数。 如果传递 "auto",则会自动确定线程数。

pop(key: NestedKey, default: Any = _NoDefault.ZERO) Tensor

从 tensordict 中移除并返回一个值。

如果该值不存在且未提供默认值,则会抛出 KeyError。

参数:
  • key (str嵌套键) – 要查找的条目。

  • default (Any, 可选) – 如果找不到键,则返回的值。

示例

>>> td = TensorDict({"1": 1}, [])
>>> one = td.pop("1")
>>> assert one == 1
>>> none = td.pop("1", default=None)
>>> assert none is None
popitem()

移除最后插入 TensorDict 的项。

popitem 将仅返回非嵌套值。

pow(other: tensordict.base.TensorDictBase | torch.Tensor, *, default: str | torch.Tensor | None = None) T

计算 self 中每个元素的 other 次幂,并返回一个包含结果的张量。

other 可以是单个 float 数字,TensorTensorDict

other 是一个张量时,inputother 的形状必须是可广播的。

参数:

other (float, tensortensordict) – 指数值

关键字参数:

default (torch.Tensorstr, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递 default="intersection",则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default 将用于操作两侧所有缺失的条目。

pow_(other: tensordict.base.TensorDictBase | torch.Tensor) T

pow() 的原地 (in-place) 版本。

注意

原地 (Inplace) pow 不支持 default 关键字参数。

prod(dim: Union[int, Tuple[int], Literal['feature']] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, dtype: Optional[dtype] = None, reduce: Optional[bool] = None) tensordict.base.TensorDictBase | torch.Tensor

返回输入 tensordict 中所有元素的乘积。

参数:
  • dim (int, int 的元组, 可选) – 如果 None,则返回包含所有叶子节点的乘积值的无维度 tensordict(如果可以计算)。 如果是整数或整数元组,则仅当此维度与 tensordict 形状兼容时,才会在指定的维度上调用 prod。 当前仅允许使用 “feature” 字符串。 使用 dim=”feature” 将实现对所有特征维度的缩减。 如果 reduce=True,将返回 TensorDict 批大小形状的张量。 否则,将返回与 self 具有相同结构的新 tensordict,但特征维度已减少。

  • keepdim (bool) – 输出张量是否保留 dim。

关键字参数:
  • dtype (torch.dtype, 可选) – 返回张量的所需数据类型。如果指定,输入张量在执行操作之前会被强制转换为 dtype。这对于防止数据类型溢出非常有用。默认值:None

  • reduce (bool, 可选) – 如果为 True,则将在所有 TensorDict 值上进行规约,并返回单个规约后的 tensor。默认为 False

示例

>>> from tensordict import TensorDict
>>> import torch
>>> td = TensorDict(
...     a=torch.randn(3, 4, 5),
...     b=TensorDict(
...         c=torch.randn(3, 4, 5, 6),
...         d=torch.randn(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.prod(dim=0)
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([4, 5]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([4]),
    device=None,
    is_shared=False)
>>> td.prod()
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> td.prod(reduce=True)
tensor(-0.)
>>> td.prod(dim="feature")
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([3, 4, 5]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([3, 4]),
    device=None,
    is_shared=False)
>>> td = TensorDict(
...     a=torch.ones(3, 4, 5),
...     b=TensorDict(
...         c=torch.ones(3, 4, 5),
...         d=torch.ones(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.prod(reduce=True, dim="feature")
tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]])
>>> td.prod(reduce=True, dim=0)
tensor([[1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.]])
qint32()

将所有张量转换为 torch.qint32

qint8()

将所有张量转换为 torch.qint8

quint4x2()

将所有张量转换为 torch.quint4x2

quint8()

将所有张量转换为 torch.quint8

reciprocal() T

计算 TensorDict 中每个元素的 reciprocal() 值。

reciprocal_() T

原地 (in-place) 计算 TensorDict 中每个元素的 reciprocal() 值。

record_stream(stream: Stream) T

将 tensordict 标记为已被该流使用。

当 tensordict 被释放时,确保张量内存不会被其他张量重用,直到在释放时流上排队的所有工作完成为止。

有关更多信息,请参见 record_stream()

recv(src: int, *, group: 'torch.distributed.ProcessGroup' | None = None, init_tag: int = 0, pseudo_rand: bool = False) int

接收 tensordict 的内容并使用它更新内容。

请查看 send 方法中的示例以了解上下文。

参数:

src (int) – 源 worker 的排名。

关键字参数:
  • group (torch.distributed.ProcessGroup, 可选) – 如果设置,将使用指定的进程组进行通信。否则,将使用默认进程组。默认为 None

  • init_tag (int) – 源 worker 使用的 init_tag

  • pseudo_rand (bool) – 如果为 True,则标签序列将是伪随机的,允许从不同的节点发送多个数据而不会重叠。 请注意,这些伪随机数的生成成本很高(1e-5 秒/数字),这意味着它可能会减慢算法的运行时。 此值必须与传递给 send() 的值匹配。 默认为 False

reduce(dst, op=None, async_op=False, return_premature=False, group=None) None

在所有机器上缩减 tensordict。

只有具有 rank dst 的进程才会收到最终结果。

refine_names(*names) T

根据名称细化 self 的维度名称。

细化是重命名的一种特殊情况,它“提升”了未命名的维度。 可以将 None 维度细化为具有任何名称; 命名的维度只能细化为具有相同的名称。

由于命名张量可以与未命名张量共存,因此细化名称提供了一种编写命名张量感知代码的好方法,该代码可以与命名张量和未命名张量一起使用。

名称最多可以包含一个省略号 (…)。 省略号被贪婪地扩展; 它被就地扩展以使用 self.names 中相应索引的名称,将名称填充到与 self.dim() 相同的长度。

返回:与输入相同,但维度根据输入命名的 tensordict。

示例

>>> td = TensorDict({}, batch_size=[3, 4, 5, 6])
>>> tdr = td.refine_names(None, None, None, "d")
>>> assert tdr.names == [None, None, None, "d"]
>>> tdr = td.refine_names("a", None, None, "d")
>>> assert tdr.names == ["a", None, None, "d"]
register_backward_hook(hook: Callable[[Module, Union[tuple[torch.Tensor, ...], Tensor], Union[tuple[torch.Tensor, ...], Tensor]], Union[None, tuple[torch.Tensor, ...], Tensor]]) RemovableHandle

在模块上注册一个反向钩子。

此函数已被弃用,推荐使用 register_full_backward_hook(),并且此函数的行为将在未来版本中更改。

返回值:

一个句柄,可用于通过调用 handle.remove() 来删除添加的钩子。

返回类型:

torch.utils.hooks.RemovableHandle

register_buffer(name: str, tensor: Optional[Tensor], persistent: bool = True) None

向模块添加一个缓冲区。

这通常用于注册一个不应被视为模型参数的缓冲区。 例如,BatchNorm 的 running_mean 不是一个参数,但它是模块状态的一部分。 默认情况下,缓冲区是持久的,并将与参数一起保存。 可以通过将 persistent 设置为 False 来更改此行为。 持久缓冲区和非持久缓冲区之间的唯一区别是后者不会是此模块的 state_dict 的一部分。

可以使用给定的名称作为属性访问缓冲区。

参数:
  • name (str) – 缓冲区的名称。 可以使用给定的名称从此模块访问缓冲区

  • tensor (TensorNone) – 要注册的缓冲区。 如果 None,则忽略在缓冲区上运行的操作,例如 cuda。 如果 None,则缓冲区包含在模块的 state_dict 中。

  • persistent (bool) – 缓冲区是否是此模块的 state_dict 的一部分。

示例

>>> # xdoctest: +SKIP("undefined vars")
>>> self.register_buffer('running_mean', torch.zeros(num_features))
register_forward_hook(hook: Union[Callable[[T, tuple[Any, ...], Any], Optional[Any]], Callable[[T, tuple[Any, ...], dict[str, Any], Any], Optional[Any]]], *, prepend: bool = False, with_kwargs: bool = False, always_call: bool = False) RemovableHandle

在模块上注册一个前向钩子。

每次 forward() 计算出一个输出后,都会调用该钩子。

如果 with_kwargsFalse 或未指定,则输入仅包含传递给模块的位置参数。 关键字参数不会传递给钩子,仅传递给 forward。 钩子可以修改输出。 它可以就地修改输入,但由于在调用 forward() 之后调用它,因此它不会对前向产生影响。 钩子应具有以下签名

hook(module, args, output) -> None or modified output

如果 with_kwargsTrue,则前向 hook 将会接收传递给前向函数的 kwargs,并应返回可能被修改的输出。该 hook 应具有以下签名:

hook(module, args, kwargs, output) -> None or modified output
参数:
  • hook (Callable) – 要注册的用户定义的 hook。

  • prepend (bool) – 如果 True,则提供的 hook 将在此 torch.nn.modules.Module 上所有现有 forward hook 之前触发。否则,提供的 hook 将在此 torch.nn.modules.Module 上所有现有 forward hook 之后触发。请注意,使用 register_module_forward_hook() 注册的全局 forward hook 将在通过此方法注册的所有 hook 之前触发。 默认值:False

  • with_kwargs (bool) – 如果 True,则 hook 将接收传递给前向函数的 kwargs。 默认值:False

  • always_call (bool) – 如果 True,则无论在调用 Module 时是否引发异常,都会运行 hook。 默认值:False

返回值:

一个句柄,可用于通过调用 handle.remove() 来删除添加的钩子。

返回类型:

torch.utils.hooks.RemovableHandle

register_forward_pre_hook(hook: Union[Callable[[T, tuple[Any, ...]], Optional[Any]], Callable[[T, tuple[Any, ...], dict[str, Any]], Optional[tuple[Any, dict[str, Any]]]]], *, prepend: bool = False, with_kwargs: bool = False) RemovableHandle

在模块上注册一个前向预处理 hook。

每次调用 forward() 之前,都会调用该 hook。

如果 with_kwargs 为 false 或未指定,则输入仅包含传递给模块的位置参数。关键字参数不会传递给 hook,而只会传递给 forward。该 hook 可以修改输入。用户可以在 hook 中返回一个元组或一个单独的修改值。如果返回单个值(除非该值已经是元组),我们将把该值包装到一个元组中。该 hook 应具有以下签名:

hook(module, args) -> None or modified input

如果 with_kwargs 为 true,则前向预处理 hook 将会接收传递给前向函数的 kwargs。如果 hook 修改了输入,则应同时返回 args 和 kwargs。该 hook 应具有以下签名:

hook(module, args, kwargs) -> None or a tuple of modified input and kwargs
参数:
  • hook (Callable) – 要注册的用户定义的 hook。

  • prepend (bool) – 如果为 true,则提供的 hook 将在此 torch.nn.modules.Module 上所有现有 forward_pre hook 之前触发。 否则,提供的 hook 将在此 torch.nn.modules.Module 上所有现有 forward_pre hook 之后触发。 请注意,使用 register_module_forward_pre_hook() 注册的全局 forward_pre hook 将在通过此方法注册的所有 hook 之前触发。 默认值:False

  • with_kwargs (bool) – 如果为 true,则 hook 将接收传递给前向函数的 kwargs。 默认值:False

返回值:

一个句柄,可用于通过调用 handle.remove() 来删除添加的钩子。

返回类型:

torch.utils.hooks.RemovableHandle

register_full_backward_hook(hook: Callable[[Module, Union[tuple[torch.Tensor, ...], Tensor], Union[tuple[torch.Tensor, ...], Tensor]], Union[None, tuple[torch.Tensor, ...], Tensor]], prepend: bool = False) RemovableHandle

在模块上注册一个反向钩子。

每次计算模块的梯度时,都会调用该 hook,即,当且仅当计算模块输出的梯度时,才会执行该 hook。该 hook 应具有以下签名:

hook(module, grad_input, grad_output) -> tuple(Tensor) or None

grad_inputgrad_output 是元组,分别包含相对于输入和输出的梯度。Hook 不应该修改其参数,但可以选择性地返回相对于输入的新梯度,该梯度将代替 grad_input 用于后续计算。grad_input 只对应于作为位置参数给出的输入,所有 kwarg 参数都会被忽略。对于所有非 Tensor 参数,grad_inputgrad_output 中的条目都将为 None

由于技术原因,当此 hook 应用于 Module 时,其 forward 函数将接收传递给 Module 的每个 Tensor 的视图。同样,调用者将接收由 Module 的 forward 函数返回的每个 Tensor 的视图。

警告

在使用 backward hooks 时,不允许就地修改输入或输出,否则会引发错误。

参数:
  • hook (Callable) – 要注册的,用户定义的 hook。

  • prepend (bool) – 如果为 true,则提供的 hook 将在该 torch.nn.modules.Module 上的所有现有 backward hooks 之前触发。否则,提供的 hook 将在该 torch.nn.modules.Module 上的所有现有 backward hooks 之后触发。请注意,使用 register_module_full_backward_hook() 注册的全局 backward hooks 将在通过此方法注册的所有 hooks 之前触发。

返回值:

一个句柄,可用于通过调用 handle.remove() 来删除添加的钩子。

返回类型:

torch.utils.hooks.RemovableHandle

register_full_backward_pre_hook(hook: Callable[[Module, Union[tuple[torch.Tensor, ...], Tensor]], Union[None, tuple[torch.Tensor, ...], Tensor]], prepend: bool = False) RemovableHandle

在模块上注册一个 backward pre-hook。

每次计算模块的梯度时,都会调用该 hook。该 hook 应具有以下签名

hook(module, grad_output) -> tuple[Tensor] or None

grad_output 是一个元组。 Hook 不应该修改其参数,但可以选择性地返回相对于输出的新梯度,该梯度将代替 grad_output 用于后续计算。对于所有非 Tensor 参数,grad_output 中的条目都将为 None

由于技术原因,当此 hook 应用于 Module 时,其 forward 函数将接收传递给 Module 的每个 Tensor 的视图。同样,调用者将接收由 Module 的 forward 函数返回的每个 Tensor 的视图。

警告

在使用 backward hooks 时,不允许就地修改输入,否则会引发错误。

参数:
  • hook (Callable) – 要注册的,用户定义的 hook。

  • prepend (bool) – 如果为 true,则提供的 hook 将在该 torch.nn.modules.Module 上的所有现有 backward_pre hooks 之前触发。否则,提供的 hook 将在该 torch.nn.modules.Module 上的所有现有 backward_pre hooks 之后触发。请注意,使用 register_module_full_backward_pre_hook() 注册的全局 backward_pre hooks 将在通过此方法注册的所有 hooks 之前触发。

返回值:

一个句柄,可用于通过调用 handle.remove() 来删除添加的钩子。

返回类型:

torch.utils.hooks.RemovableHandle

register_get_post_hook(hook)

注册一个 hook,以便在对叶张量执行任何 get 操作后调用它。

register_load_state_dict_post_hook(hook)

注册一个 post-hook,以便在调用模块的 load_state_dict() 后运行。

它应该具有以下签名:

hook(module, incompatible_keys) -> None

module 参数是注册此 hook 的当前模块,incompatible_keys 参数是一个 NamedTuple,由属性 missing_keysunexpected_keys 组成。 missing_keys 是一个 liststr,包含缺失的键,而 unexpected_keys 是一个 liststr,包含意外的键。

如果需要,可以就地修改给定的 incompatible_keys。

请注意,当使用 strict=True 调用 load_state_dict() 时执行的检查会受到 hook 对 missing_keysunexpected_keys 所做修改的影响,正如预期的那样。 向任一键集添加内容将导致在 strict=True 时抛出错误,而清除缺失和意外的键将避免错误。

返回值:

一个句柄,可用于通过调用 handle.remove() 来删除添加的钩子。

返回类型:

torch.utils.hooks.RemovableHandle

register_load_state_dict_pre_hook(hook)

注册一个 pre-hook,以便在调用模块的 load_state_dict() 之前运行。

它应该具有以下签名:

hook(module, state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs) -> None # noqa: B950

参数:

hook (Callable) – 将在加载 state dict 之前调用的可调用 hook。

register_module(name: str, module: Optional[Module]) None

add_module() 的别名。

register_parameter(name: str, param: Optional[Parameter]) None

向模块添加参数。

可以使用给定的名称作为属性访问该参数。

参数:
  • name (str) – 参数的名称。可以使用给定的名称从该模块访问该参数

  • param (ParameterNone) – 要添加到模块的参数。如果 None,则忽略在参数上运行的操作,例如 cuda。如果 None,则该参数包含在模块的 state_dict 中。

register_state_dict_post_hook(hook)

state_dict() 方法注册一个后置钩子 (post-hook)。

它应该具有以下签名:

hook(module, state_dict, prefix, local_metadata) -> None

注册的钩子可以就地修改 state_dict

register_state_dict_pre_hook(hook)

state_dict() 方法注册一个前置钩子 (pre-hook)。

它应该具有以下签名:

hook(module, prefix, keep_vars) -> None

注册的钩子可用于在进行 state_dict 调用之前执行预处理。

rename(*names, **rename_map)

返回一个张量字典的克隆,其中维度已重命名。

示例

>>> td = TensorDict({}, batch_size=[1, 2, 3 ,4])
>>> td.names = list("abcd")
>>> td_rename = td.rename(c="g")
>>> assert td_rename.names == list("abgd")
rename_(*names, **rename_map)

rename() 相同,但执行就地重命名。

示例

>>> td = TensorDict({}, batch_size=[1, 2, 3 ,4])
>>> td.names = list("abcd")
>>> assert td.rename_(c="g")
>>> assert td.names == list("abgd")
rename_key_(old_key: NestedKey, new_key: NestedKey, safe: bool = False) TensorDictBase

使用新的字符串重命名键,并返回具有更新后的键名的相同张量字典。

参数:
  • old_key (str嵌套键) – 要重命名的键。

  • new_key (str嵌套键) – 条目的新名称。

  • safe (bool, 可选) – 如果 True,则当新键已存在于 TensorDict 中时,会引发错误。

返回值:

self

repeat(*repeats: int) TensorDictBase

沿指定维度重复此张量。

expand() 不同,此函数会复制张量的数据。

警告

repeat() 的行为与 repeat() 不同,但更类似于 numpy.tile()。对于类似于 numpy.repeat() 的运算符,请参阅 repeat_interleave()

参数:

repeat (torch.Size, int..., int 的元组int 的列表) – 沿每个维度重复此张量的次数。

示例

>>> import torch
>>>
>>> from tensordict import TensorDict
>>>
>>> td = TensorDict(
...     {
...         "a": torch.randn(3, 4, 5),
...         "b": TensorDict({
...             "c": torch.randn(3, 4, 10, 1),
...             "a string": "a string!",
...         }, batch_size=[3, 4, 10])
...     }, batch_size=[3, 4],
... )
>>> print(td.repeat(1, 2))
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([3, 8, 5]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                a string: NonTensorData(data=a string!, batch_size=torch.Size([3, 8, 10]), device=None),
                c: Tensor(shape=torch.Size([3, 8, 10, 1]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([3, 8, 10]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([3, 8]),
    device=None,
    is_shared=False)
repeat_interleave(*shape: int)

重复 TensorDict 的元素。

警告

这与 repeat() 不同,但类似于 numpy.repeat()

参数:
  • repeats (torch.Tensorint) – 每个元素的重复次数。repeats 被广播以适合给定轴的形状。

  • dim (int, 可选) – 沿其重复值的维度。默认情况下,使用展平的输入数组,并返回一个扁平的输出数组。

关键字参数:

output_size (int, 可选) – 给定轴的总输出大小(例如,重复的总和)。如果给定,它将避免计算张量字典的输出形状所需的流同步。

返回值:

重复的 TensorDict,其形状与输入相同,但沿给定轴除外。

示例

>>> import torch
>>>
>>> from tensordict import TensorDict
>>>
>>> td = TensorDict(
...     {
...         "a": torch.randn(3, 4, 5),
...         "b": TensorDict({
...             "c": torch.randn(3, 4, 10, 1),
...             "a string": "a string!",
...         }, batch_size=[3, 4, 10])
...     }, batch_size=[3, 4],
... )
>>> print(td.repeat_interleave(2, dim=0))
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([6, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                a string: NonTensorData(data=a string!, batch_size=torch.Size([6, 4, 10]), device=None),
                c: Tensor(shape=torch.Size([6, 4, 10, 1]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([6, 4, 10]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([6, 4]),
    device=None,
    is_shared=False)
replace(*args, **kwargs)

创建一个 tensordict 的浅拷贝,其中的条目已被替换。

接受一个未命名的参数,该参数必须是 TensorDictBase 子类的字典。 此外,可以使用命名的关键字参数更新第一级条目。

返回值:

如果输入不为空,则返回 self 的副本,其中的条目已更新。如果提供的是空字典或未提供字典,且 kwargs 为空,则返回 self

requires_grad_(requires_grad=True) T

更改是否应记录此张量的自动求导操作:就地设置此张量的 requires_grad 属性。

返回此 tensordict。

参数:

requires_grad (bool, optional) – 是否应记录此 tensordict 的自动求导操作。 默认为 True

reshape(*shape: int)

返回具有所需形状的连续的、重塑的张量。

参数:

*shape (int) – 生成的 tensordict 的新形状。

返回值:

一个带有重塑键的 TensorDict

示例

>>> td = TensorDict({
...     'x': torch.arange(12).reshape(3, 4),
... }, batch_size=[3, 4])
>>> td = td.reshape(12)
>>> print(td['x'])
torch.Tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
round() T

计算 TensorDict 中每个元素的 round() 值。

round_() T

就地计算 TensorDict 中每个元素的 round() 值。

save(prefix: Optional[str] = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False) T

将 tensordict 保存到磁盘。

此函数是 memmap() 的代理。

property saved_path

返回存储 memmap 保存的 TensorDict 的路径。

只要 is_memmap() 返回 False(例如,当 tensordict 被解锁时),此参数就会消失。

select(*keys: NestedKey, inplace: bool = False, strict: bool = True) T

选择 tensordict 的键,并返回一个新的仅包含所选键的 tensordict。

这些值不会被复制:就地修改原始或新 tensordict 的张量会导致两个 tensordict 都发生更改。

参数:
  • *keys (str) – 要选择的键

  • inplace (bool) – 如果为 True,则就地修剪 tensordict。 默认为 False

  • strict (bool, optional) – 选择不存在的键是否会返回错误。 默认值:True

返回值:

一个新的 tensordict(如果 inplace=True 则为同一个),仅包含所选键。

注意

要在 tensordict 中选择键并返回一个删除了这些键的 tensordict 版本,请参阅 split_keys() 方法。

示例

>>> from tensordict import TensorDict
>>> td = TensorDict({"a": 0, "b": {"c": 1, "d": 2}}, [])
>>> td.select("a", ("b", "c"))
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> td.select("a", "b")
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False),
                d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> td.select("this key does not exist", strict=False)
TensorDict(
    fields={
    },
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
send(dst: int, *, group: 'torch.distributed.ProcessGroup' | None = None, init_tag: int = 0, pseudo_rand: bool = False) None

将 tensordict 的内容发送给远程工作进程。

参数:

dst (int) – 目标 worker 的 rank,内容应发送到该 worker。

关键字参数:
  • group (torch.distributed.ProcessGroup, 可选) – 如果设置,将使用指定的进程组进行通信。否则,将使用默认进程组。默认为 None

  • init_tag (int) – 用于标记张量的初始标签。 请注意,它将增加 TensorDict 中包含的张量数量。

  • pseudo_rand (bool) – 如果为 True,则标签序列将是伪随机的,允许从不同节点发送多个数据而不会重叠。 请注意,生成这些伪随机数非常耗时(1e-5 秒/数字),这意味着它可能会降低算法的运行时。 默认为 False

示例

>>> from torch import multiprocessing as mp
>>> from tensordict import TensorDict
>>> import torch
>>>
>>>
>>> def client():
...     torch.distributed.init_process_group(
...         "gloo",
...         rank=1,
...         world_size=2,
...         init_method=f"tcp://localhost:10003",
...     )
...
...     td = TensorDict(
...         {
...             ("a", "b"): torch.randn(2),
...             "c": torch.randn(2, 3),
...             "_": torch.ones(2, 1, 5),
...         },
...         [2],
...     )
...     td.send(0)
...
>>>
>>> def server(queue):
...     torch.distributed.init_process_group(
...         "gloo",
...         rank=0,
...         world_size=2,
...         init_method=f"tcp://localhost:10003",
...     )
...     td = TensorDict(
...         {
...             ("a", "b"): torch.zeros(2),
...             "c": torch.zeros(2, 3),
...             "_": torch.zeros(2, 1, 5),
...         },
...         [2],
...     )
...     td.recv(1)
...     assert (td != 0).all()
...     queue.put("yuppie")
...
>>>
>>> if __name__=="__main__":
...     queue = mp.Queue(1)
...     main_worker = mp.Process(target=server, args=(queue,))
...     secondary_worker = mp.Process(target=client)
...
...     main_worker.start()
...     secondary_worker.start()
...     out = queue.get(timeout=10)
...     assert out == "yuppie"
...     main_worker.join()
...     secondary_worker.join()
separates(*keys: NestedKey, default: Any = _NoDefault.ZERO, strict: bool = True, filter_empty: bool = True) T

就地从 tensordict 中分离指定的键。

另请参阅

该方法等效于调用 split_keys(),并设置 inplace=True,用于单个拆分。

另请参阅

该方法等效于调用 exclude(),不同之处在于它返回数据的另一个拆分。

参数:
  • keys (NestedKey) – 要从 tensordict 分离的键。

  • default (Any, optional) – 当键缺失时要返回的值。如果未指定且 strict=True,则会引发异常。否则,任何缺失键的默认值将为 None,除非另有指定。

  • strict (bool, optional) – 如果 True,则在键缺失时会引发异常。默认为 True

  • filter_empty (bool, optional) – 如果 True,则将删除 self 中的空 tensordict。默认为 True

返回值:

分离的 tensordict。

返回类型:

T

示例

>>> td = TensorDict(
...     a=0,
...     b=0,
...     c=0,
...     d=0,
... )
>>> td_a_c = td.separates("a", "c")
>>> print(td_a_c)
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False),
        c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> print(td)
TensorDict(
    fields={
        b: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False),
        d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
set(key: NestedKey, item: Tensor, inplace: bool = False, **kwargs: Any) TensorDictBase

设置一个新的键值对。

参数:
  • key (str, tuple of str) – 要设置的键的名称。

  • item (torch.Tensor or equivalent, TensorDictBase instance) – 要存储在 tensordict 中的值。

  • inplace (bool, optional) – 如果 True 且某个键与 tensordict 中的现有键匹配,则将对该键值对进行就地更新。 如果 inplace 为 True 且找不到条目,则会添加该条目。 对于更严格的就地操作,请改用 set_()。 默认为 False

关键字参数:

non_blocking (bool, optional) – 如果 True 并且此复制发生在不同设备之间,则复制可能相对于主机异步发生。

返回值:

self

示例

>>> td = TensorDict({}, batch_size[3, 4])
>>> td.set("x", torch.randn(3, 4))
>>> y = torch.randn(3, 4, 5)
>>> td.set("y", y, inplace=True) # works, even if 'y' is not present yet
>>> td.set("y", torch.zeros_like(y), inplace=True)
>>> assert (y==0).all() # y values are overwritten
>>> td.set("y", torch.ones(5), inplace=True) # raises an exception as shapes mismatch
set_(key: NestedKey, item: Tensor) T

设置现有键的值,同时保留原始存储。

参数:
关键字参数:

non_blocking (bool, optional) – 如果 True 并且此复制发生在不同设备之间,则复制可能相对于主机异步发生。

返回值:

self

示例

>>> td = TensorDict({}, batch_size[3, 4])
>>> x = torch.randn(3, 4)
>>> td.set("x", x)
>>> td.set_("x", torch.zeros_like(x))
>>> assert (x == 0).all()
set_at_(key: NestedKey, value: Tensor, index: Union[None, int, slice, str, Tensor, List[Any], Tuple[Any, ...]]) T

index 指示的索引处就地设置值。

参数:
  • key (str, tuple of str) – 要修改的键。

  • value (torch.Tensor) – 要在索引 index 处设置的值

  • index (int, tensor or tuple) – 写入值的索引。

关键字参数:

non_blocking (bool, optional) – 如果 True 并且此复制发生在不同设备之间,则复制可能相对于主机异步发生。

返回值:

self

示例

>>> td = TensorDict({}, batch_size[3, 4])
>>> x = torch.randn(3, 4)
>>> td.set("x", x)
>>> td.set_at_("x", value=torch.ones(1, 4), index=slice(1))
>>> assert (x[0] == 1).all()
set_extra_state(state: Any) None

设置加载的 state_dict 中包含的额外状态。

load_state_dict() 调用此函数,以处理 state_dict 中找到的任何额外状态。如果需要在模块的 state_dict 中存储额外状态,请为你的模块实现此函数以及相应的 get_extra_state()

参数:

state (dict) – 来自 state_dict 的额外状态

set_non_tensor(key: NestedKey, value: Any)

使用 tensordict.tensorclass.NonTensorData 在 tensordict 中注册一个非张量值。

可以使用 TensorDictBase.get_non_tensor() 或直接使用 get 检索该值,这将返回 tensordict.tensorclass.NonTensorData 对象。

return: self

示例

>>> data = TensorDict({}, batch_size=[])
>>> data.set_non_tensor(("nested", "the string"), "a string!")
>>> assert data.get_non_tensor(("nested", "the string")) == "a string!"
>>> # regular `get` works but returns a NonTensorData object
>>> data.get(("nested", "the string"))
NonTensorData(
    data='a string!',
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
set_submodule(target: str, module: Module, strict: bool = False) None

设置由 target 指定的子模块,如果该子模块存在;否则,抛出错误。

注意

如果 strict 设置为 False (默认值),该方法将替换现有的子模块,或者如果父模块存在,则创建一个新的子模块。 如果 strict 设置为 True,该方法将仅尝试替换现有的子模块,如果该子模块不存在,则抛出错误。

例如,假设你有一个 nn.Module A,其结构如下:

A(
    (net_b): Module(
        (net_c): Module(
            (conv): Conv2d(3, 3, 3)
        )
        (linear): Linear(3, 3)
    )
)

(该图展示了一个 nn.Module AA 具有一个嵌套的子模块 net_b,它本身有两个子模块 net_clinear。然后, net_c 具有一个子模块 conv。)

要使用新的子模块 Linear 覆盖 Conv2d,您可以调用 set_submodule("net_b.net_c.conv", nn.Linear(1, 1)),其中 strict 可以是 TrueFalse

要将新的子模块 Conv2d 添加到现有的 net_b 模块,您可以调用 set_submodule("net_b.conv", nn.Conv2d(1, 1, 1))

在以上示例中,如果您设置 strict=True 并调用 set_submodule("net_b.conv", nn.Conv2d(1, 1, 1), strict=True),则会引发 AttributeError,因为 net_b 没有名为 conv 的子模块。

参数:
  • target – 要查找的 submodule 的完整字符串名称。(有关如何指定完整字符串,请参阅上面的示例。)

  • module – 要将子模块设置到的模块。

  • strict – 如果 False,该方法将替换现有的子模块,或者如果父模块存在,则创建一个新的子模块。 如果 True,该方法将仅尝试替换现有的子模块,如果该子模块不存在,则抛出错误。

引发:
  • ValueError – 如果 target 字符串为空,或者如果 module 不是 nn.Module 的实例。

  • AttributeError – 如果沿着 target 字符串产生的路径上的任何点,(子)路径解析为不存在的属性名称或不是 nn.Module 实例的对象。

setdefault(key: NestedKey, default: Tensor, inplace: bool = False) Tensor

如果 tensordict 中不存在 key ,则插入 key 条目,其值为 default

如果 tensordict 中存在 key ,则返回 key 的值;否则返回 default

参数:
  • key (strnested key) – 值的名称。

  • default (torch.Tensorcompatible type, TensorDictBase) – 如果 tensordict 中尚不存在该键,则将该值存储在 tensordict 中。

返回值:

tensordict 中键的值。如果先前未设置该键,则将为 default。

示例

>>> td = TensorDict({}, batch_size=[3, 4])
>>> val = td.setdefault("a", torch.zeros(3, 4))
>>> assert (val == 0).all()
>>> val = td.setdefault("a", torch.ones(3, 4))
>>> assert (val == 0).all() # output is still 0
property shape: Size

请参阅 batch_size

share_memory() T

请参阅 torch.Tensor.share_memory_()

share_memory_(*args, **kwargs)

将所有张量放置在共享内存中。

然后锁定 TensorDict,这意味着任何非就地写入操作都将引发异常(例如,重命名、设置或删除条目)。 相反,一旦 tensordict 被解锁,share_memory 属性将变为 False,因为不再保证跨进程标识。

返回值:

self

sigmoid() T

计算 TensorDict 中每个元素的 sigmoid() 值。

sigmoid_() T

就地计算 TensorDict 中每个元素的 sigmoid() 值。

sign() T

计算 TensorDict 中每个元素的 sign() 值。

sign_() T

就地计算 TensorDict 中每个元素的 sign() 值。

sin() T

计算 TensorDict 中每个元素的 sin() 值。

sin_() T

就地计算 TensorDict 中每个元素的 sin() 值。

sinh() T

计算 TensorDict 中每个元素的 sinh() 值。

sinh_() T

对 TensorDict 的每个元素执行原位 sinh() 值计算。

size(dim: Optional[int] = None) torch.Size | int

返回由 dim 指示的维度的大小。

如果未指定 dim,则返回 TensorDict 的 batch_size 属性。

softmax(dim: int, dtype: Optional[dtype] = None)

将 softmax 函数应用于 tensordict 元素。

参数:
  • dim (intints 元组) – 将计算 softmax 的 tensordict 维度。

  • dtype (torch.dtype, 可选) – 返回张量的期望数据类型。 如果指定,则在执行操作之前将输入张量转换为 dtype。 这对于防止数据类型溢出很有用。

property sorted_keys: list[tensordict._nestedkey.NestedKey]

返回按字母顺序排序的键。

不支持额外的参数。

如果 TensorDict 被锁定,则键将被缓存,直到 tensordict 被解锁以加快执行速度。

split(split_size: int | list[int], dim: int = 0) list[tensordict.base.TensorDictBase]

使用给定维度中的指定大小分割 TensorDict 中的每个张量,如 torch.split

返回一个 TensorDict 实例列表,其中包含分割块的视图。

参数:
  • split_size (intList(int)) – 单个块的大小或每个块的大小列表。

  • dim (int) – 用于分割张量的维度。

返回值:

具有给定维度中指定大小的 TensorDict 列表。

示例

>>> td = TensorDict({
...     'x': torch.arange(12).reshape(3, 4),
... }, batch_size=[3, 4])
>>> td0, td1 = td.split([1, 2], dim=0)
>>> print(td0['x'])
torch.Tensor([[0, 1, 2, 3]])
split_keys(*key_sets, inplace=False, default: Any = _NoDefault.ZERO, strict: bool = True, reproduce_struct: bool = False) Tuple[T, ...]

将 tensordict 分割为给定一个或多个键集的子集。

该方法将返回 N+1 个 tensordict,其中 N 是提供的参数数量。

参数:
  • key_sets (Dict[in_key, out_key] 序列或 键列表) – 各种拆分。

  • inplace (bool, 可选) – 如果为 True,则键将从 self 中原位删除。 默认为 False

  • default (Any, 可选) – 缺少键时要返回的值。 如果未指定且 strict=True,则会引发异常。

  • strict (bool, optional) – 如果 True,则在键缺失时会引发异常。默认为 True

  • reproduce_struct (bool, 可选) – 如果为 True,则所有返回的 tensordict 都具有与 self 相同的树结构,即使某些子 tensordict 不包含任何叶子。

注意

None 非张量值将被忽略且不会返回。

注意

该方法不检查提供的列表中是否存在重复项。

示例

>>> td = TensorDict(
...     a=0,
...     b=0,
...     c=0,
...     d=0,
... )
>>> td_a, td_bc, td_d = td.split_keys(["a"], ["b", "c"])
>>> print(td_bc)
sqrt()

计算 self 的逐元素平方根。

sqrt_()

sqrt() 的原位版本。

squeeze(*args, **kwargs)

压缩 -self.batch_dims+1self.batch_dims-1 之间的维度的所有张量,并在新的 tensordict 中返回它们。

参数:

dim (Optional[int]) – 要沿其压缩的维度。 如果 dim 是 None,则将压缩所有单例维度。 默认为 None

示例

>>> td = TensorDict({
...     'x': torch.arange(24).reshape(3, 1, 4, 2),
... }, batch_size=[3, 1, 4])
>>> td = td.squeeze()
>>> td.shape
torch.Size([3, 4])
>>> td.get("x").shape
torch.Size([3, 4, 2])

此操作也可以用作上下文管理器。 对原始 tensordict 的更改将发生在外部,即不会更改原始张量的内容。 这也假设 tensordict 未被锁定(否则,需要解锁 tensordict)。 此功能与隐式压缩兼容。

>>> td = TensorDict({
...     'x': torch.arange(24).reshape(3, 1, 4, 2),
... }, batch_size=[3, 1, 4])
>>> with td.squeeze(1) as tds:
...     tds.set("y", torch.zeros(3, 4))
>>> assert td.get("y").shape == [3, 1, 4]
classmethod stack(input, dim=0, *, out=None)

将 tensordict 沿给定维度堆叠到单个 tensordict 中。

此调用等效于调用 torch.stack() 但与 torch.compile 兼容。

stack_from_tensordict(dim: int = 0, *, sorted: Optional[Union[bool, List[NestedKey]]] = None, out: Optional[Tensor] = None) Tensor

将tensordict中的所有条目堆叠成单个张量。

参数:

dim (int, 可选) – 条目应沿其堆叠的维度。

关键字参数:
  • sorted (boolNestedKey 的列表) – 如果 True,条目将按字母顺序堆叠。 如果 False (默认),将使用字典顺序。 或者,可以提供键名称的列表,并且张量将相应地堆叠。 这会产生一些开销,因为将根据 tensordict 中的叶名称列表检查键列表。

  • out (torch.Tensor, 可选) – 用于堆叠操作的可选目标张量。

stack_tensors(*keys: NestedKey, out_key: NestedKey, dim: int = 0, keep_entries: bool = False) T

将条目堆叠到新条目中,并可能删除原始值。

参数:

keys (NestedKey 的序列) – 要堆叠的条目。

关键字参数

out_key (NestedKey): 堆叠输入的新键名。 keep_entries (bool, optional): 如果 False, keys 中的条目将被删除。

默认为 False

dim (int, optional): 堆叠必须发生的维度。

默认为 0

返回: self

示例

>>> td = TensorDict(a=torch.zeros(()), b=torch.ones(()))
>>> td.stack_tensors("a", "b", out_key="c")
>>> assert "a" not in td
>>> assert (td["c"] == torch.tensor([0, 1])).all()
state_dict(*args, destination=None, prefix='', keep_vars=False, flatten=True)

从 tensordict 生成 state_dict。

state-dict 的结构仍然是嵌套的,除非 flatten 设置为 True

tensordict state-dict 包含重建 tensordict 所需的所有张量和元数据(当前不支持名称)。

参数:
  • destination (dict, 可选) – 如果提供,tensordict 的状态将更新到 dict 中,并返回相同的对象。 否则,将创建并返回一个 OrderedDict。 默认值:None

  • prefix (str, 可选) – 添加到张量名称的前缀,用于组成 state_dict 中的键。 默认值:''

  • keep_vars (bool, 可选) – 默认情况下,在状态字典中返回的 torch.Tensor 项与 autograd 分离。 如果设置为 True,则不会执行分离。 默认值:False

  • flatten (bool, 可选) – 是否应使用 "." 字符来展平结构。 默认为 False

示例

>>> data = TensorDict({"1": 1, "2": 2, "3": {"3": 3}}, [])
>>> sd = data.state_dict()
>>> print(sd)
OrderedDict([('1', tensor(1)), ('2', tensor(2)), ('3', OrderedDict([('3', tensor(3)), ('__batch_size', torch.Size([])), ('__device', None)])), ('__batch_size', torch.Size([])), ('__device', None)])
>>> sd = data.state_dict(flatten=True)
OrderedDict([('1', tensor(1)), ('2', tensor(2)), ('3.3', tensor(3)), ('__batch_size', torch.Size([])), ('__device', None)])
std(dim: Union[int, Tuple[int], Literal['feature']] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, correction: int = 1, reduce: Optional[bool] = None) tensordict.base.TensorDictBase | torch.Tensor

返回输入 tensordict 中所有元素的标准偏差值。

参数:
  • dim (int, int 元组, 可选) – 如果为 None,则返回一个无维度 tensordict,其中包含所有叶子的总和值(如果可以计算)。 如果是整数或整数元组,则仅当此维度与 tensordict 形状兼容时,才会在指定的维度上调用 std。 目前仅允许使用 “feature” 字符串。 使用 dim=”feature” 将实现对所有特征维度的缩减。 如果 reduce=True,则将返回一个形状为 TensorDict 批大小的张量。 否则,将返回一个与 self 具有相同结构但缩减了特征维度的新 tensordict。

  • keepdim (bool) – 输出张量是否保留 dim。

关键字参数:
  • correction (int) – 样本大小和样本自由度之间的差值。 默认为 Bessel 校正,correction=1。

  • reduce (bool, 可选) – 如果为 True,则将在所有 TensorDict 值上进行规约,并返回单个规约后的 tensor。默认为 False

示例

>>> from tensordict import TensorDict
>>> import torch
>>> td = TensorDict(
...     a=torch.randn(3, 4, 5),
...     b=TensorDict(
...         c=torch.randn(3, 4, 5, 6),
...         d=torch.randn(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.std(dim=0)
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([4, 5]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([4]),
    device=None,
    is_shared=False)
>>> td.std()
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> td.std(reduce=True)
tensor(1.0006)
>>> td.std(dim="feature")
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([3, 4, 5]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([3, 4]),
    device=None,
    is_shared=False)
>>> td = TensorDict(
...     a=torch.ones(3, 4, 5),
...     b=TensorDict(
...         c=torch.ones(3, 4, 5),
...         d=torch.ones(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.std(reduce=True, dim="feature")
tensor([[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]])
>>> td.std(reduce=True, dim=0)
tensor([[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]])
sub(other: tensordict.base.TensorDictBase | torch.Tensor | float, *, alpha: float | None = None, default: str | torch.Tensor | None = None)

self 中减去 other,并按 alpha 缩放。

\[\text{{out}}_i = \text{{input}}_i - \text{{alpha}} \times \text{{other}}_i\]

支持广播、类型提升以及整数、浮点数和复数输入。

参数:

other (TensorDict, TensorNumber) – 要从 self 中减去的 tensor 或数字。

关键字参数:
  • alpha (数字) – other 的乘数。

  • default (torch.Tensorstr, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递 default="intersection",则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default 将用于操作两侧所有缺失的条目。

sub_(other: tensordict.base.TensorDictBase | torch.Tensor | float, alpha: Optional[float] = None)

sub() 的原地版本。

注意

原地 sub 不支持 default 关键字参数。

sum(dim: Union[int, Tuple[int], Literal['feature']] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, dtype: Optional[dtype] = None, reduce: Optional[bool] = None) tensordict.base.TensorDictBase | torch.Tensor

返回输入 tensordict 中所有元素的总和值。

参数:
  • dim (int, tuple of int, optional) – 如果 None,则返回一个包含所有叶子的总和值的无维度 tensordict(如果可以计算)。 如果是整数或整数元组,则仅当此维度与 tensordict 形状兼容时,才对指定维度调用 sum。 目前只允许使用 “feature” 字符串。 使用 dim=”feature” 将实现对所有特征维度的缩减。 如果 reduce=True,将返回一个与 TensorDict 的批大小形状相同的张量。 否则,将返回一个与 self 具有相同结构,但特征维度缩减的 tensordict。

  • keepdim (bool) – 输出张量是否保留 dim。

关键字参数:
  • dtype (torch.dtype, 可选) – 返回张量的所需数据类型。如果指定,输入张量在执行操作之前会被强制转换为 dtype。这对于防止数据类型溢出非常有用。默认值:None

  • reduce (bool, 可选) – 如果为 True,则将在所有 TensorDict 值上进行规约,并返回单个规约后的 tensor。默认为 False

示例

>>> from tensordict import TensorDict
>>> import torch
>>> td = TensorDict(
...     a=torch.randn(3, 4, 5),
...     b=TensorDict(
...         c=torch.randn(3, 4, 5, 6),
...         d=torch.randn(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.sum(dim=0)
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([4, 5]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([4]),
    device=None,
    is_shared=False)
>>> td.sum()
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> td.sum(reduce=True)
tensor(-0.)
>>> td.sum(dim="feature")
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([3, 4, 5]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([3, 4]),
    device=None,
    is_shared=False)
>>> td = TensorDict(
...     a=torch.ones(3, 4, 5),
...     b=TensorDict(
...         c=torch.ones(3, 4, 5),
...         d=torch.ones(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.sum(reduce=True, dim="feature")
tensor([[15., 15., 15., 15.],
        [15., 15., 15., 15.],
        [15., 15., 15., 15.]])
>>> td.sum(reduce=True, dim=0)
tensor([[9., 9., 9., 9., 9.],
        [9., 9., 9., 9., 9.],
        [9., 9., 9., 9., 9.],
        [9., 9., 9., 9., 9.]])
tan() T

计算 TensorDict 中每个元素的 tan() 值。

tan_() T

原地计算 TensorDict 中每个元素的 tan() 值。

tanh() T

计算 TensorDict 中每个元素的 tanh() 值。

tanh_() T

原地计算 TensorDict 中每个元素的 tanh() 值。

to(*args, **kwargs) TensorDictBase

将 TensorDictBase 子类映射到另一个设备、dtype 或另一个 TensorDictBase 子类(如果允许)。

不允许将张量转换为新的 dtype,因为 tensordict 不一定包含单一的张量 dtype。

参数:
  • device (torch.device, 可选) – tensordict 的所需设备。

  • dtype (torch.dtype, 可选) – tensordict 的所需浮点或复数 dtype。

  • tensor (torch.Tensor, 可选) – 张量,其 dtype 和设备是此 TensorDict 中所有张量的所需 dtype 和设备。

关键字参数:
  • non_blocking (bool, 可选) – 操作是否应为阻塞。

  • memory_format (torch.memory_format, 可选) – 此 tensordict 中 4D 参数和缓冲区的所需内存格式。

  • batch_size (torch.Size, 可选) – 输出的 tensordict 的结果批大小。

  • other (TensorDictBase, 可选) –

    TensorDict 实例,其 dtype 和 device 是此 TensorDict 中所有张量所需的 dtype 和 device。

    注意

    由于 TensorDictBase 实例没有 dtype,因此 dtype 从示例叶子节点收集。 如果有多个 dtype,则不进行 dtype 转换。

  • non_blocking_pin (bool, 可选) –

    如果 True, 张量在发送到设备之前会被 pinned。 这将异步完成,但可以通过 num_threads 参数来控制。

    注意

    调用 tensordict.pin_memory().to("cuda") 通常比 tensordict.to("cuda", non_blocking_pin=True) 慢得多,因为在第二种情况下 pin_memory 是异步调用的。 如果张量很大且数量众多,则多线程 pin_memory 通常是有益的:当要发送的张量太少时,生成线程和收集数据的开销会超过多线程的优势;如果张量很小,则迭代长列表的开销也大得惊人。

  • num_threads (intNone, 可选) – 如果 non_blocking_pin=True, 用于 pin_memory 的线程数。 默认情况下,将生成 max(1, torch.get_num_threads()) 个线程。 num_threads=0 将取消 pin_memory() 调用的任何多线程处理。

  • inplace (bool, 可选) – 如果 True, 数据将被直接写入同一个 tensordict 中。当构建 tensordict 的 CPU 开销受到限制时,这可能会显着加快速度。 默认为 False

返回值:

如果设备与 tensordict 设备不同和/或传递了 dtype,则返回一个新的 tensordict 实例。 否则,返回相同的 tensordict。 只有 batch_size 的修改才会就地进行。

注意

如果 TensorDict 已整合,则结果 TensorDict 也将整合。 每个新张量都将是投射到所需设备的整合存储上的一个视图。

示例

>>> data = TensorDict({"a": 1.0}, [], device=None)
>>> data_cuda = data.to("cuda:0")  # casts to cuda
>>> data_int = data.to(torch.int)  # casts to int
>>> data_cuda_int = data.to("cuda:0", torch.int)  # multiple casting
>>> data_cuda = data.to(torch.randn(3, device="cuda:0"))  # using an example tensor
>>> data_cuda = data.to(other=TensorDict({}, [], device="cuda:0"))  # using a tensordict example
to_dict(*, retain_none: bool = True) dict[str, Any]

返回一个字典,其中的键值对与 tensordict 的键值对匹配。

参数:

retain_none (bool) – 如果 True,则 tensorclass 实例中的 None 值将被写入字典中。 否则,它们将被丢弃。 默认值:True

to_empty(*, device: Optional[Union[int, str, device]], recurse: bool = True) T

将参数和缓冲区移动到指定的设备,而不复制存储。

参数:
  • device (torch.device) – 此模块中参数和所需的设备。

  • recurse (bool) – 子模块的参数和缓冲区是否应递归移动到指定的设备。

返回值:

self

返回类型:

模块

to_h5(filename, **kwargs)

将 tensordict 转换为具有 h5 后端的 PersistentTensorDict。

参数:
  • filename (strpath) – h5 文件的路径。

  • **kwargs – 要传递给 h5py.File.create_dataset() 的 kwargs。

返回值:

一个链接到新创建的文件的 PersitentTensorDict 实例。

示例

>>> import tempfile
>>> import timeit
>>>
>>> from tensordict import TensorDict, MemoryMappedTensor
>>> td = TensorDict({
...     "a": MemoryMappedTensor.from_tensor(torch.zeros(()).expand(1_000_000)),
...     "b": {"c": MemoryMappedTensor.from_tensor(torch.zeros(()).expand(1_000_000, 3))},
... }, [1_000_000])
>>>
>>> file = tempfile.NamedTemporaryFile()
>>> td_h5 = td.to_h5(file.name, compression="gzip", compression_opts=9)
>>> print(td_h5)
PersistentTensorDict(
    fields={
        a: Tensor(shape=torch.Size([1000000]), device=cpu, dtype=torch.float32, is_shared=False),
        b: PersistentTensorDict(
            fields={
                c: Tensor(shape=torch.Size([1000000, 3]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([1000000]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([1000000]),
    device=None,
    is_shared=False)
to_module(module: Module, *, inplace: bool | None = None, return_swap: bool = True, swap_dest=None, use_state_dict: bool = False, non_blocking: bool = False, memo=None)

递归地将 TensorDictBase 实例的内容写入给定的 nn.Module 属性。

to_module 也可以用作上下文管理器,以临时使用一系列参数/缓冲区填充模块(请参见下面的示例)。

参数:

module (nn.Module) – 一个要将参数写入的模块。

关键字参数:
  • inplace (bool, 可选) – 如果 True,则模块中的参数或张量将就地更新。 默认为 False

  • return_swap (bool, 可选) – 如果 True,则返回旧的参数配置。 默认为 False

  • swap_dest (TensorDictBase, 可选) – 如果 return_swapTrue,则应写入交换的 tensordict。

  • use_state_dict (bool, 可选) – 如果 True,则将使用 state-dict API 加载参数(包括 state-dict 钩子)。 默认为 False

  • non_blocking (bool, optional) – 如果 True 并且此复制发生在不同设备之间,则复制可能相对于主机异步发生。

示例

>>> from torch import nn
>>> module = nn.TransformerDecoder(
...     decoder_layer=nn.TransformerDecoderLayer(nhead=4, d_model=4),
...     num_layers=1)
>>> params = TensorDict.from_module(module)
>>> params.data.zero_()
>>> params.to_module(module)
>>> assert (module.layers[0].linear1.weight == 0).all()

将 tensordict 用作上下文管理器对于进行函数式调用很有用: .. rubric:: 示例

>>> from tensordict import from_module
>>> module = nn.TransformerDecoder(
...     decoder_layer=nn.TransformerDecoderLayer(nhead=4, d_model=4),
...     num_layers=1)
>>> params = TensorDict.from_module(module)
>>> params = params.data * 0 # Use TensorDictParams to remake these tensors regular nn.Parameter instances
>>> with params.to_module(module):
...     # Call the module with zeroed params
...     y = module(*inputs)
>>> # The module is repopulated with its original params
>>> assert (TensorDict.from_module(module) != 0).any()
返回值:

如果 return_swapTrue,则包含模块中值的 tensordict;否则,为 None

to_namedtuple(dest_cls: Optional[type] = None)

将 tensordict 转换为 namedtuple。

参数:

dest_cls (Type, 可选) – 要使用的可选的 namedtuple 类。

示例

>>> from tensordict import TensorDict
>>> import torch
>>> data = TensorDict({
...     "a_tensor": torch.zeros((3)),
...     "nested": {"a_tensor": torch.zeros((3)), "a_string": "zero!"}}, [3])
>>> data.to_namedtuple()
GenericDict(a_tensor=tensor([0., 0., 0.]), nested=GenericDict(a_tensor=tensor([0., 0., 0.]), a_string='zero!'))
to_padded_tensor(padding=0.0, mask_key: Optional[NestedKey] = None) T

将所有嵌套张量转换为填充版本,并相应地调整批次大小。

参数:
  • padding (float) – tensordict 中张量的填充值。默认为 0.0

  • mask_key (NestedKey, optional) – 如果提供,则写入有效值的掩码的键。如果异构维度不是 tensordict 批次大小的一部分,则会导致错误。默认为 None

to_pytree()

将 tensordict 转换为 PyTree。

如果 tensordict 不是从 pytree 创建的,此方法仅返回 self 而不做修改。

有关更多信息和示例,请参阅 from_pytree()

to_struct_array()

将 tensordict 转换为 numpy 结构化数组。

from_struct_array() - to_struct_array() 循环中,输入和输出数组的内容应匹配。但是,to_struct_array 不会保留原始数组的内存内容。

另请参阅

有关更多信息,请参阅 from_struct_array()

返回值:

输入 TensorDict 的 numpy 结构化数组表示。

示例

>>> import torch
>>> from tensordict import TensorDict
>>> td = TensorDict({'a': torch.tensor([1, 2, 3]), 'b': torch.tensor([4.0, 5.0, 6.0])}, batch_size=[3])
>>> arr = td.to_struct_array()
>>> print(arr)
[(1, 4.) (2, 5.) (3, 6.)]
to_tensordict(*, retain_none: bool | None = None)

从 TensorDictBase 返回一个常规的 TensorDict 实例。

参数:

retain_none (bool) –

如果 True,tensorclass 实例中的 None 值将被写入 tensordict。否则,它们将被丢弃。默认值:True

注意

从 v0.8 开始,默认值将切换为 False

返回值:

包含相同值的新的 TensorDict 对象。

train(mode: bool = True) T

将模块设置为训练模式。

这仅对某些模块有效。有关训练/评估模式下特定模块的行为的详细信息,请参阅特定模块的文档,例如,它们是否受到影响,例如 Dropout, BatchNorm, 等等。

参数:

mode (bool) – 是否设置训练模式 (True) 或评估模式 (False)。默认值:True

返回值:

self

返回类型:

模块

transpose(dim0, dim1)

返回一个转置版本的输入 tensordict。给定的维度 dim0dim1 被交换。

转置 tensordict 的就地或异地修改也会影响原始 tensordict,因为内存是共享的,并且操作会映射回原始 tensordict。

示例

>>> tensordict = TensorDict({"a": torch.randn(3, 4, 5)}, [3, 4])
>>> tensordict_transpose = tensordict.transpose(0, 1)
>>> print(tensordict_transpose.shape)
torch.Size([4, 3])
>>> tensordict_transpose.set("b",, torch.randn(4, 3))
>>> print(tensordict.get("b").shape)
torch.Size([3, 4])
trunc() T

计算 TensorDict 中每个元素的 trunc() 值。

trunc_() T

就地计算 TensorDict 中每个元素的 trunc() 值。

type(dst_type)

将所有张量强制转换为 dst_type

参数:

dst_type (typestring) – 所需的类型

uint16()

将所有张量强制转换为 torch.uint16

uint32()

将所有张量强制转换为 torch.uint32

uint64()

将所有张量强制转换为 torch.uint64

uint8()

将所有张量强制转换为 torch.uint8

unbind(dim: int) tuple[T, ...]

返回一个索引 tensordict 的元组,沿指示的维度解绑。

示例

>>> td = TensorDict({
...     'x': torch.arange(12).reshape(3, 4),
... }, batch_size=[3, 4])
>>> td0, td1, td2 = td.unbind(0)
>>> td0['x']
tensor([0, 1, 2, 3])
>>> td1['x']
tensor([4, 5, 6, 7])
unflatten(dim, unflattened_size)

展开一个 tensordict 维度,将其扩展为所需的形状。

参数:
  • dim (int) – 指定要展开的输入张量的维度。

  • unflattened_size (shape) – 是 tensordict 的展开维度的新形状。

示例

>>> td = TensorDict({
...     "a": torch.arange(60).view(3, 4, 5),
...     "b": torch.arange(12).view(3, 4)},
...     batch_size=[3, 4])
>>> td_flat = td.flatten(0, 1)
>>> td_unflat = td_flat.unflatten(0, [3, 4])
>>> assert (td == td_unflat).all()
unflatten_keys(separator: str = '.', inplace: bool = False) TensorDictBase

递归地将扁平的 tensordict 转换为嵌套的 tensordict。

TensorDict 类型将丢失,结果将是一个简单的 TensorDict 实例。嵌套 tensordict 的元数据将从根推断:数据树中的所有实例将共享相同的批次大小、维度名称和设备。

参数:
  • separator (str, optional) – 嵌套项之间的分隔符。默认为 '.'

  • inplace (bool, optional) – 如果 True,则结果 tensordict 将与调用它的 tensordict 具有相同的标识。默认为 False

示例

>>> data = TensorDict({"a": 1, "b - c": 2, "e - f - g": 3}, batch_size=[])
>>> data.unflatten_keys(separator=" - ")
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False),
        e: TensorDict(
            fields={
                f: TensorDict(
                    fields={
                        g: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)},
                    batch_size=torch.Size([]),
                    device=None,
                    is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)

此方法和 unflatten_keys() 在处理 state-dicts 时特别有用,因为它们可以无缝地将扁平字典转换为模仿模型结构的数据结构。

示例

>>> model = torch.nn.Sequential(torch.nn.Linear(3 ,4))
>>> ddp_model = torch.ao.quantization.QuantWrapper(model)
>>> state_dict = TensorDict(ddp_model.state_dict(), batch_size=[]).unflatten_keys(".")
>>> print(state_dict)
TensorDict(
    fields={
        module: TensorDict(
            fields={
                0: TensorDict(
                    fields={
                        bias: Tensor(shape=torch.Size([4]), device=cpu, dtype=torch.float32, is_shared=False),
                        weight: Tensor(shape=torch.Size([4, 3]), device=cpu, dtype=torch.float32, is_shared=False)},
                    batch_size=torch.Size([]),
                    device=None,
                    is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> model_state_dict = state_dict.get("module")
>>> print(model_state_dict)
TensorDict(
    fields={
        0: TensorDict(
            fields={
                bias: Tensor(shape=torch.Size([4]), device=cpu, dtype=torch.float32, is_shared=False),
                weight: Tensor(shape=torch.Size([4, 3]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> model.load_state_dict(dict(model_state_dict.flatten_keys(".")))
unlock_() T

解锁 tensordict 以进行非就地操作。

可以用作装饰器。

有关更多详细信息,请参阅 lock_()

unsqueeze(*args, **kwargs)

对所有张量沿 -td.batch_dimstd.batch_dims 之间的维度进行 unsqueeze 操作,并将它们返回到新的 tensordict 中。

参数:

dim (int) – 进行 unsqueeze 操作的维度

示例

>>> td = TensorDict({
...     'x': torch.arange(24).reshape(3, 4, 2),
... }, batch_size=[3, 4])
>>> td = td.unsqueeze(-2)
>>> td.shape
torch.Size([3, 1, 4])
>>> td.get("x").shape
torch.Size([3, 1, 4, 2])

此操作也可以用作上下文管理器。对原始 tensordict 的更改将在外部进行,即原始张量的内容不会被改变。这还假设 tensordict 没有被锁定(否则,需要解锁 tensordict)。

>>> td = TensorDict({
...     'x': torch.arange(24).reshape(3, 4, 2),
... }, batch_size=[3, 4])
>>> with td.unsqueeze(-2) as tds:
...     tds.set("y", torch.zeros(3, 1, 4))
>>> assert td.get("y").shape == [3, 4]
update(input_dict_or_td: dict[str, torch.Tensor] | tensordict.base.TensorDictBase, clone: bool = False, inplace: bool = False, *, non_blocking: bool = False, keys_to_update: Optional[Sequence[NestedKey]] = None, is_leaf: Optional[Callable[[Type], bool]] = None) TensorDictBase

使用字典或另一个 TensorDict 中的值更新 TensorDict。

参数:
  • input_dict_or_td (TensorDictBasedict) – 要写入 self 的输入数据。

  • clone (bool, optional) – 是否应在设置之前克隆输入(张量)字典中的张量。默认为 False

  • inplace (bool, optional) – 如果为 True 并且键与 tensordict 中的现有键匹配,则该键值对的更新将就地进行。 如果找不到该条目,则会将其添加。默认为 False

关键字参数:
  • keys_to_update (NestedKeys 序列, 可选) – 如果提供,则仅更新 key_to_update 中的键列表。 旨在避免调用 data_dest.update(data_src.select(*keys_to_update))

  • non_blocking (bool, optional) – 如果 True 并且此复制发生在不同设备之间,则复制可能相对于主机异步发生。

  • is_leaf (Callable[[Type], bool], optional) –

    一个可调用对象,指示对象类型是否应被视为叶子并进行交换或张量集合。

返回值:

self

示例

>>> td = TensorDict({}, batch_size=[3])
>>> a = torch.randn(3)
>>> b = torch.randn(3, 4)
>>> other_td = TensorDict({"a": a, "b": b}, batch_size=[])
>>> td.update(other_td, inplace=True) # writes "a" and "b" even though they can't be found
>>> assert td['a'] is other_td['a']
>>> other_td = other_td.clone().zero_()
>>> td.update(other_td)
>>> assert td['a'] is not other_td['a']
update_(input_dict_or_td: Union[dict[str, torch.Tensor], T], clone: bool = False, *, non_blocking: bool = False, keys_to_update: Optional[Sequence[NestedKey]] = None) T

使用字典或另一个 TensorDict 中的值就地更新 TensorDict。

update() 不同,如果 self 未知该键,此函数将抛出错误。

参数:
  • input_dict_or_td (TensorDictBasedict) – 要写入 self 的输入数据。

  • clone (bool, optional) – 是否应在设置之前克隆输入(张量)字典中的张量。默认为 False

关键字参数:
  • keys_to_update (NestedKeys 序列, 可选) – 如果提供,则仅更新 key_to_update 中的键列表。 旨在避免调用 data_dest.update_(data_src.select(*keys_to_update))

  • non_blocking (bool, optional) – 如果 True 并且此复制发生在不同设备之间,则复制可能相对于主机异步发生。

返回值:

self

示例

>>> a = torch.randn(3)
>>> b = torch.randn(3, 4)
>>> td = TensorDict({"a": a, "b": b}, batch_size=[3])
>>> other_td = TensorDict({"a": a*0, "b": b*0}, batch_size=[])
>>> td.update_(other_td)
>>> assert td['a'] is not other_td['a']
>>> assert (td['a'] == other_td['a']).all()
>>> assert (td['a'] == 0).all()
update_at_(input_dict_or_td: Union[dict[str, torch.Tensor], T], idx: Union[None, int, slice, str, Tensor, List[Any], Tuple[Any, ...]], clone: bool = False, *, non_blocking: bool = False, keys_to_update: Optional[Sequence[NestedKey]] = None) T

在指定的索引处,使用来自字典或另一个 TensorDict 的值,就地更新 TensorDict。

与 TensorDict.update 不同,如果 TensorDict 不知道该键,此函数将抛出错误。

参数:
  • input_dict_or_td (TensorDictBasedict) – 要写入 self 的输入数据。

  • idx (int, torch.Tensor, iterable, slice) – 应该发生更新的 tensordict 的索引。

  • clone (bool, optional) – 是否应在设置之前克隆输入(tensor)字典中的张量。 默认为 False

关键字参数:
  • keys_to_update (NestedKeys 的序列, optional) – 如果提供,则只会更新 key_to_update 中的键列表。

  • non_blocking (bool, optional) – 如果 True 并且此复制发生在不同设备之间,则复制可能相对于主机异步发生。

返回值:

self

示例

>>> td = TensorDict({
...     'a': torch.zeros(3, 4, 5),
...     'b': torch.zeros(3, 4, 10)}, batch_size=[3, 4])
>>> td.update_at_(
...     TensorDict({
...         'a': torch.ones(1, 4, 5),
...         'b': torch.ones(1, 4, 10)}, batch_size=[1, 4]),
...    slice(1, 2))
TensorDict(
    fields={
        a: Tensor(torch.Size([3, 4, 5]), dtype=torch.float32),
        b: Tensor(torch.Size([3, 4, 10]), dtype=torch.float32)},
    batch_size=torch.Size([3, 4]),
    device=None,
    is_shared=False)
>>> assert (td[1] == 1).all()
values(include_nested: bool = False, leaves_only: bool = False, is_leaf: Optional[Callable[[Type], bool]] = None, *, sort: bool = False) Iterator[Tensor]

返回一个生成器,表示 tensordict 的值。

参数:
  • include_nested (bool, optional) – 如果 True, 将返回嵌套的值。默认为 False

  • leaves_only (bool, optional) – 如果 False,则仅返回叶子节点。默认为 False

  • is_leaf (callable, optional) –

    一个可调用对象,接受一个类类型作为参数,返回一个布尔值,指示该类是否应被视为叶节点。

    注意

    is_leaf 的目的不是阻止对嵌套 tensordict 的递归调用,而是将某些类型标记为“叶节点”,以便在 leaves_only=True 时进行过滤。 即使 is_leaf(cls) 返回 True,如果 include_nested=True,tensordict 的嵌套结构仍将被遍历。 换句话说,is_leaf 不控制递归深度,而是提供了一种在 leaves_only=True 时从结果中过滤掉某些类型的方法。 这意味着树中的一个节点可以既是叶节点,又是带有子节点的节点。 实际上,is_leaf 的默认值会将 tensordict 和 tensorclass 实例从叶节点集中排除。

关键字参数:

sort (bool, optional) – 是否应该对键进行排序。对于嵌套键,键将根据它们的连接名称进行排序(即,("a", "key") 将被视为 "a.key" 进行排序)。请注意,处理大型 tensordict 时,排序可能会产生显着的开销。默认为 False

var(dim: Union[int, Tuple[int], Literal['feature']] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, correction: int = 1, reduce: Optional[bool] = None) tensordict.base.TensorDictBase | torch.Tensor

返回输入 tensordict 中所有元素的方差值。

参数:
  • dim (int, int 元组, optional) – 如果 None,则返回一个无量纲的 tensordict,其中包含所有叶节点的总和值(如果可以计算)。 如果是整数或整数元组,则仅当此维度与 tensordict 形状兼容时才对指定的维度调用 var。 目前只允许使用 “feature” 字符串。 使用 dim="feature" 将实现所有特征维度上的缩减。 如果 reduce=True,则将返回一个 TensorDict 批大小形状的张量。 否则,将返回一个与 self 具有相同结构的新 tensordict,其中包含缩减的特征维度。

  • keepdim (bool) – 输出张量是否保留 dim。

关键字参数:
  • correction (int) – 样本大小和样本自由度之间的差值。 默认为 Bessel 校正,correction=1。

  • reduce (bool, 可选) – 如果为 True,则将在所有 TensorDict 值上进行规约,并返回单个规约后的 tensor。默认为 False

示例

>>> from tensordict import TensorDict
>>> import torch
>>> td = TensorDict(
...     a=torch.randn(3, 4, 5),
...     b=TensorDict(
...         c=torch.randn(3, 4, 5, 6),
...         d=torch.randn(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.var(dim=0)
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([4, 5]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([4]),
    device=None,
    is_shared=False)
>>> td.var()
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([]),
    device=None,
    is_shared=False)
>>> td.var(reduce=True)
tensor(1.0006)
>>> td.var(dim="feature")
TensorDict(
    fields={
        a: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False),
        b: TensorDict(
            fields={
                c: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
                d: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([3, 4, 5]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([3, 4]),
    device=None,
    is_shared=False)
>>> td = TensorDict(
...     a=torch.ones(3, 4, 5),
...     b=TensorDict(
...         c=torch.ones(3, 4, 5),
...         d=torch.ones(3, 4, 5),
...         batch_size=(3, 4, 5),
...     ),
...     batch_size=(3, 4)
... )
>>> td.var(reduce=True, dim="feature")
tensor([[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]])
>>> td.var(reduce=True, dim=0)
tensor([[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]])
view(*shape: int, size: list | tuple | torch.Size | None = None, batch_size: torch.Size | None = None)

返回一个 tensordict,其中包含根据与 tensordict batch_size 兼容的新形状查看的张量。

或者,可以提供 dtype 作为第一个未命名参数。在这种情况下,所有张量都将使用相应的 dtype 查看。请注意,这假设新形状将与提供的 dtype 兼容。有关 dtype 视图的更多信息,请参见 view()

参数:
  • *shape (int) – 生成的 tensordict 的新形状。

  • dtype (torch.dtype) – 或者,用于表示张量内容的 dtype。

  • size – 可迭代对象

关键字参数:

batch_size (torch.Size, optional) – 如果提供了 dtype,则可以使用此关键字参数重置 batch_size。 如果调用带有 shape 的 view,则此操作无效。

返回值:

具有所需 batch_size 的新 tensordict。

示例

>>> td = TensorDict(source={'a': torch.zeros(3,4,5),
...    'b': torch.zeros(3,4,10,1)}, batch_size=torch.Size([3, 4]))
>>> td_view = td.view(12)
>>> print(td_view.get("a").shape)  # torch.Size([12, 5])
>>> print(td_view.get("b").shape)  # torch.Size([12, 10, 1])
>>> td_view = td.view(-1, 4, 3)
>>> print(td_view.get("a").shape)  # torch.Size([1, 4, 3, 5])
>>> print(td_view.get("b").shape)  # torch.Size([1, 4, 3, 10, 1])
where(condition, other, *, out=None, pad=None)

返回一个 TensorDict,其中包含从 self 或 other 中选择的元素,具体取决于 condition。

参数:
  • condition (BoolTensor) – 当 True (非零) 时,产生 self,否则产生 other

  • other (TensorDictBaseScalar) – 值 (如果 other 是标量) 或在 condition 为 False 的索引处选择的值。

关键字参数:
  • out (TensorDictBase, optional) – 输出 TensorDictBase 实例。

  • pad (scalar, optional) – 如果提供,则源或目标 tensordict 中缺少的键将写为 torch.where(mask, self, pad)torch.where(mask, pad, other)。 默认为 None,即不允许缺少键。

xpu(device: Optional[Union[int, device]] = None) T

将所有模型参数和缓冲区移动到 XPU。

这也会使关联的参数和缓冲区成为不同的对象。因此,如果模块将在 XPU 上进行优化,则应在构造优化器之前调用它。

注意

此方法会就地修改模块。

参数:

device (int, optional) – 如果指定,所有参数都将复制到该设备

返回值:

self

返回类型:

模块

zero_() T

就地将 tensordict 中的所有张量置零。

zero_grad(set_to_none: bool = True) T

递归地将 TensorDict 的所有梯度置零。

参数:

set_to_none (bool, optional) – 如果 True,则 tensor.grad 将为 None,否则为 0。 默认为 True

文档

Access comprehensive developer documentation for PyTorch

View Docs

教程

Get in-depth tutorials for beginners and advanced developers

View Tutorials

资源

Find development resources and get your questions answered

View Resources