快捷方式

NonTensorStack

class tensordict.NonTensorStack(*args, **kwargs)

LazyStackedTensorDict 的一个简单的封装,使得对非 tensor 数据进行堆叠更容易识别。

当在一个 NonTensorDataNonTensorStack 列表上调用 stack() 时,将返回一个 NonTensorStack

示例

>>> from tensordict import NonTensorData
>>> import torch
>>> data = torch.stack([
...     torch.stack([NonTensorData(data=(i, j), batch_size=[]) for i in range(2)])
...    for j in range(3)])
>>> print(data)
NonTensorStack(
    [[(0, 0), (1, 0)], [(0, 1), (1, 1)], [(0, 2), (1, ...,
    batch_size=torch.Size([3, 2]),
    device=None)

要获取存储在 NonTensorStack 中的值,请调用 tolist

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

other 乘以 alpha 后加到 self 上。

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

other (TensorDictBasetorch.Tensor) – 要加到 self 上的 tensor 或 TensorDict。

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

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

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

add() 的原地版本。

注意

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

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 (数字, 可选) – \(\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 (数字, 可选) – \(other1 .* other2\) 的乘数

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

addcmul() 的原地版本。

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

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

参数:

dim (int, 可选) – 如果为 None,则返回一个布尔值,指示是否所有 tensors 都返回 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: Optional[int] = None) bool | tensordict.base.TensorDictBase

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

参数:

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

append(tensordict: T) None

将 TensorDict 追加到堆栈上。

类似于 list.append。 追加的 TensorDict 必须具有兼容的 batch_size 和 device。 追加操作是就地操作,不返回任何内容。

参数:

tensordict (TensorDictBase) – 要追加到堆栈上的 TensorDict。

apply(fn: Callable, *others: T, 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: Optional[bool] = None, propagate_lock: bool = False, call_on_nested: bool = False, out: Optional[TensorDictBase] = None, **constructor_kwargs) Optional[T]

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

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

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

  • *others (TensorDictBase 实例, 可选) – 如果提供,这些 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)

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

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

  • *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 维度的整数。

property batch_size: Size

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

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

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

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

返回::

描述 TensorDict 批次大小的 Size 对象。

示例

>>> 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 之间执行按位 AND 运算。

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

other (TensorDictBasetorch.Tensor) – 用于执行按位 AND 运算的张量或 TensorDict。

关键字参数:

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

bool()

将所有张量转换为 torch.bool

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: Optional[Tensor] = None) Tensor

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

参数:

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

关键字参数:
  • sorted (bool or list of NestedKeys) – 如果 True,则条目将按字母顺序连接。如果 False(默认),将使用 dict 顺序。或者,可以提供一个键名列表,并且张量将相应地连接。这会产生一些开销,因为将对照 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() 值。

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 (TensorDictTensor) – 其他输入 tensordict 或 tensor。

关键字参数:

default (torch.Tensorstr, optional) – 用于独占条目的默认值。如果没有提供,则两个 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 (TensorDictTensor) – 其他输入 tensordict 或 tensor。

关键字参数:

default (torch.Tensorstr, optional) – 用于独占条目的默认值。如果没有提供,则两个 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, optional) – 如果 True,则 TensorDict 中包含的每个 tensor 也会被复制。 否则,只会复制 TensorDict 树结构。 默认为 True

注意

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

complex128()

将所有 tensor 强制转换为 torch.complex128

complex32()

将所有 tensor 强制转换为 torch.complex32

complex64()

将所有 tensor 强制转换为 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, 可选) – 用于 memory-mapped tensor 的可选文件路径,以用作 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, 可选) – 是否应将整合的数据放置在固定内存中。 默认为 False

  • metadata (bool, 可选) – 如果 True,元数据将与通用存储一起存储。 如果提供了文件名,则此操作无效。 当人们想要控制如何实现序列化时,存储元数据可能很有用,因为如果元数据可用或不可用,TensorDict 会以不同的方式处理已整合 TD 的 pickling/unpickling。

注意

如果 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() T

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

copy()

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

等效于 TensorDictBase.clone(recurse=False)

copy_(tensordict: T, non_blocking: bool = False) 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(**kwargs) T

将 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: Optional[int] = None, **kwargs) T

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

参数:

device (int, optional) – 如果提供,则为应该转换张量的 cuda 设备。

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

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

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

参数:

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

关键字参数:
  • reduce (bool, optional) – 如果 True,则将在所有 TensorDict 值上发生 reduciton,并且将返回单个缩减张量。默认为 False

  • return_argmins (bool, optional) – 当传递 dim 参数时,cummax() 返回具有值和索引的命名元组。等效于 TensorDict 的是返回一个具有 "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, optional) – 如果 True,则将在所有 TensorDict 值上发生 reduciton,并且将返回单个缩减张量。默认为 False

  • return_argmins (bool, optional) – 当传递 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

尝试返回堆栈中的唯一值。

如果存在多个唯一值,则引发 ValueError。

data_ptr(*, storage: bool = False)

返回 tensordict 叶子的 data_ptr。

这对于检查两个 tensordicts 是否共享相同的 data_ptr() 很有用。

关键字参数:

storage (bool, optional) – 如果 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 实例将显示为嵌套的 tensordicts,以反映其叶子的真实 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_(key: NestedKey, **kwargs: Any) T

删除 tensordict 的键。

参数:

key (NestedKey) – 要删除的键

返回::

self

densify(layout: layout = torch.strided)

尝试用连续张量(普通张量或嵌套张量)表示惰性堆栈。

关键字参数:

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

property depth: int

返回 tensordict 的深度 - 最大级别数。

最小深度为 0(无嵌套 tensordict)。

detach() T

分离 tensordict 中的张量。

返回::

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

detach_() T

就地分离 tensordict 中的张量。

返回::

self。

property device: torch.device | None

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, optional) – 用于独占条目的默认值。如果没有提供,则两个 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 (list of str, optional) – 维度名称。

entry_class(key: NestedKey) type

返回条目的类,可能避免调用 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() 值。

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: int, inplace: bool = False) 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() 值,并进行原地操作。

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

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

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

  • value (Numberbool) – 用于填充的值。

返回::

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, is_leaf: Optional[Callable[[Type], bool]] = None) T

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

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

参数:
  • separator (str, 可选) – 嵌套项之间的分隔符。

  • inplace (bool, 可选) – 如果 True,则生成的 tensordict 将与调用它的那个 tensordict 具有相同的标识。默认为 False

  • is_leaf (callable, 可选) –

    一个对类类型进行调用的可调用对象,返回一个布尔值,指示是否应将该类视为叶子节点。

    注意

    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() 在处理状态字典时特别有用,因为它们可以无缝地将平面字典转换为模拟模型结构的数据结构。

示例

>>> 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() 值,并进行原地操作。

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 构造函数少。它可以使用自定义启发式方法将数据结构(如数据类或元组)转换为 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)

将数据类转换为 TensorDict 实例。

参数:

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() 并返回张量兼容类 (tensorclass()) 或实例,而不是 TensorDict。默认为 False

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

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

返回::

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

Raises:

TypeError – 如果提供的输入不是数据类实例。

警告

此方法与自由函数 from_dataclass 不同,并且具有不同的目的。虽然自由函数返回张量兼容类或实例,但此方法返回 TensorDict 实例。

classmethod from_dict(input_dict: List[Dict[NestedKey, Any]], *other, auto_batch_size: bool = False, batch_size=None, device=None, batch_dims=None, stack_dim_name=None, stack_dim=0)

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

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

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

参数:

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

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

  • batch_size (int 的可迭代对象, 可选) – tensordict 的批处理大小。

  • device (torch.device兼容类型, 可选) – TensorDict 的设备。

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

  • names (str 列表, 可选) – 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, *others, auto_batch_size: Optional[bool] = None, batch_size=None, device=None, batch_dims=None, names=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, optional): 读取模式。默认为 "r"。 auto_batch_size (bool, optional): 如果 True,则会自动计算批处理大小。

默认为 False

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

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

batch_size (torch.Size, optional): 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, 可选) – 如果 True,将返回一个 TensorDictParams 实例,该实例可用于将参数存储在 torch.nn.Module 中。默认为 False

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

  • use_state_dict (bool, 可选) –

    如果 True,将使用模块的 state-dict,并将其解扁平化为一个 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)

检索多个模块的参数,用于通过 vmap 进行 ensemble learning/feature of expects 应用。

参数:

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

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

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

  • use_state_dict (bool, 可选) –

    如果 True,将使用模块的 state-dict,并将其解扁平化为一个 TensorDict,其树形结构与模型相同。 默认为 False

    注意

    当需要使用 state-dict 钩子时,这特别有用。

  • lazy_stack (bool, 可选) –

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

    注意

    lazy_stackas_module 是互斥的功能。

    警告

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

    警告

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

  • expand_identical (bool, 可选) – 如果 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 嵌套结构。

添加额外的非张量键,以跟踪每个级别的标识,从而提供内置的 pytree 到 tensordict 的双射转换 API。

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

注意

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

注意

可张量转换的类型(例如 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, optional) – 如果为 True,则自动计算批处理大小。 默认为 False

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

  • device (torch.device, optional) –

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

    注意

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

  • batch_size (torch.Size, optional) – 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, optional) – 如果为 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 (list of NestedKey) – 一个可迭代对象,指定新字典的键。

  • value (compatible type, optional) – 所有键的值。 默认为 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) – 目标 worker 的秩,gather_and_stack() 将在此 worker 上被调用。

  • group (torch.distributed.ProcessGroup, optional) – 如果设置,指定的进程组将用于通信。否则,将使用默认的进程组。默认为 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, *args, **kwargs) Tensor

获取使用输入键存储的值。

参数:
  • key (str, tuple of 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, tuple of str) – 要检索的键。

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

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

返回::

索引张量。

示例

>>> td = TensorDict({"x": torch.arange(3)}, batch_size=[])
>>> td.get_at("x", index=1)
tensor(1)
get_item_shape(key)

获取延迟堆栈中项目的形状。

异构维度作为 -1 返回。

此实现效率低下,因为它将尝试堆叠项目以计算它们的形状,并且仅应用于打印。

get_nestedtensor(key: NestedKey, default: Any = _NoDefault.ZERO, *, layout: Optional[layout] = None) Tensor

当无法实现堆叠时,返回一个嵌套张量。

参数:
  • key (NestedKey) – 要嵌套的条目。

  • default (Any, optiona) –

    如果该键不在所有子 tensordict 中,则返回的默认值。

    注意

    如果 default 是一个张量,此方法将尝试使用它构建一个嵌套张量。 否则,将返回默认值。

关键字参数:

layout (torch.layout, optional) – 嵌套张量的布局。

示例

>>> td0 = TensorDict({"a": torch.zeros(4), "b": torch.zeros(4)}, [])
>>> td1 = TensorDict({"a": torch.ones(5)}, [])
>>> td = torch.stack([td0, td1], 0)
>>> a = td.get_nestedtensor("a")
>>> # using a tensor as default uses this default to build the nested tensor
>>> b = td.get_nestedtensor("b", default=torch.ones(4))
>>> assert (a == b).all()
>>> # using anything else as default returns the default
>>> b2 = td.get_nestedtensor("b", None)
>>> assert b2 is None
get_non_tensor(key: NestedKey, default=_NoDefault.ZERO)

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

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

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

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

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

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

或者与 key 对应的条目(如果它不是 tensordict.tensorclass.NonTensorData,或者如果找不到该条目,则为 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)
property grad

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

half()

将所有张量转换为 torch.half

insert(index: int, tensordict: T) None

将 TensorDict 插入到堆栈中的指定索引处。

类似于 list.insert。 插入的 TensorDict 必须具有兼容的 batch_size 和设备。 插入是原地操作,不返回任何内容。

参数:
  • index (int) – 新的 TensorDict 应插入的索引。

  • tensordict (TensorDictBase) – 要插入到堆栈中的 TensorDict。

int()

将所有张量转换为 torch.int

int16()

将所有张量转换为 torch.int16

int32()

将所有张量转换为 torch.int32

int64()

将所有张量转换为 torch.int64

int8()

将所有张量转换为 torch.int8

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 的 rank。

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

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

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

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

返回::

如果 return_premature=True, 返回一个 futures 列表用于等待

直到 tensordict 被更新。

is_consolidated()

检查 TensorDict 是否具有合并的存储。

is_contiguous() bool

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

is_empty() bool

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

is_memmap() bool

检查 tensordict 是否是内存映射的。

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

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

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。

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

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

  • pseudo_rand (bool) – 如果为 True,tag 序列将是伪随机的,允许从不同的节点发送多个数据而不会重叠。 请注意,生成这些伪随机数开销很大(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=False, leaves_only=False, is_leaf=None, *, sort: bool = False)

返回 tensordict 的键值对生成器。

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

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

  • is_leaf (callable, 可选) –

    一个对类类型进行调用的可调用对象,返回一个布尔值,指示是否应将该类视为叶子节点。

    注意

    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, 可选) – 是否应该对键进行排序。 对于嵌套键,键根据其连接的名称进行排序(即,("a", "key") 将被视为 "a.key" 以进行排序)。 请注意,在处理大型 tensordict 时,排序可能会产生大量开销。 默认为 False

keys(include_nested: bool = False, leaves_only: bool = False, is_leaf: Optional[Callable[[Type], bool]] = None, *, sort: bool = False) _LazyStackedTensorDictKeysView

返回 tensordict 键的生成器。

警告

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

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

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

  • is_leaf (callable, 可选) –

    一个对类类型进行调用的可调用对象,返回一个布尔值,指示是否应将该类视为叶子节点。

    注意

    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, 可选) – 是否应对键进行排序。 对于嵌套键,键根据其连接的名称进行排序(即,("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(items: Sequence[TensorDictBase], dim: int = 0, *, device: Optional[Union[device, str, int]] = None, out: Optional[T] = None, stack_dim_name: Optional[str] = None) T

在 LazyStackedTensorDict 中堆叠 tensordict。

参数:
  • items (TensorDictBase 实例的序列) – 要堆叠的 TensorDictBase 实例的序列。

  • dim (int, 可选) – 执行延迟堆叠的维度。 默认为 0。

关键字参数:
  • device (torch.device, 可选) – 要在 LazyStackedTensorDict 中设置的设备,以防无法从 tensordict 列表中推断出(例如,列表为空)。

  • out (TensorDictBase, 可选) – 一个 LazyStackedTensorDict,用于写入数据。

  • stack_dim_name (str, 可选) – 堆叠维度的名称。

  • strict_shape (bool

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 (str文件夹的路径) – 保存的 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()

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

示例

>>> 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)

将内存映射的 tensordict 的内容加载到调用 load_memmap_ 的 tensordict 中。

更多信息请参考 load_memmap()

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

将一个 state_dict(格式与 state_dict() 相同)加载到 tensordict 中。

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

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

  • assign (bool, optional) – 是否将 state dictionary 中的项分配给 tensordict 中对应的键,而不是将其就地复制到 tensordict 当前的张量中。 当 False 时,当前模块中张量的属性将被保留,而当 True 时,state dict 中张量的属性将被保留。 默认值: False

  • from_flatten (bool, optional) – 如果为 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 之间的逻辑 AND 运算。

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

other (TensorDictBase or torch.Tensor) – 用于执行逻辑 AND 运算的张量或 TensorDict。

关键字参数:

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

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

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

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

参数:
  • dim (int整数元组 (tuple of ints), 可选) – 要缩减的维度。如果为 None,则缩减 tensordict 的所有批次维度。

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

关键字参数:

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

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

根据给定的形状和可选的 dtype 创建一个空的内存映射张量。

警告

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

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

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

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

关键字参数:

dtype (torch.dtype, 可选) – 新张量的数据类型。

返回::

一个新的内存映射张量。

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

根据给定的存储、形状和可选的 dtype 创建一个空的内存映射张量。

警告

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

注意

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

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

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

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

关键字参数:

dtype (torch.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, 可选) – 如果 False,则新张量将共享输入的元数据,例如形状和 dtype,但内容将为空。 默认为 True

返回::

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

map(fn: Callable[[TensorDictBase], TensorDictBase | None], dim: int = 0, num_workers: int | None = None, *, out: TensorDictBase | None = None, 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 = False, pbar: bool = False, mp_start_method: str | None = None)

将函数映射到 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) – worker 的数量。与 pool 互斥。如果未提供,worker 的数量将设置为可用的 cpu 数量。

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

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

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

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

  • generator (torch.Generator, optional) –

    用于播种的生成器。 将从它生成一个基本种子,并且池的每个 worker 将被播种,所提供的种子递增一个从 0num_workers 的唯一整数。 如果未提供生成器,将使用一个随机整数作为种子。 为了与未播种的 worker 一起工作,应该单独创建一个池并直接传递给 map()

    注意

    当提供一个低值的种子时,应该小心,因为这会导致实验之间的自相关,例如:如果请求 8 个 worker 并且种子是 4,worker 种子范围将从 4 到 11。如果种子是 5,worker 种子范围将从 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"。请记住,"cuda" 张量不能在使用 "fork" 启动方法的进程之间共享。如果 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) – worker 的数量。与 pool 互斥。如果未提供,worker 的数量将设置为可用的 cpu 数量。

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

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

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

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

  • generator (torch.Generator, optional) –

    用于播种的生成器。 将从它生成一个基本种子,并且池的每个 worker 将被播种,所提供的种子递增一个从 0num_workers 的唯一整数。 如果未提供生成器,将使用一个随机整数作为种子。 为了与未播种的 worker 一起工作,应该单独创建一个池并直接传递给 map()

    注意

    当提供一个低值的种子时,应该小心,因为这会导致实验之间的自相关,例如:如果请求 8 个 worker 并且种子是 4,worker 种子范围将从 4 到 11。如果种子是 5,worker 种子范围将从 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"。请记住,"cuda" 张量不能在使用 "fork" 启动方法的进程之间共享。如果 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(mask: Tensor, value: float | bool) T

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_(mask: Tensor, value: float | bool) T

使用期望的值填充对应于掩码的值。

参数:
  • 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, optional) – 如果为 None,则返回包含所有叶节点最大值的无维度 tensordict(如果可以计算)。如果为整数,则仅当此维度与 tensordict 形状兼容时,才对指定的维度调用 max

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

关键字参数:
  • reduce (bool, optional) – 如果 True,则将在所有 TensorDict 值上发生 reduciton,并且将返回单个缩减张量。默认为 False

  • return_argmins (bool, optional) – 当传递 dim 参数时,max() 返回具有值和索引的命名元组。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.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 (TensorDictTensor) – 其他输入 tensordict 或 tensor。

关键字参数:

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

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

maximum() 的原地版本。

注意

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

classmethod maybe_dense_stack(items: Sequence[TensorDictBase], dim: int = 0, out: Optional[T] = None, strict: bool = False) T

如果可能,则密集地堆叠张量或 tensordict,否则堆叠到 LazyStackedTensorDict 上。

示例

>>> td0 = TensorDict({"a": 0}, [])
>>> td1 = TensorDict({"b": 0}, [])
>>> LazyStackedTensorDict.maybe_dense_stack([td0, td0])  # returns a TensorDict with shape [2]
>>> LazyStackedTensorDict.maybe_dense_stack([td0, td1])  # returns a LazyStackedTensorDict with shape [2]
>>> LazyStackedTensorDict.maybe_dense_stack(list(torch.randn(2)))  # returns a torch.Tensor with shape [2]
maybe_to_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 的批次大小形状相同的张量。 否则,将返回一个与 self 具有相同结构的新 tensordict,其中缩减了特征维度。

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

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

  • reduce (bool, optional) – 如果 True,则将在所有 TensorDict 值上发生 reduciton,并且将返回单个缩减张量。默认为 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 被解锁,内存映射属性就会变为 False,因为不再保证跨进程的身份。

返回::

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

注意

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

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

将所有张量原地写入相应的内存映射张量。

参数:
  • 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 被解锁,内存映射属性就会变为 False,因为不再保证跨进程的身份。

返回::

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

注意

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

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

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

参数:
  • 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 被解锁,内存映射属性就会变为 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_()

如果内存映射张量字典具有 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, optional) – 如果 None,则返回一个无维度的张量字典,其中包含所有叶子的最小值(如果可以计算)。 如果是整数,则仅当此维度与张量字典形状兼容时,才对指定的维度调用 min

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

关键字参数:
  • reduce (bool, optional) – 如果 True,则将在所有 TensorDict 值上发生 reduciton,并且将返回单个缩减张量。默认为 False

  • return_argmins (bool, optional) – min() 在传递 dim 参数时返回一个具有值和索引的命名元组。 与此等效的 TensorDict 是返回一个张量类,其中包含具有相同结构体的条目 "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 (TensorDictTensor) – 其他输入 tensordict 或 tensor。

关键字参数:

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

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

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

注意

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

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 中减去的张量或数字。

关键字参数:

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

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

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

注意

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

named_apply(fn: Callable, *others: T, nested_keys: bool = False, 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: Optional[bool] = None, propagate_lock: bool = False, call_on_nested: bool = False, out: Optional[TensorDictBase] = None, **constructor_kwargs) Optional[T]

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

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

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

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

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

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

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

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

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

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

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

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

  • call_on_nested (bool, optional) –

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

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

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

  • reduce (bool, optional) – 如果 True,则将在所有 TensorDict 值上发生 reduciton,并且将返回单个缩减张量。默认为 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, int 元组, 可选) – 如果为 None,则返回一个无维度 tensordict,其中包含所有叶子的总和值(如果可以计算)。如果是整数或整数元组,则仅当该维度与 tensordict 的形状兼容时,才对指定的维度调用 sum。目前只允许使用 “feature” 字符串。使用 dim=”feature” 将实现所有特征维度的缩减。如果 reduce=True,则将返回一个形状为 TensorDict 批大小的张量。否则,将返回一个新的 tensordict,其结构与 self 相同,但特征维度已缩减。

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

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

  • reduce (bool, optional) – 如果 True,则将在所有 TensorDict 值上发生 reduciton,并且将返回单个缩减张量。默认为 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 的 TensorDict,其中包含空张量。

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

参数:

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

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

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

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

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

  • pin_memory (bool, 可选) – 如果设置,则返回的张量将被分配在锁页内存中。仅适用于 CPU 张量。默认值: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 (整数序列) – 一个列表、元组或 torch.Size 整数,用于定义输出张量的形状。

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

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

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

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

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

  • pin_memory (bool, 可选) – 如果设置,则返回的张量将被分配在锁页内存中。仅适用于 CPU 张量。默认值: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...) – 定义输出张量形状的整数列表、元组或 torch.Size。

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

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

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

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

  • pin_memory (bool, 可选) – 如果设置,则返回的张量将被分配在锁页内存中。仅适用于 CPU 张量。默认值: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 应该记录返回张量的操作。默认值:False

  • pin_memory (bool, 可选) – 如果设置,则返回的张量将被分配在锁页内存中。仅适用于 CPU 张量。默认值: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...) – 定义输出张量形状的整数列表、元组或 torch.Size。

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

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

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

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

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

non_tensor_items(include_nested: bool = False)

返回所有非张量叶节点,可以选择递归查找。

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

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

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

  • dtype (torch.dtype, 可选) – 输出 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(假定每个张量都是单个副本)。

permute(*args, **kwargs)

返回一个 tensordict 的视图,该视图的批次维度根据 dims 进行了置换。

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

  • dims (list of 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(num_threads: Optional[int] = None, inplace: bool = False) T

在存储的张量上调用 pin_memory()

参数:
  • num_threads (int or str) – 如果提供,则用于在叶子上调用 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 ( strnested key) – 要查找的条目。

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

示例

>>> td = TensorDict({"1": 1}, [])
>>> one = td.pop("1")
>>> assert one == 1
>>> none = td.pop("1", default=None)
>>> assert none is None
popitem() Tuple[NestedKey, Tensor]

移除最后插入 TensorDict 的项目。

popitem 只会返回非嵌套值。

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

计算 self 中每个元素与 other 的幂,并返回包含结果的张量。

other 可以是单个 float 数字、一个 Tensor 或一个 TensorDict

other 是一个张量时,inputother 的形状必须是可广播的。

参数:

other ( float, tensortensordict) – 指数值

关键字参数:

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

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

pow() 的原地版本。

注意

原地 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,其中包含所有叶子的 prod 值(如果可以计算)。 如果是整数或整数元组,则仅当此维度与 tensordict 形状兼容时,才对指定的维度调用 prod。 目前仅允许使用 “feature” 字符串。 使用 dim="feature" 将实现对所有特征维度的缩减。 如果 reduce=True,将返回一个形状为 TensorDict 批大小的张量。 否则,将返回一个与 self 结构相同的新 tensordict,其中包含缩减的特征维度。

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

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

  • reduce (bool, optional) – 如果 True,则将在所有 TensorDict 值上发生 reduciton,并且将返回单个缩减张量。默认为 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

原地计算 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 的 rank。

关键字参数:
  • group (torch.distributed.ProcessGroup, optional) – 如果设置,指定的进程组将用于通信。否则,将使用默认的进程组。默认为 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"]
rename(*names, **rename_map)

返回维度已重命名的 tensordict 的克隆。

示例

>>> 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) T

使用新字符串重命名键,并返回具有更新的键名称的相同 tensordict。

参数:
  • 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(repeats: torch.Tensor | int, dim: Optional[int] = None, *, output_size: Optional[int] = None) TensorDictBase

重复 TensorDict 的元素。

警告

这与 repeat() 不同,但与 numpy.repeat() 相似。

参数:
  • repeats (torch.Tensorint) – 每个元素的重复次数。 广播 repeats 以适应给定轴的形状。

  • dim (int, 可选) – 沿其重复值的维度。 默认情况下,使用展平的输入数组,并返回一个扁平的输出数组。

关键字参数:

output_size (int, 可选) – 给定轴的总输出大小(例如,重复的总和)。 如果给定,它将避免计算 tensordict 的输出形状所需的流同步。

返回::

重复的 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

更改 autograd 是否应记录在此张量上的操作:就地设置此张量的 requires_grad 属性。

返回此 tensordict。

参数:

requires_grad (bool, optional) – autograd 是否应记录在此 tensordict 上的操作。 默认为 True

reshape(*args, **kwargs) T

返回所需形状的连续的、重塑的张量。

参数:

*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 的内容发送到远程 worker。

参数:

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

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

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

  • pseudo_rand (bool) – 如果为 True,tag 序列将是伪随机的,允许从不同的节点发送多个数据而不会重叠。 请注意,生成这些伪随机数开销很大(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, 可选) – 如果 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, *, non_blocking: bool = False, **kwargs: Any) T

设置一个新的键值对。

参数:
  • key (str, str 元组) – 要设置的键的名称。

  • item (torch.Tensor等效项, TensorDictBase 实例) – 要存储在 tensordict 中的值。

  • inplace (bool, 可选) – 如果 True,并且键与 tensordict 中现有的键匹配,则对于该键值对,更新将就地发生。如果 inplace 为 True 并且找不到条目,则会添加该条目。对于更严格的就地操作,请改用 set_()。默认为 False

关键字参数:

non_blocking (bool, 可选) – 如果 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, *, non_blocking: bool = False) T

设置现有键的值,同时保留原始存储。

参数:
关键字参数:

non_blocking (bool, 可选) – 如果 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, ...]], *, non_blocking: bool = False) T

在由 index 指示的索引处就地设置值。

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

  • value (torch.Tensor) – 要在索引 index 处设置的值

  • index (int, tensortuple) – 要写入值的索引。

关键字参数:

non_blocking (bool, 可选) – 如果 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_non_tensor(key: NestedKey, value: Any)

使用 tensordict.tensorclass.NonTensorData 在 tensordict 中注册一个非 tensor 值。

该值可以使用 TensorDictBase.get_non_tensor() 检索,也可以直接使用 get 检索,这将返回 tensordict.tensorclass.NonTensorData 对象。

返回: 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)
setdefault(key: NestedKey, default: Tensor, inplace: bool = False) Tensor

如果 key 不在 tensordict 中,则插入一个 key 条目,其值为 default

如果 key 在 tensordict 中,则返回 key 的值,否则返回 default

参数:
  • key (str嵌套键) – 值的名称。

  • default (torch.Tensor兼容类型, TensorDictBase) – 如果键尚不存在,则存储在 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

将所有 tensor 放置在共享内存中。

然后 TensorDict 会被锁定,这意味着任何非原地 (in-place) 的写入操作都会抛出异常 (例如,重命名、设置或删除条目)。相反,一旦 tensordict 被解锁,share_memory 属性会被设置为 False,因为跨进程的唯一性不再得到保证。

返回::

self

sigmoid() T

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

sigmoid_() T

原地 (in-place) 计算 TensorDict 中每个元素的 sigmoid() 值。

sign() T

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

sign_() T

原地 (in-place) 计算 TensorDict 中每个元素的 sign() 值。

sin() T

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

sin_() T

原地 (in-place) 计算 TensorDict 中每个元素的 sin() 值。

sinh() T

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

sinh_() T

原地 (in-place) 计算 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, 可选) – 返回 tensor 的所需数据类型。 如果指定,则在执行操作之前,输入 tensor 将转换为 dtype。 这对于防止数据类型溢出很有用。

property sorted_keys: list[tensordict._nestedkey.NestedKey]

返回按字母顺序排序的键。

不支持额外的参数。

如果 TensorDict 被锁定,则键会被缓存,直到 tensordict 被解锁以实现更快的执行。

split(split_size: int | list[int], dim: int = 0) list[tensordict.base.TensorDictBase]

torch.split 一样,在给定维度中使用指定的大小拆分 TensorDict 中的每个 tensor。

返回一个 TensorDict 实例列表,其中包含拆分块的视图。

参数:
  • split_size (intList(int)) – 单个块的大小或每个块的大小列表。

  • dim (int) – 沿其拆分 tensor 的维度。

返回::

具有给定维度中指定大小的 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, optional) – 如果为 True,则返回的所有 tensordict 都具有与 self 相同的树结构,即使某些子 tensordict 不包含任何叶节点。

注意

None 非 tensor 值将被忽略且不会返回。

注意

该方法不检查提供的列表中的重复项。

示例

>>> 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() 的原地 (in-place) 版本。

squeeze(*args, **kwargs)

压缩所有维度介于 -self.batch_dims+1self.batch_dims-1 之间的 tensor,并在新的 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 的更改将异地 (out-place) 发生,即,原始 tensor 的内容不会被更改。 这也假设 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 的所有条目堆叠到单个 tensor 中。

参数:

dim (int, optional) – 条目应沿其堆叠的维度。

关键字参数:
  • sorted (bool or list of NestedKeys) – 如果为 True,则条目将按字母顺序堆叠。 如果为 False(默认),将使用字典顺序。 或者,可以提供键名列表,tensor 将相应地堆叠。 这会产生一些开销,因为将针对 tensordict 中的叶名称列表检查键列表。

  • out (torch.Tensor, optional) – 用于堆叠操作的可选目标 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(destination=None, prefix='', keep_vars=False, flatten=False) OrderedDict[str, Any]

从 tensordict 生成 state_dict。

state-dict 的结构仍然是嵌套的,除非 flatten 设置为 True

tensordict state-dict 包含重建 tensordict 所需的所有 tensor 和元数据(当前不支持名称)。

参数:
  • destination (dict, optional) – 如果提供,tensordict 的状态将更新到 dict 中,并返回相同的对象。 否则,将创建并返回一个 OrderedDict。 默认值:None

  • prefix (str, optional) – 添加到 tensor 名称的前缀,用于组合 state_dict 中的键。 默认值:''

  • keep_vars (bool, optional) – 默认情况下,state dict 中返回的 torch.Tensor 项会从 autograd 中分离。如果设置为 True,则不会执行分离。默认值:False

  • flatten (bool, optional) – 是否应该使用 "." 字符展平结构。默认为 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) – 输出张量是否保留维度。

关键字参数:
  • correction (int) – 样本大小和样本自由度之间的差。 默认为 Bessel 校正,correction=1。

  • reduce (bool, optional) – 如果 True,则将在所有 TensorDict 值上发生 reduciton,并且将返回单个缩减张量。默认为 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 中减去的张量或数字。

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

  • default (torch.Tensorstr, optional) – 用于独占条目的默认值。如果没有提供,则两个 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, int 元组, 可选) – 如果为 None,则返回一个无维度 tensordict,其中包含所有叶子的总和值(如果可以计算)。如果是整数或整数元组,则仅当该维度与 tensordict 的形状兼容时,才对指定的维度调用 sum。目前只允许使用 “feature” 字符串。使用 dim=”feature” 将实现所有特征维度的缩减。如果 reduce=True,则将返回一个形状为 TensorDict 批大小的张量。否则,将返回一个新的 tensordict,其结构与 self 相同,但特征维度已缩减。

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

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

  • reduce (bool, optional) – 如果 True,则将在所有 TensorDict 值上发生 reduciton,并且将返回单个缩减张量。默认为 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) T

将 TensorDictBase 子类映射到另一个设备、dtype 或另一个 TensorDictBase 子类(如果允许)。

不允许将张量转换为新的 dtype,因为 tensordict 不一定包含单个张量 dtype。

参数:
  • device (torch.device, optional) – tensordict 的所需设备。

  • dtype (torch.dtype, optional) – tensordict 的所需浮点型或复数 dtype。

  • tensor (torch.Tensor, optional) – 张量,其 dtype 和设备是此 TensorDict 中所有张量的所需 dtype 和设备。

关键字参数:
  • non_blocking (bool, optional) – 操作是否应为阻塞的。

  • memory_format (torch.memory_format, optional) – 此 tensordict 中 4D 参数和缓冲区的所需内存格式。

  • batch_size (torch.Size, optional) – 输出 tensordict 的结果 batch_size。

  • other (TensorDictBase, optional) –

    TensorDict 实例,其 dtype 和设备是此 TensorDict 中所有张量的所需 dtype 和设备。

    注意

    由于 TensorDictBase 实例没有 dtype,因此 dtype 从示例叶子节点收集。 如果有多个 dtype,则不进行 dtype 转换。

  • non_blocking_pin (bool, optional) –

    如果 True, 则在将张量发送到设备之前将其固定。 这将以异步方式完成,但可以通过 num_threads 参数进行控制。

    注意

    调用 tensordict.pin_memory().to("cuda") 通常比 tensordict.to("cuda", non_blocking_pin=True) 慢得多,因为 pin_memory 在第二种情况下是异步调用的。 如果张量很大且数量众多,则多线程 pin_memory 通常是有益的:当要发送的张量太少时,生成线程和收集数据的开销会超过多线程的优势,如果张量很小,则迭代长列表的开销也非常大。

  • num_threads (int or None, optional) – 如果 non_blocking_pin=True, 则用于 pin_memory 的线程数。 默认情况下,将生成 max(1, torch.get_num_threads()) 个线程。 num_threads=0 将取消对 pin_memory() 调用的任何多线程处理。

  • inplace (bool, optional) – 如果 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_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, optional) – 如果 True,则模块中的参数或张量将被就地更新。默认为 False

  • return_swap (bool, optional) – 如果 True,则将返回旧的参数配置。默认为 False

  • swap_dest (TensorDictBase, optional) – 如果 return_swapTrue,则将交换写入的 tensordict。

  • use_state_dict (bool, optional) – 如果 True,将使用 state-dict API 加载参数(包括 state-dict 钩子)。默认为 False

  • non_blocking (bool, 可选) – 如果 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, optional) – 可选的 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: Optional[bool] = None)

从 TensorDictBase 返回一个常规 TensorDict 实例。

参数:

retain_none (bool) –

如果 True,则 tensorclass 实例中的 None 值将写入 tensordict 中。否则,它们将被丢弃。默认值:True

注意

从 v0.8 开始,默认值将切换为 False

返回::

包含相同值的新 TensorDict 对象。

tolist()

在嵌套列表中提取 tensordict.tensorclass.NonTensorStack 的内容。

示例

>>> from tensordict import NonTensorData
>>> import torch
>>> data = torch.stack([
...     torch.stack([NonTensorData(data=(i, j), batch_size=[]) for i in range(2)])
...    for j in range(3)])
>>> data.tolist()
[[(0, 0), (1, 0)], [(0, 1), (1, 1)], [(0, 2), (1, 2)]]
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()

将所有 tensors 转换为 torch.uint16 类型。

uint32()

将所有 tensors 转换为 torch.uint32 类型。

uint64()

将所有 tensors 转换为 torch.uint64 类型。

uint8()

将所有 tensors 转换为 torch.uint8 类型。

unbind(dim: int) tuple[T, ...]

返回一个索引 tensordicts 的元组,沿着指定的维度解绑。

示例

>>> 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) – 指定要展开的输入 tensor 的维度。

  • 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) T

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

TensorDict 类型将会丢失,结果将是一个简单的 TensorDict 实例。嵌套 tensordicts 的元数据将从根节点推断:数据树中的所有实例将共享相同的批次大小、维度名称和设备。

参数:
  • separator (str, 可选) – 嵌套项之间的分隔符。

  • inplace (bool, 可选) – 如果 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() 在处理状态字典时特别有用,因为它们可以无缝地将平面字典转换为模拟模型结构的数据结构。

示例

>>> 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 之间的维度,对所有 tensors 执行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 的更改将异地发生,即,原始 tensors 的内容将不会更改。 这也假定 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: Union[dict[str, torch.Tensor], T], clone: bool = False, inplace: bool = False, *, non_blocking: bool = False, keys_to_update: Optional[Sequence[NestedKey]] = None, is_leaf: Optional[Callable[[Type], bool]] = None) T

使用来自字典或另一个 TensorDict 的值更新 TensorDict。

参数:
  • input_dict_or_td (TensorDictBase or dict) – 要写入 self 的输入数据。

  • clone (bool, optional) – 是否应在设置之前克隆输入(tensor)字典中的 tensors。默认为 False

  • inplace (bool, optional) – 如果 True 并且键与 tensordict 中的现有键匹配,则对于该键值对,更新将就地发生。 如果找不到该条目,则会将其添加。默认为 False

关键字参数:
  • keys_to_update (sequence of NestedKeys, optional) – 如果提供,则只会更新 key_to_update 中的键列表。 目的是避免调用 data_dest.update(data_src.select(*keys_to_update))

  • non_blocking (bool, 可选) – 如果 True 并且此复制发生在不同的设备之间,则复制可能相对于主机异步发生。

  • is_leaf (Callable[[Type], bool], optional) –

    一个可调用对象,指示对象类型是否被认为是叶子并进行交换或作为tensor集合。

返回::

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 (TensorDictBase or dict) – 要写入 self 的输入数据。

  • clone (bool, optional) – 是否应在设置之前克隆输入(tensor)字典中的 tensors。默认为 False

关键字参数:
  • keys_to_update (NestedKeys 的序列, 可选) – 如果提供,则只会更新 key_to_update 中的键列表。 这旨在避免调用 data_dest.update_(data_src.select(*keys_to_update))

  • non_blocking (bool, 可选) – 如果 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: dict[str, torch.Tensor] | tensordict.base.TensorDictBase, index: Union[None, int, slice, str, Tensor, List[Any], Tuple[Any, ...]], clone: bool = False, *, non_blocking: bool = False) T

使用字典或另一个 TensorDict 的值,在指定索引处就地更新 TensorDict。

与 TensorDict.update 不同,如果 TensorDict 不知道该键,此函数将引发错误。

参数:
  • input_dict_or_td (TensorDictBase or dict) – 要写入 self 的输入数据。

  • idx (int, torch.Tensor, iterable, slice) – 应该进行更新的 tensordict 的索引。

  • clone (bool, 可选) – 输入(tensor)字典中的张量是否应在设置之前克隆。 默认为 False

关键字参数:
  • keys_to_update (NestedKeys 的序列, 可选) – 如果提供,则只会更新 key_to_update 中的键列表。

  • non_blocking (bool, 可选) – 如果 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()
valid_keys(include_nested: bool = False, leaves_only: bool = False, is_leaf: Optional[Callable[[Type], bool]] = None, *, sort: bool = False) _LazyStackedTensorDictKeysView

返回 tensordict 键的生成器。

警告

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

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

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

  • is_leaf (callable, 可选) –

    一个对类类型进行调用的可调用对象,返回一个布尔值,指示是否应将该类视为叶子节点。

    注意

    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, 可选) – 是否应对键进行排序。 对于嵌套键,键根据其连接的名称进行排序(即,("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')]
values(include_nested=False, leaves_only=False, is_leaf=None, *, sort: bool = False)

返回一个生成器,表示 tensordict 的值。

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

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

  • is_leaf (callable, 可选) –

    一个对类类型进行调用的可调用对象,返回一个布尔值,指示是否应将该类视为叶子节点。

    注意

    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, 可选) – 是否应该对键进行排序。 对于嵌套键,键根据其连接的名称进行排序(即,("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 元组, 可选) – 如果 None,则返回包含所有叶子节点总值的无维度 tensordict (如果可以计算)。 如果是整数或整数元组,则仅当此维度与 tensordict 形状兼容时,才对指定的维度调用 var。 目前只允许使用 “feature” 字符串。 使用 dim="feature" 将实现对所有特征维度的缩减。 如果 reduce=True,则将返回一个形状与 TensorDict 的 batch-size 相同的张量。 否则,将返回一个与 self 具有相同结构但缩减了特征维度的新 tensordict。

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

关键字参数:
  • correction (int) – 样本大小和样本自由度之间的差。 默认为 Bessel 校正,correction=1。

  • reduce (bool, optional) – 如果 True,则将在所有 TensorDict 值上发生 reduciton,并且将返回单个缩减张量。默认为 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, 可选) – 如果提供了 dtype,可以使用此关键字参数重置 batch-size。 如果使用形状调用 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 (BoolTensor) – 当 True(非零)时,产生 self,否则产生 other

  • other (TensorDictBase标量) – 值(如果 other 是标量)或在 condition 为 False 的索引处选择的值。

关键字参数:
  • out (TensorDictBase, 可选) – 输出 TensorDictBase 实例。

  • pad (标量, 可选) – 如果提供,则源或目标 tensordict 中缺少的键将写为 torch.where(mask, self, pad)torch.where(mask, pad, other)。 默认为 None,即不容忍丢失的键。

zero_() T

就地将 tensordict 中的所有张量置零。

zero_grad(set_to_none: bool = True) T

递归地将 TensorDict 的所有梯度置零。

参数:

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