TensorDictParams¶
- class tensordict.TensorDictParams(parameters: Optional[Union[TensorDictBase, dict]] = None, *, no_convert=False, lock: bool = False, **kwargs)¶
TensorDictBase 的包装器,具有参数暴露功能。
此类旨在保存一个包含参数的 TensorDictBase 实例,使其可供父
Module
访问。这允许将 tensordict 参数无缝集成到 PyTorch 模块中,从而实现参数迭代和优化等操作。主要特点
参数暴露:tensordict 中的参数会暴露给父模块,使其可以包含在 named_parameters() 等操作中。
索引:索引的工作方式与包装的 tensordict 类似。但是,参数名称(在
named_parameters()
中)使用 TensorDict.flatten_keys(“_”) 注册,这可能会导致与 tensordict 内容不同的键名。自动转换:除非通过
no_convert
关键字参数另有指定,否则 tensordict 中设置的任何张量都会自动转换为torch.nn.Parameter
。
- 参数
- parameters (TensorDictBase 或 dict):要表示为参数的 tensordict。值被转换为
参数,除非 no_convert=True。如果提供了 dict,它将被包装在 TensorDict 实例中。也可以使用关键字参数。
- 关键字参数:
no_convert (bool) – 如果 True,则不会进行到 nn.Parameter 的转换,并且所有非参数、非缓冲区张量都将转换为
Buffer
实例。如果False
,则所有具有非整数 dtype 的张量都将转换为Parameter
,而整数 dtype 将转换为Buffer
实例。默认为 False。lock (bool) –
如果 True,则 TensorDictParams 托管的 tensordict 将被锁定,从而阻止修改,并且在需要 unlock_() 时可能会影响性能。默认为 False。
警告
由于默认情况下内部 tensordict 未被复制或锁定,因此在
TensorDictParams
中注册 tensordict 并在之后修改其内容将__不会__更新TensorDictParams
parameters()
和buffers()
序列中的值。**kwargs – 用于填充 TensorDictParams 的键值对。与 parameters 输入互斥。
- 示例
>>> from torch import nn >>> from tensordict import TensorDict >>> module = nn.Sequential(nn.Linear(3, 4), nn.Linear(4, 4)) >>> params = TensorDict.from_module(module) >>> params.lock_() >>> p = TensorDictParams(params) >>> print(p) TensorDictParams(params=TensorDict( fields={ 0: TensorDict( fields={ bias: Parameter(shape=torch.Size([4]), device=cpu, dtype=torch.float32, is_shared=False), weight: Parameter(shape=torch.Size([4, 3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False), 1: TensorDict( fields={ bias: Parameter(shape=torch.Size([4]), device=cpu, dtype=torch.float32, is_shared=False), weight: Parameter(shape=torch.Size([4, 4]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)) >>> class CustomModule(nn.Module): ... def __init__(self, params): ... super().__init__() ... self.params = params >>> m = CustomModule(p) >>> # The wrapper supports assignment, and values are converted to Parameters >>> m.params['other'] = torch.randn(3) >>> assert isinstance(m.params['other'], nn.Parameter)
- abs() T ¶
计算 TensorDict 中每个元素的绝对值。
- abs_() T ¶
就地计算 TensorDict 中每个元素的绝对值。
- acos() T ¶
计算 TensorDict 中每个元素的
acos()
值。
- acos_() T ¶
就地计算 TensorDict 中每个元素的
acos()
值。
- add(other: tensordict.base.TensorDictBase | torch.Tensor, *, alpha: float | None = None, default: str | torch.Tensor | None = None) TensorDictBase ¶
将由
alpha
缩放的other
添加到self
。\[\text{{out}}_i = \text{{input}}_i + \text{{alpha}} \times \text{{other}}_i\]- 参数:
other (TensorDictBase 或 torch.Tensor) – 要添加到
self
的张量或 TensorDict。- 关键字参数:
alpha (Number, optional) –
other
的乘数。default (torch.Tensor 或 str, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递
default="intersection"
,则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default
将用于操作两侧所有缺失的条目。
- add_(other: tensordict.base.TensorDictBase | torch.Tensor | float, *, alpha: Optional[float] = None)¶
add()
的原地(in-place)版本。注意
原地
add
不支持default
关键字参数。
- add_module(name: str, module: Optional[Module]) None ¶
向当前模块添加子模块。
可以使用给定的名称作为属性访问该模块。
- 参数:
name (str) – 子模块的名称。可以使用给定的名称从该模块访问子模块
module (Module) – 要添加到模块的子模块。
- addcdiv(other1: tensordict.base.TensorDictBase | torch.Tensor, other2: tensordict.base.TensorDictBase | torch.Tensor, value: float | None = 1)¶
执行
other1
除以other2
的逐元素除法,将结果乘以标量value
并将其加到self
。\[\text{out}_i = \text{input}_i + \text{value} \times \frac{\text{tensor1}_i}{\text{tensor2}_i}\]self
、other1
和other2
的元素的形状必须是可广播的。对于 FloatTensor 或 DoubleTensor 类型的输入,
value
必须是实数,否则为整数。- 参数:
other1 (TensorDict 或 Tensor) – 分子 tensordict (或 tensor)
tensor2 (TensorDict 或 Tensor) – 分母 tensordict (或 tensor)
- 关键字参数:
value (Number, 可选) – \(\text{tensor1} / \text{tensor2}\) 的乘数
- 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\]self
、other1
和other2
的形状必须是可广播的。对于 FloatTensor 或 DoubleTensor 类型的输入,
value
必须是实数,否则为整数。- 参数:
other1 (TensorDict 或 Tensor) – 要相乘的 tensordict 或 tensor
other2 (TensorDict 或 Tensor) – 要相乘的 tensordict 或 tensor
- 关键字参数:
value (Number, 可选) – \(other1 .* other2\) 的乘数
- all(dim: int = None) bool | tensordict.base.TensorDictBase ¶
检查 tensordict 中是否所有值均为 True/非空。
- 参数:
dim (int, optional) – 如果为
None
,则返回一个布尔值,指示是否所有 tensor 都返回 tensor.all() == True。 如果是整数,则仅当此维度与 tensordict 的形状兼容时,才会对指定的维度调用 all。
- amax(dim: int | NO_DEFAULT = _NoDefault.ZERO, keepdim: bool = False, *, reduce: bool | None = None) TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有元素的最大值。
与
max()
相同,只是return_indices=False
。
- amin(dim: int | NO_DEFAULT = _NoDefault.ZERO, keepdim: bool = False, *, reduce: bool | None = None) TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有元素的最小值。
与
min()
相同,只是return_indices=False
。
- any(dim: int = None) bool | tensordict.base.TensorDictBase ¶
检查 tensordict 中是否存在任何 True/非空值。
- 参数:
dim (int, optional) – 如果为
None
,则返回一个布尔值,指示是否所有 tensor 都返回 tensor.any() == True。如果是整数,则仅当此维度与 tensordict 的形状兼容时,才会对指定的维度调用 all。
- apply(fn: Callable, *others: TensorDictBase, batch_size: Optional[Sequence[int]] = None, device: torch.device | None = _NoDefault.ZERO, names: Optional[Sequence[str]] = _NoDefault.ZERO, inplace: bool = False, default: Any = _NoDefault.ZERO, filter_empty: bool | None = None, call_on_nested: bool = False, **constructor_kwargs) tensordict.base.TensorDictBase | None ¶
将可调用对象应用于 tensordict 中存储的所有值,并将它们设置在一个新的 tensordict 中。
可调用对象的签名必须为
Callable[Tuple[Tensor, ...], Optional[Union[Tensor, TensorDictBase]]]
。- 参数:
fn (Callable) – 要应用于 tensordict 中 tensor 的函数。
*others (TensorDictBase 实例, optional) – 如果提供,这些 tensordict 实例应具有与 self 匹配的结构。
fn
参数应接收与 tensordict 数量一样多的未命名输入,包括 self。 如果其他 tensordict 缺少条目,则可以通过default
关键字参数传递默认值。
- 关键字参数:
batch_size (int 序列, 可选) – 如果提供,生成的 TensorDict 将具有所需的 batch_size。
batch_size
参数应与转换后的 batch_size 匹配。 这是一个仅关键字参数。device (torch.device, 可选) – 生成的设备(如果有)。
names (str 列表, 可选) – 新的维度名称,以防修改了 batch_size。
inplace (bool, 可选) – 如果为 True,则进行原地更改。 默认为 False。 这是一个仅关键字参数。
default (Any, 可选) – 其他 tensordict 中缺失条目的默认值。 如果未提供,缺失的条目将引发 KeyError。
filter_empty (bool, 可选) – 如果
True
,则将滤除空 tensordict。 这也降低了计算成本,因为不会创建和销毁空数据结构。 非张量数据被视为叶子,因此即使该函数未触及,也会保留在 tensordict 中。 出于向后兼容性的目的,默认为False
。propagate_lock (bool, 可选) – 如果
True
,则锁定的 tensordict 将生成另一个锁定的 tensordict。 默认为False
。call_on_nested (bool, 可选) –
如果
True
,则将在第一级张量和容器(TensorDict 或 tensorclass)上调用该函数。 在这种情况下,func
负责将其调用传播到嵌套级别。 这允许在将调用传播到嵌套 tensordict 时进行细粒度控制。 如果False
,则仅在叶子上调用该函数,并且apply
将负责将该函数分派到所有叶子上。>>> td = TensorDict({"a": {"b": [0.0, 1.0]}, "c": [1.0, 2.0]}) >>> def mean_tensor_only(val): ... if is_tensor_collection(val): ... raise RuntimeError("Unexpected!") ... return val.mean() >>> td_mean = td.apply(mean_tensor_only) >>> def mean_any(val): ... if is_tensor_collection(val): ... # Recurse ... return val.apply(mean_any, call_on_nested=True) ... return val.mean() >>> td_mean = td.apply(mean_any, call_on_nested=True)
out (TensorDictBase, 可选) –
一个用于写入结果的 tensordict。 这可以用于避免创建新的 tensordict
>>> td = TensorDict({"a": 0}) >>> td.apply(lambda x: x+1, out=td) >>> assert (td==1).all()
警告
如果在 tensordict 上执行的操作需要访问多个键才能进行单个计算,则提供等于
self
的out
参数可能会导致操作静默地提供错误的结果。 例如>>> td = TensorDict({"a": 1, "b": 1}) >>> td.apply(lambda x: x+td["a"])["b"] # Right! tensor(2) >>> td.apply(lambda x: x+td["a"], out=td)["b"] # Wrong! tensor(3)
**constructor_kwargs – 要传递给 TensorDict 构造函数的其他关键字参数。
- 返回值:
一个具有 transformed_in 张量的新 tensordict。
示例
>>> td = TensorDict({ ... "a": -torch.ones(3), ... "b": {"c": torch.ones(3)}}, ... batch_size=[3]) >>> td_1 = td.apply(lambda x: x+1) >>> assert (td_1["a"] == 0).all() >>> assert (td_1["b", "c"] == 2).all() >>> td_2 = td.apply(lambda x, y: x+y, td) >>> assert (td_2["a"] == -2).all() >>> assert (td_2["b", "c"] == 2).all()
注意
如果该函数返回
None
,则忽略该条目。 这可用于过滤 tensordict 中的数据>>> td = TensorDict({"1": 1, "2": 2, "b": {"2": 2, "1": 1}}, []) >>> def filter(tensor): ... if tensor == 1: ... return tensor >>> td.apply(filter) TensorDict( fields={ 1: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), b: TensorDict( fields={ 1: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
注意
apply 方法将返回一个
TensorDict
实例,无论输入类型如何。 要保持相同的类型,可以执行>>> out = td.clone(False).update(td.apply(...))
- apply_(fn: Callable, *others, **kwargs) T ¶
将可调用对象应用于 tensordict 中存储的所有值,并将其重写到原地。
- 参数:
fn (Callable) – 要应用于 tensordict 中 tensor 的函数。
*others (TensorDictBase 序列, 可选) – 要使用的其他 tensordict。
关键字参数:参见
apply()
。- 返回值:
应用该函数的 self 或 self 的副本
- asin() T ¶
计算 TensorDict 的每个元素的
asin()
值。
- asin_() T ¶
计算 TensorDict 的每个元素的
asin()
值(原地计算)。
- atan() T ¶
计算 TensorDict 的每个元素的
atan()
值。
- atan_() T ¶
计算 TensorDict 的每个元素的
atan()
值(原地计算)。
- auto_batch_size_(batch_dims: Optional[int] = None) T ¶
设置 tensordict 的最大批量大小,最多可达可选的 batch_dims。
- 参数:
batch_dims (int, 可选) – 如果提供,则批量大小最多为
batch_dims
长。- 返回值:
self
示例
>>> from tensordict import TensorDict >>> import torch >>> td = TensorDict({"a": torch.randn(3, 4, 5), "b": {"c": torch.randn(3, 4, 6)}}, batch_size=[]) >>> td.auto_batch_size_() >>> print(td.batch_size) torch.Size([3, 4]) >>> td.auto_batch_size_(batch_dims=1) >>> print(td.batch_size) torch.Size([3])
- auto_device_() T ¶
如果设备是唯一的,则自动设置设备。
返回值:具有已编辑的
device
属性的 self。
- property batch_size: Size¶
TensorDict 的形状(或批量大小)。
tensordict 的形状对应于其包含的张量的公共第一个
N
维度,其中N
是任意数字。 批量大小与“特征大小”形成对比,后者表示张量的语义相关形状。 例如,一批视频的形状可能为[B, T, C, W, H]
,其中[B, T]
是批量大小(批量和时间维度),[C, W, H]
是特征维度(通道和空间维度)。TensorDict
形状由用户在初始化时控制(即,它不是从张量形状推断出来的)。如果新大小与 TensorDict 内容兼容,则可以动态编辑
batch_size
。 例如,始终允许将批量大小设置为空值。- 返回值:
一个
Size
对象,描述 TensorDict 的批量大小。
示例
>>> data = TensorDict({ ... "key 0": torch.randn(3, 4), ... "key 1": torch.randn(3, 5), ... "nested": TensorDict({"key 0": torch.randn(3, 4)}, batch_size=[3, 4])}, ... batch_size=[3]) >>> data.batch_size = () # resets the batch-size to an empty value
- bfloat16()¶
将所有张量转换为
torch.bfloat16
。
- bitwise_and(other: tensordict.base.TensorDictBase | torch.Tensor, *, default: str | torch.Tensor | None = None) TensorDictBase ¶
执行
self
和other
之间的按位与操作。\[\text{{out}}_i = \text{{input}}_i \land \text{{other}}_i\]- 参数:
other (TensorDictBase 或 torch.Tensor) – 用于执行按位与操作的张量或 TensorDict。
- 关键字参数:
default (torch.Tensor 或 str, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递
default="intersection"
,则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default
将用于操作两侧所有缺失的条目。
- bool()¶
将所有张量转换为
torch.bool
类型。
- buffers(recurse: bool = True) Iterator[Tensor] ¶
返回模块缓冲区的迭代器。
- 参数:
recurse (bool) – 如果为 True,则产生此模块和所有子模块的缓冲区。 否则,仅产生作为此模块直接成员的缓冲区。
- Yields:
torch.Tensor – 模块缓冲区
示例
>>> # xdoctest: +SKIP("undefined vars") >>> for buf in model.buffers(): >>> print(type(buf), buf.size()) <class 'torch.Tensor'> (20L,) <class 'torch.Tensor'> (20L, 1L, 5L, 5L)
- bytes(*, count_duplicates: bool = True) int ¶
计算包含的张量的字节数。
- 关键字参数:
count_duplicates (bool) – 是否将重复的张量视为独立的。 如果为
False
,则只会丢弃完全相同的张量(来自公共基础张量的相同视图但不同的 ID 将被计算两次)。 默认为 True(假设每个张量都是单个副本)。
- classmethod cat(input, dim=0, *, out=None)¶
沿给定维度将 tensordict 连接成一个 tensordict。
此调用等效于调用
torch.cat()
,但与 torch.compile 兼容。
- cat_from_tensordict(dim: int = 0, *, sorted: Optional[Union[bool, List[NestedKey]]] = None, out: Tensor = None) Tensor ¶
将 tensordict 的所有条目连接成一个张量。
- 参数:
dim (int, optional) – 条目应连接的维度。
- 关键字参数:
sorted (bool or list of NestedKeys) – 如果为
True
,条目将按字母顺序连接。 如果为False
(默认),将使用字典顺序。 或者,可以提供密钥名称列表,并且将相应地连接张量。 这会产生一些开销,因为将根据 tensordict 中的叶名称列表检查密钥列表。out (torch.Tensor, optional) – 用于 cat 操作的可选目标张量。
- cat_tensors(*keys: NestedKey, out_key: NestedKey, dim: int = 0, keep_entries: bool = False) T ¶
将条目连接到新条目中,并可能删除原始值。
- 参数:
keys (NestedKey 序列) – 要连接的条目。
- 关键字参数
out_key (NestedKey): 连接的输入的新密钥名称。 keep_entries (bool, optional): 如果为
False
,则将删除keys
中的条目。默认为
False
。- dim (int, optional): 必须进行连接的维度。
默认为
0
。
返回: self
示例
>>> td = TensorDict(a=torch.zeros(1), b=torch.ones(1)) >>> td.cat_tensors("a", "b", out_key="c") >>> assert "a" not in td >>> assert (td["c"] == torch.tensor([0, 1])).all()
- ceil() T ¶
计算 TensorDict 中每个元素的
ceil()
值。
- ceil_() T ¶
就地计算 TensorDict 中每个元素的
ceil()
值。
- chunk(chunks: int, dim: int = 0) tuple[tensordict.base.TensorDictBase, ...] ¶
如果可能,将 tensordict 分割成指定数量的块。
每个块都是输入 tensordict 的一个视图。
示例
>>> 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 分别为
min
和max
,则返回注意
如果
min
大于max
,则torch.clamp(..., min, max)
将input
中的所有元素设置为max
的值。
- clamp_max(other: tensordict.base.TensorDictBase | torch.Tensor, *, default: str | torch.Tensor | None = None) T ¶
如果
self
的元素大于other
,则将其限制为other
的值。- 参数:
other (TensorDict or Tensor) – 另一个输入 tensordict 或 tensor。
- 关键字参数:
default (torch.Tensor 或 str, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递
default="intersection"
,则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default
将用于操作两侧所有缺失的条目。
- clamp_max_(other: tensordict.base.TensorDictBase | torch.Tensor) T ¶
clamp_max()
的原地版本。注意
原地
clamp_max
不支持default
关键字参数。
- clamp_min(other: tensordict.base.TensorDictBase | torch.Tensor, default: str | torch.Tensor | None = None) T ¶
如果
self
的元素小于other
,则将其限制为other
的值。- 参数:
other (TensorDict or Tensor) – 另一个输入 tensordict 或 tensor。
- 关键字参数:
default (torch.Tensor 或 str, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递
default="intersection"
,则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default
将用于操作两侧所有缺失的条目。
- clamp_min_(other: tensordict.base.TensorDictBase | torch.Tensor) T ¶
clamp_min()
的原地版本。注意
原地
clamp_min
不支持default
关键字参数。
- clear() T ¶
清除 tensordict 的内容。
- clear_device_() T ¶
清除 tensordict 的设备。
返回: self
- clear_refs_for_compile_() T ¶
清除 weakrefs,以便 tensordict 安全地退出编译区域。
在返回 TensorDict 之前,如果遇到 torch._dynamo.exc.Unsupported: reconstruct: WeakRefVariable() 错误,请使用此方法。
返回: self
- clone(recurse: bool = True, **kwargs) T ¶
将 TensorDictBase 子类的实例克隆到相同类型的新 TensorDictBase 子类实例上。
要从任何其他 TensorDictBase 子类型创建 TensorDict 实例,请改为调用
to_tensordict()
方法。- 参数:
recurse (bool, 可选) – 如果为
True
,则 TensorDict 中包含的每个张量也会被复制。 否则,只会复制 TensorDict 树结构。 默认为True
。
注意
与其他许多操作(逐点算术、形状操作等)不同,
clone
不会继承原始的锁属性。 这种设计选择是为了可以创建克隆并对其进行修改,这是最常见的用法。
- compile(*args, **kwargs)¶
使用
torch.compile()
编译此模块的 forward 函数。编译此模块的 __call__ 方法,并将所有参数原封不动地传递给
torch.compile()
。有关此函数的参数的详细信息,请参阅
torch.compile()
。
- complex128()¶
将所有张量转换为
torch.complex128
。
- complex32()¶
将所有张量转换为
torch.complex32
。
- complex64()¶
将所有张量转换为
torch.complex64
。
- consolidate(filename: Optional[Union[Path, str]] = None, *, num_threads=0, device: Optional[device] = None, non_blocking: bool = False, inplace: bool = False, return_early: bool = False, use_buffer: bool = False, share_memory: bool = False, pin_memory: bool = False, metadata: bool = False) None ¶
将 tensordict 内容整合到单个存储中,以便快速序列化。
- 参数:
filename (Path, 可选) – 用于内存映射张量的可选文件路径,用作 tensordict 的存储。
- 关键字参数:
num_threads (integer, 可选) – 用于填充存储的线程数。
device (torch.device, 可选) – 可选的设备,用于实例化存储。
inplace (bool, 可选) – 如果为
True
,则生成的 tensordict 与具有更新值的self
相同。 默认为False
。return_early (bool, 可选) – 如果为
True
且num_threads>0
,则该方法将返回 tensordict 的 future 对象。 可以使用 future.result() 查询生成的 tensordict。use_buffer (bool, 可选) – 如果为
True
并且传递了文件名,则将在共享内存中创建一个中间本地缓冲区,并且数据将在最后一步复制到存储位置。 这可能比直接写入远程物理内存(例如,NFS)更快。 默认为False
。share_memory (bool, 可选) – 如果为
True
,则存储将放置在共享内存中。 默认为False
。pin_memory (bool, 可选) – 是否应将整合的数据放置在 pinned 内存中。 默认为
False
。metadata (bool, 可选) – 如果为
True
,则元数据将与公共存储一起存储。 如果提供了文件名,则无效。 当需要控制序列化的实现方式时,存储元数据可能很有用,因为如果元数据可用或不可用,TensorDict 以不同的方式处理整合的 TD 的 pickle/unpickle。
注意
如果 tensordict 已经整合,则所有参数都将被忽略并返回
self
。 调用contiguous()
重新整合。示例
>>> import pickle >>> import tempfile >>> import torch >>> import tqdm >>> from torch.utils.benchmark import Timer >>> from tensordict import TensorDict >>> data = TensorDict({"a": torch.zeros(()), "b": {"c": torch.zeros(())}}) >>> data_consolidated = data.consolidate() >>> # check that the data has a single data_ptr() >>> assert torch.tensor([ ... v.untyped_storage().data_ptr() for v in data_c.values(True, True) ... ]).unique().numel() == 1 >>> # Serializing the tensordict will be faster with data_consolidated >>> with open("data.pickle", "wb") as f: ... print("regular", Timer("pickle.dump(data, f)", globals=globals()).adaptive_autorange()) >>> with open("data_c.pickle", "wb") as f: ... print("consolidated", Timer("pickle.dump(data_consolidated, f)", globals=globals()).adaptive_autorange())
- contiguous(*args, **kwargs)¶
返回具有连续值的相同类型的新 tensordict(如果值已连续,则返回 self)。
- copy()¶
返回 tensordict 的浅拷贝(即,复制结构但不复制数据)。
等效于 TensorDictBase.clone(recurse=False)
- copy_(tensordict: T, non_blocking: bool = None) T ¶
-
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 ¶
- cos() T ¶
计算 TensorDict 中每个元素的
cos()
值。
- cos_() T ¶
就地计算 TensorDict 中每个元素的
cos()
值。
- cosh() T ¶
计算 TensorDict 中每个元素的
cosh()
值。
- cosh_() T ¶
就地计算 TensorDict 中每个元素的
cosh()
值。
- create_nested(key)¶
创建与当前 tensordict 具有相同形状、设备和维度名称的嵌套 tensordict。
如果该值已存在,此操作会将其覆盖。此操作在锁定的 tensordict 中被阻止。
示例
>>> data = TensorDict({}, [3, 4, 5]) >>> data.create_nested("root") >>> data.create_nested(("some", "nested", "value")) >>> print(data) TensorDict( fields={ root: TensorDict( fields={ }, batch_size=torch.Size([3, 4, 5]), device=None, is_shared=False), some: TensorDict( fields={ nested: TensorDict( fields={ value: TensorDict( fields={ }, batch_size=torch.Size([3, 4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([3, 4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([3, 4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([3, 4, 5]), device=None, is_shared=False)
- cuda(device=None)¶
将 tensordict 转换为 cuda 设备(如果尚未在其上)。
- 参数:
device (int, 可选) – 如果提供,则为应该转换 tensor 的 cuda 设备。
此函数还支持
to()
的所有关键字参数。
- cummax(dim: int, *, reduce: Optional[bool] = None, return_indices: bool = True) tensordict.base.TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有元素的累积最大值。
- 参数:
dim (int) – 表示执行 cummax 操作的维度的整数。
- 关键字参数:
示例
>>> 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 操作的维度的整数。
- 关键字参数:
示例
>>> from tensordict import TensorDict >>> import torch >>> td = TensorDict( ... a=torch.randn(3, 4, 5), ... b=TensorDict( ... c=torch.randn(3, 4, 5, 6), ... d=torch.randn(3, 4, 5), ... batch_size=(3, 4, 5), ... ), ... batch_size=(3, 4) ... ) >>> td.cummin(dim=0) cummin( indices=TensorDict( fields={ a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.int64, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.int64, is_shared=False), d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([4]), device=None, is_shared=False)}, batch_size=torch.Size([4]), device=None, is_shared=False), vals=TensorDict( fields={ a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([4]), device=None, is_shared=False)}, batch_size=torch.Size([4]), device=None, is_shared=False), batch_size=torch.Size([4]), device=None, is_shared=False) >>> td = TensorDict( ... a=torch.randn(3, 4, 5), ... b=TensorDict( ... c=torch.randn(3, 4, 5), ... d=torch.randn(3, 4, 5), ... batch_size=(3, 4, 5), ... ), ... batch_size=(3, 4) ... ) >>> td.cummin(reduce=True, dim=0) torch.return_types.cummin(...)
- property data¶
返回一个 tensordict,其中包含叶张量的 .data 属性。
- data_ptr(*, storage: bool = False)¶
返回 tensordict 叶子的 data_ptr。
这可以用于检查两个 tensordict 是否共享相同的
data_ptr()
。- 关键字参数:
storage (bool, 可选) – 如果
True
,将调用 tensor.untyped_storage().data_ptr()。默认为False
。
示例
>>> from tensordict import TensorDict >>> td = TensorDict(a=torch.randn(2), b=torch.randn(2), batch_size=[2]) >>> assert (td0.data_ptr() == td.data_ptr()).all()
注意
LazyStackedTensorDict
实例将显示为嵌套的 tensordict,以反映其叶节点的真实data_ptr()
>>> td0 = TensorDict(a=torch.randn(2), b=torch.randn(2), batch_size=[2]) >>> td1 = TensorDict(a=torch.randn(2), b=torch.randn(2), batch_size=[2]) >>> td = TensorDict.lazy_stack([td0, td1]) >>> td.data_ptr() TensorDict( fields={ 0: TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), b: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=cpu, is_shared=False), 1: TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), b: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=cpu, is_shared=False)}, batch_size=torch.Size([]), device=cpu, is_shared=False)
- del_(*args, **kwargs)¶
删除 tensordict 的键。
- 参数:
key (NestedKey) – 要删除的键
- 返回值:
self
- densify(layout: layout = torch.strided)¶
尝试使用连续张量(普通张量或嵌套张量)表示延迟堆栈。
- 关键字参数:
layout (torch.layout) – 嵌套张量的布局(如果有)。默认为
strided
。
- detach() T ¶
分离 tensordict 中的张量。
- 返回值:
一个新的 tensordict,其中没有需要梯度的张量。
- detach_(*args, **kwargs)¶
就地分离 tensordict 中的张量。
- 返回值:
self.
- property device¶
TensorDict 的设备。
如果 TensorDict 具有指定的设备,则其所有张量(包括嵌套张量)必须位于同一设备上。 如果 TensorDict 设备为
None
,则不同的值可以位于不同的设备上。- 返回值:
torch.device 对象,指示张量所在的设备,如果 TensorDict 没有设备,则为 None。
示例
>>> td = TensorDict({ ... "cpu": torch.randn(3, device='cpu'), ... "cuda": torch.randn(3, device='cuda'), ... }, batch_size=[], device=None) >>> td['cpu'].device device(type='cpu') >>> td['cuda'].device device(type='cuda') >>> td = TensorDict({ ... "x": torch.randn(3, device='cpu'), ... "y": torch.randn(3, device='cuda'), ... }, batch_size=[], device='cuda') >>> td['x'].device device(type='cuda') >>> td['y'].device device(type='cuda') >>> td = TensorDict({ ... "x": torch.randn(3, device='cpu'), ... "y": TensorDict({'z': torch.randn(3, device='cpu')}, batch_size=[], device=None), ... }, batch_size=[], device='cuda') >>> td['x'].device device(type='cuda') >>> td['y'].device # nested tensordicts are also mapped onto the appropriate device. device(type='cuda') >>> td['y', 'x'].device device(type='cuda')
- dim() int ¶
参见
batch_dims()
。
- div(other: tensordict.base.TensorDictBase | torch.Tensor, *, default: str | torch.Tensor | None = None) T ¶
将输入
self
的每个元素除以other
的相应元素。\[\text{out}_i = \frac{\text{input}_i}{\text{other}_i}\]支持广播、类型提升以及整数、浮点数、tensordict 或张量输入。 始终将整数类型提升为默认标量类型。
- 参数:
other (TensorDict, Tensor 或 Number) – 除数。
- 关键字参数:
default (torch.Tensor 或 str, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递
default="intersection"
,则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default
将用于操作两侧所有缺失的条目。
- div_(other: tensordict.base.TensorDictBase | torch.Tensor) T ¶
div()
的就地版本。注意
就地
div
不支持default
关键字参数。
- double()¶
将所有张量转换为
torch.bool
类型。
- property dtype¶
返回 tensordict 中值的 dtype(如果它是唯一的)。
- dumps(prefix: Optional[str] = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False) T ¶
将 tensordict 保存到磁盘。
此函数是
memmap()
的代理。
- empty(recurse=False, *, batch_size=None, device=_NoDefault.ZERO, names=None) T ¶
返回一个新的,空的 tensordict,具有相同的设备和批量大小。
- 参数:
recurse (bool, optional) – 如果
True
,则会复制TensorDict
的整个结构,但不包含内容。 否则,只会复制根节点。 默认为False
。- 关键字参数:
batch_size (torch.Size, optional) – tensordict 的新批量大小。
device (torch.device, optional) – 新设备。
names (字符串列表, optional) – 维度名称。
- entry_class(*args, **kwargs)¶
返回条目的类,可能避免调用 isinstance(td.get(key), type)。
只要
get()
的执行成本很高,就应优先使用此方法,而不是tensordict.get(key).shape
。
- erf() T ¶
计算 TensorDict 中每个元素的
erf()
值。
- erf_() T ¶
就地计算 TensorDict 中每个元素的
erf()
值。
- erfc() T ¶
计算 TensorDict 中每个元素的
erfc()
值。
- erfc_() T ¶
就地计算 TensorDict 中每个元素的
erfc()
值。
- eval() T ¶
将模块设置为评估模式。
这仅对某些模块有效。 有关其在训练/评估模式下的行为的详细信息(即,它们是否受到影响),请参阅特定模块的文档,例如
Dropout
、BatchNorm
等。这等效于
self.train(False)
。有关 .eval() 与可能与其混淆的几种类似机制的比较,请参阅 本地禁用梯度计算。
- 返回值:
self
- 返回类型:
模块
- exclude(*keys: NestedKey, inplace: bool = False) T ¶
排除 tensordict 的键,并返回一个不包含这些条目的新 tensordict。
这些值不会被复制:就地修改原始或新 tensordict 的张量会导致两个 tensordict 都发生更改。
- 参数:
- 返回值:
一个新的 tensordict(如果
inplace=True
则为同一个)不包含排除的条目。
示例
>>> from tensordict import TensorDict >>> td = TensorDict({"a": 0, "b": {"c": 1, "d": 2}}, []) >>> td.exclude("a", ("b", "c")) TensorDict( fields={ b: TensorDict( fields={ d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> td.exclude("a", "b") TensorDict( fields={ }, batch_size=torch.Size([]), device=None, is_shared=False)
- exp() T ¶
计算 TensorDict 中每个元素的
exp()
值。
- exp_() T ¶
就地计算 TensorDict 中每个元素的
exp()
值。
- expand(*args, **kwargs) T ¶
根据
expand()
函数展开 tensordict 的每个张量,忽略特征维度。支持使用可迭代对象来指定形状。
示例
>>> td = TensorDict({ ... 'a': torch.zeros(3, 4, 5), ... 'b': torch.zeros(3, 4, 10)}, batch_size=[3, 4]) >>> td_expand = td.expand(10, 3, 4) >>> assert td_expand.shape == torch.Size([10, 3, 4]) >>> assert td_expand.get("a").shape == torch.Size([10, 3, 4, 5])
- expand_as(other: tensordict.base.TensorDictBase | torch.Tensor) TensorDictBase ¶
将 tensordict 的形状广播到 other 的形状,并相应地展开它。
如果输入是张量集合(tensordict 或 tensorclass),则叶子将以一对一的基础进行扩展。
示例
>>> from tensordict import TensorDict >>> import torch >>> td0 = TensorDict({ ... "a": torch.ones(3, 1, 4), ... "b": {"c": torch.ones(3, 2, 1, 4)}}, ... batch_size=[3], ... ) >>> td1 = TensorDict({ ... "a": torch.zeros(2, 3, 5, 4), ... "b": {"c": torch.zeros(2, 3, 2, 6, 4)}}, ... batch_size=[2, 3], ... ) >>> expanded = td0.expand_as(td1) >>> assert (expanded==1).all() >>> print(expanded) TensorDict( fields={ a: Tensor(shape=torch.Size([2, 3, 5, 4]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([2, 3, 2, 6, 4]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([2, 3]), device=None, is_shared=False)}, batch_size=torch.Size([2, 3]), device=None, is_shared=False)
- expm1() T ¶
计算 TensorDict 中每个元素的
expm1()
值。
- expm1_() T ¶
就地计算 TensorDict 中每个元素的
expm1()
值。
- fill_(key: NestedKey, value: float | bool) T ¶
用给定的标量值填充键指向的张量。
- 参数:
key (str 或 嵌套键) – 要填充的条目。
value (数字 或 bool) – 用于填充的值。
- 返回值:
self
- filter_empty_()¶
就地过滤掉所有空的 tensordict。
- filter_non_tensor_data() T ¶
过滤掉所有非张量数据。
- flatten(start_dim=0, end_dim=- 1)¶
扁平化 tensordict 的所有张量。
示例
>>> td = TensorDict({ ... "a": torch.arange(60).view(3, 4, 5), ... "b": torch.arange(12).view(3, 4)}, batch_size=[3, 4]) >>> td_flat = td.flatten(0, 1) >>> td_flat.batch_size torch.Size([12]) >>> td_flat["a"] tensor([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24], [25, 26, 27, 28, 29], [30, 31, 32, 33, 34], [35, 36, 37, 38, 39], [40, 41, 42, 43, 44], [45, 46, 47, 48, 49], [50, 51, 52, 53, 54], [55, 56, 57, 58, 59]]) >>> td_flat["b"] tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
- flatten_keys(separator: str = '.', inplace: bool = False) TensorDictBase ¶
递归地将嵌套的 tensordict 转换为扁平的 tensordict。
TensorDict 类型将会丢失,结果将会是一个简单的 TensorDict 实例。
- 参数:
separator (str, optional) – 嵌套项之间的分隔符。默认为
'.'
。inplace (bool, optional) – 如果
True
,则结果 tensordict 将与调用它的 tensordict 具有相同的标识。默认为False
。is_leaf (callable, optional) –
一个可调用对象,接受一个类类型作为参数,返回一个布尔值,指示该类是否应被视为叶节点。
注意
is_leaf 的目的不是阻止对嵌套 tensordict 的递归调用,而是将某些类型标记为“叶节点”,以便在 leaves_only=True 时进行过滤。 即使 is_leaf(cls) 返回 True,如果 include_nested=True,tensordict 的嵌套结构仍将被遍历。 换句话说,is_leaf 不控制递归深度,而是提供了一种在 leaves_only=True 时从结果中过滤掉某些类型的方法。 这意味着树中的一个节点可以既是叶节点,又是带有子节点的节点。 实际上,
is_leaf
的默认值会将 tensordict 和 tensorclass 实例从叶节点集中排除。另请参阅
示例
>>> data = TensorDict({"a": 1, ("b", "c"): 2, ("e", "f", "g"): 3}, batch_size=[]) >>> data.flatten_keys(separator=" - ") TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), b - c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), e - f - g: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
此方法和
unflatten_keys()
在处理 state-dicts 时特别有用,因为它们可以无缝地将扁平字典转换为模仿模型结构的数据结构。示例
>>> model = torch.nn.Sequential(torch.nn.Linear(3 ,4)) >>> ddp_model = torch.ao.quantization.QuantWrapper(model) >>> state_dict = TensorDict(ddp_model.state_dict(), batch_size=[]).unflatten_keys(".") >>> print(state_dict) TensorDict( fields={ module: TensorDict( fields={ 0: TensorDict( fields={ bias: Tensor(shape=torch.Size([4]), device=cpu, dtype=torch.float32, is_shared=False), weight: Tensor(shape=torch.Size([4, 3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> model_state_dict = state_dict.get("module") >>> print(model_state_dict) TensorDict( fields={ 0: TensorDict( fields={ bias: Tensor(shape=torch.Size([4]), device=cpu, dtype=torch.float32, is_shared=False), weight: Tensor(shape=torch.Size([4, 3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> model.load_state_dict(dict(model_state_dict.flatten_keys(".")))
- float()¶
将所有张量转换为
torch.float
。
- float16()¶
将所有张量转换为
torch.float16
。
- float32()¶
将所有张量转换为
torch.float32
。
- float64()¶
将所有张量转换为
torch.float64
。
- floor() T ¶
计算 TensorDict 中每个元素的
floor()
值。
- floor_() T ¶
原地计算 TensorDict 中每个元素的
floor()
值。
- forward(*input: Any) None ¶
定义每次调用时执行的计算。
应由所有子类重写。
注意
尽管需要在该函数中定义前向传递的配方,但之后应调用
Module
实例而不是此函数,因为前者负责运行注册的钩子,而后者会默默地忽略它们。
- frac() T ¶
计算 TensorDict 中每个元素的
frac()
值。
- frac_() T ¶
原地计算 TensorDict 中每个元素的
frac()
值。
- classmethod from_any(obj, *, auto_batch_size: bool = False, batch_dims: Optional[int] = None, device: Optional[device] = None, batch_size: Optional[Size] = None)¶
递归地将任何对象转换为 TensorDict。
注意
from_any
比常规 TensorDict 构造函数的限制更少。 它可以利用自定义启发式方法将 dataclasses 或 tuples 等数据结构转换为 tensordict。 这种方法可能会产生一些额外的开销,并且在映射策略方面涉及更多主观选择。注意
此方法递归地将输入对象转换为 TensorDict。 如果对象已经是 TensorDict(或任何类似的张量集合对象),它将按原样返回。
- 参数:
obj – 要转换的对象。
- 关键字参数:
auto_batch_size (bool, optional) – 如果
True
,将自动计算批次大小。 默认为False
。batch_dims (int, optional) – 如果 auto_batch_size 为
True
,则定义输出 tensordict 应具有的维度数。 默认为None
(每个级别的完整批次大小)。device (torch.device, optional) – TensorDict 将被创建在其上的设备。 (可选)
batch_size (torch.Size, optional) – TensorDict 的批量大小。与
auto_batch_size
互斥。(可选)
- 返回值:
输入对象的 TensorDict 表示。
支持的对象
通过
from_dataclass()
的 Dataclasses (dataclasses 将被转换为 TensorDict 实例,而不是 tensorclasses)。通过
from_namedtuple()
的 Namedtuples。通过
from_dict()
的字典。通过
from_tuple()
的元组。通过
from_struct_array()
的 NumPy 结构化数组。通过
from_h5()
的 HDF5 对象。
- classmethod from_dataclass(dataclass, *, auto_batch_size: bool = False, batch_dims: Optional[int] = None, as_tensorclass: bool = False, device: Optional[device] = None, batch_size: Optional[Size] = None)¶
将 dataclass 转换为 TensorDict 实例。
- 参数:
dataclass – 要转换的 dataclass 实例。
- 关键字参数:
auto_batch_size (bool, optional) – 如果为
True
,自动确定并将批量大小应用于生成的 TensorDict。默认为False
。(可选)batch_dims (int, optional) – 如果
auto_batch_size
为True
,则定义输出 tensordict 应具有的维度数。默认为None
(每一级的完整批量大小)。 (可选)as_tensorclass (bool, optional) – 如果为
True
,则将转换委托给自由函数from_dataclass()
并返回一个 tensor 兼容的类 (tensorclass()
) 或实例,而不是 TensorDict。默认为False
。(可选)device (torch.device, optional) – TensorDict 将被创建在其上的设备。默认为
None
。(可选)batch_size (torch.Size, optional) – TensorDict 的批量大小。默认为
None
。(可选)
- 返回值:
从提供的 dataclass 派生的 TensorDict 实例,除非 as_tensorclass 为 True,在这种情况下,将返回 tensor 兼容的类或实例。
- 引发:
TypeError – 如果提供的输入不是 dataclass 实例。
警告
此方法与自由函数 from_dataclass 不同,并且用途不同。虽然自由函数返回一个 tensor 兼容的类或实例,但此方法返回一个 TensorDict 实例。
- classmethod from_dict(*args, **kwargs)¶
返回从字典或另一个
TensorDict
创建的 TensorDict。如果未指定
batch_size
,则返回可能的最大批量大小。此函数也适用于嵌套字典,或者可用于确定嵌套 tensordict 的批量大小。
- 参数:
input_dict (dictionary, optional) – 要用作数据源的字典(兼容嵌套键)。(可选)
- 关键字参数:
auto_batch_size (bool, optional) – 如果
True
,将自动计算批次大小。 默认为False
。batch_size (iterable of int, optional) – tensordict 的批量大小。(可选)
device (torch.device or compatible type, optional) – TensorDict 的设备。(可选)
batch_dims (int, optional) –
batch_dims
(即要考虑为batch_size
的前导维度数)。与batch_size
互斥。请注意,这是 tensordict 的 __最大__ 批量维度数,允许更小的数字。(可选)names (list of str, optional) – tensordict 的维度名称列表。(可选)
示例
>>> input_dict = {"a": torch.randn(3, 4), "b": torch.randn(3)} >>> print(TensorDict.from_dict(input_dict)) TensorDict( fields={ a: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False), b: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3]), device=None, is_shared=False) >>> # nested dict: the nested TensorDict can have a different batch-size >>> # as long as its leading dims match. >>> input_dict = {"a": torch.randn(3), "b": {"c": torch.randn(3, 4)}} >>> print(TensorDict.from_dict(input_dict)) TensorDict( fields={ a: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3, 4]), device=None, is_shared=False)}, batch_size=torch.Size([3]), device=None, is_shared=False) >>> # we can also use this to work out the batch sie of a tensordict >>> input_td = TensorDict({"a": torch.randn(3), "b": {"c": torch.randn(3, 4)}}, []) >>> print(TensorDict.from_dict(input_td)) TensorDict( fields={ a: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3, 4]), device=None, is_shared=False)}, batch_size=torch.Size([3]), device=None, is_shared=False)
- from_dict_instance(input_dict, *, auto_batch_size: bool = False, batch_size=None, device=None, batch_dims=None)¶
from_dict()
的实例方法版本。与
from_dict()
不同,此方法将尝试保持现有树中的 tensordict 类型(对于任何现有叶)。示例
>>> from tensordict import TensorDict, tensorclass >>> import torch >>> >>> @tensorclass >>> class MyClass: ... x: torch.Tensor ... y: int >>> >>> td = TensorDict({"a": torch.randn(()), "b": MyClass(x=torch.zeros(()), y=1)}) >>> print(td.from_dict_instance(td.to_dict())) TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), b: MyClass( x=Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), y=Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> print(td.from_dict(td.to_dict())) TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ x: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), y: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
- classmethod from_h5(filename, *, mode: str = 'r', auto_batch_size: bool = False, batch_dims: Optional[int] = None, batch_size: Optional[Size] = None)¶
从 h5 文件创建 PersistentTensorDict。
- 参数:
filename (str) – h5 文件的路径。
- 关键字参数
mode (str, 可选): 读取模式。默认为
"r"
。auto_batch_size (bool, 可选): 如果为True
,则自动计算批量大小。默认为
False
。- batch_dims (int, 可选): 如果 auto_batch_size 为
True
,则定义输出 tensordict 应该具有的维度数量。默认为
None
(每个级别的完整批量大小)。
batch_size (torch.Size, 可选): TensorDict 的批量大小。默认为
None
。- batch_dims (int, 可选): 如果 auto_batch_size 为
- 返回值:
输入 h5 文件的 PersistentTensorDict 表示。
示例
>>> td = TensorDict.from_h5("path/to/file.h5") >>> print(td) PersistentTensorDict( fields={ key1: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False), key2: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
- classmethod from_module(module, as_module: bool = False, lock: bool = True, use_state_dict: bool = False)¶
将模块的参数和缓冲区复制到 tensordict 中。
- 参数:
module (nn.Module) – 要从中获取参数的模块。
as_module (bool, optional) – 如果为
True
,将返回一个TensorDictParams
实例,该实例可用于在torch.nn.Module
中存储参数。默认为False
。lock (bool, optional) – 如果为
True
,则生成的 tensordict 将被锁定。默认为True
。use_state_dict (bool, optional) –
如果为
True
,将使用模块的状态字典,并将其展开为具有模型树结构的 TensorDict。默认为False
。注意
当必须使用 state-dict 钩子时,这特别有用。
示例
>>> from torch import nn >>> module = nn.TransformerDecoder( ... decoder_layer=nn.TransformerDecoderLayer(nhead=4, d_model=4), ... num_layers=1 ... ) >>> params = TensorDict.from_module(module) >>> print(params["layers", "0", "linear1"]) TensorDict( fields={ bias: Parameter(shape=torch.Size([2048]), device=cpu, dtype=torch.float32, is_shared=False), weight: Parameter(shape=torch.Size([2048, 4]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
- classmethod from_modules(*modules, as_module: bool = False, lock: bool = True, use_state_dict: bool = False, lazy_stack: bool = False, expand_identical: bool = False)¶
检索多个模块的参数,用于 ensebmle 学习/期望通过 vmap 的应用功能。
- 参数:
modules (nn.Module 的序列) – 要从中获取参数的模块。如果模块的结构不同,则需要一个延迟堆叠(请参阅下面的
lazy_stack
参数)。- 关键字参数:
as_module (bool, optional) – 如果为
True
,将返回一个TensorDictParams
实例,该实例可用于在torch.nn.Module
中存储参数。默认为False
。lock (bool, optional) – 如果为
True
,则生成的 tensordict 将被锁定。默认为True
。use_state_dict (bool, optional) –
如果为
True
,将使用模块的状态字典,并将其展开为具有模型树结构的 TensorDict。默认为False
。注意
当必须使用 state-dict 钩子时,这特别有用。
lazy_stack (bool, optional) –
参数应该密集堆叠还是延迟堆叠。默认为
False
(密集堆叠)。注意
lazy_stack
和as_module
是互斥的功能。警告
延迟输出和非延迟输出之间存在一个关键区别,即非延迟输出将使用所需的批量大小重新实例化参数,而
lazy_stack
将仅将参数表示为延迟堆叠。这意味着虽然原始参数可以在lazy_stack=True
时安全地传递给优化器,但当设置为True
时,需要传递新参数。警告
虽然使用延迟堆叠来保持原始参数引用可能很诱人,但请记住,每次调用
get()
时,延迟堆叠都会执行堆叠。这将需要内存(参数大小的 N 倍,如果构建图形则更多)和时间来计算。这也意味着优化器将包含更多参数,并且像step()
或zero_grad()
这样的操作将需要更长时间才能执行。一般来说,lazy_stack
应该保留给极少数用例。expand_identical (bool, optional) – 如果
True
并且相同的参数(相同的标识)正在堆叠到自身,则将返回此参数的扩展版本。当lazy_stack=True
时,将忽略此参数。
示例
>>> from torch import nn >>> from tensordict import TensorDict >>> torch.manual_seed(0) >>> empty_module = nn.Linear(3, 4, device="meta") >>> n_models = 2 >>> modules = [nn.Linear(3, 4) for _ in range(n_models)] >>> params = TensorDict.from_modules(*modules) >>> print(params) TensorDict( fields={ bias: Parameter(shape=torch.Size([2, 4]), device=cpu, dtype=torch.float32, is_shared=False), weight: Parameter(shape=torch.Size([2, 4, 3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([2]), device=None, is_shared=False) >>> # example of batch execution >>> def exec_module(params, x): ... with params.to_module(empty_module): ... return empty_module(x) >>> x = torch.randn(3) >>> y = torch.vmap(exec_module, (0, None))(params, x) >>> assert y.shape == (n_models, 4) >>> # since lazy_stack = False, backprop leaves the original params untouched >>> y.sum().backward() >>> assert params["weight"].grad.norm() > 0 >>> assert modules[0].weight.grad is None
使用
lazy_stack=True
时,情况略有不同>>> params = TensorDict.from_modules(*modules, lazy_stack=True) >>> print(params) LazyStackedTensorDict( fields={ bias: Tensor(shape=torch.Size([2, 4]), device=cpu, dtype=torch.float32, is_shared=False), weight: Tensor(shape=torch.Size([2, 4, 3]), device=cpu, dtype=torch.float32, is_shared=False)}, exclusive_fields={ }, batch_size=torch.Size([2]), device=None, is_shared=False, stack_dim=0) >>> # example of batch execution >>> y = torch.vmap(exec_module, (0, None))(params, x) >>> assert y.shape == (n_models, 4) >>> y.sum().backward() >>> assert modules[0].weight.grad is not None
- classmethod from_namedtuple(named_tuple, *, auto_batch_size: bool = False, batch_dims: Optional[int] = None, device: Optional[device] = None, batch_size: Optional[Size] = None)¶
递归地将一个 namedtuple 转换为 TensorDict。
- 参数:
named_tuple – 要转换的 namedtuple 实例。
- 关键字参数:
auto_batch_size (bool, optional) – 如果
True
,将自动计算批次大小。 默认为False
。batch_dims (int, optional) – 如果
auto_batch_size
为True
,则定义输出 tensordict 应具有的维度数。默认为None
(每一级的完整批量大小)。 (可选)device (torch.device, optional) – TensorDict 将被创建在其上的设备。默认为
None
。(可选)batch_size (torch.Size, optional) – TensorDict 的批量大小。默认为
None
。(可选)
- 返回值:
输入 namedtuple 的 TensorDict 表示。
示例
>>> from tensordict import TensorDict >>> import torch >>> data = TensorDict({ ... "a_tensor": torch.zeros((3)), ... "nested": {"a_tensor": torch.zeros((3)), "a_string": "zero!"}}, [3]) >>> nt = data.to_namedtuple() >>> print(nt) GenericDict(a_tensor=tensor([0., 0., 0.]), nested=GenericDict(a_tensor=tensor([0., 0., 0.]), a_string='zero!')) >>> TensorDict.from_namedtuple(nt, auto_batch_size=True) TensorDict( fields={ a_tensor: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False), nested: TensorDict( fields={ a_string: NonTensorData(data=zero!, batch_size=torch.Size([3]), device=None), a_tensor: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3]), device=None, is_shared=False)}, batch_size=torch.Size([3]), device=None, is_shared=False)
- classmethod from_pytree(pytree, *, batch_size: Optional[Size] = None, auto_batch_size: bool = False, batch_dims: Optional[int] = None)¶
将一个 pytree 转换为 TensorDict 实例。
该方法旨在尽可能保留 pytree 的嵌套结构。
添加额外的非 tensor 键来跟踪每个级别的标识,提供了一个内置的 pytree 到 tensordict 的双射变换 API。
当前接受的类包括列表、元组、命名元组和字典。
注意
对于字典,非 NestedKey 键会单独注册为
NonTensorData
实例。注意
可转换为 Tensor 的类型(例如 int、float 或 np.ndarray)将被转换为 torch.Tensor 实例。 请注意,此转换是满射的:将 tensordict 转换回 pytree 将无法恢复原始类型。
示例
>>> # Create a pytree with tensor leaves, and one "weird"-looking dict key >>> class WeirdLookingClass: ... pass ... >>> weird_key = WeirdLookingClass() >>> # Make a pytree with tuple, lists, dict and namedtuple >>> pytree = ( ... [torch.randint(10, (3,)), torch.zeros(2)], ... { ... "tensor": torch.randn( ... 2, ... ), ... "td": TensorDict({"one": 1}), ... weird_key: torch.randint(10, (2,)), ... "list": [1, 2, 3], ... }, ... {"named_tuple": TensorDict({"two": torch.ones(1) * 2}).to_namedtuple()}, ... ) >>> # Build a TensorDict from that pytree >>> td = TensorDict.from_pytree(pytree) >>> # Recover the pytree >>> pytree_recon = td.to_pytree() >>> # Check that the leaves match >>> def check(v1, v2): >>> assert (v1 == v2).all() >>> >>> torch.utils._pytree.tree_map(check, pytree, pytree_recon) >>> assert weird_key in pytree_recon[1]
- classmethod from_struct_array(struct_array: ndarray, *, auto_batch_size: bool = False, batch_dims: Optional[int] = None, device: Optional[device] = None, batch_size: Optional[Size] = None) T ¶
将结构化的 numpy 数组转换为 TensorDict。
生成的 TensorDict 将与 numpy 数组共享相同的内存内容(这是一个零拷贝操作)。就地更改结构化的 numpy 数组的值将影响 TensorDict 的内容。
注意
此方法执行零拷贝操作,这意味着生成的 TensorDict 将与输入 numpy 数组共享相同的内存内容。因此,就地更改 numpy 数组的值将影响 TensorDict 的内容。
- 参数:
struct_array (np.ndarray) – 要转换的结构化的 numpy 数组。
- 关键字参数:
auto_batch_size (bool, 可选) – 如果为
True
,则会自动计算批量大小。默认为False
。batch_dims (int, optional) – 如果
auto_batch_size
为True
,则定义输出 tensordict 应具有的维度数。默认为None
(每一级的完整批量大小)。 (可选)device (torch.device, 可选) –
TensorDict 将在其上创建的设备。默认为
None
。注意
更改设备(即,指定任何非
None
或"cpu"
的设备)将传输数据,从而导致返回的数据的内存位置发生更改。batch_size (torch.Size, 可选) – TensorDict 的批量大小。默认为 None。
- 返回值:
输入结构化的 numpy 数组的 TensorDict 表示。
示例
>>> x = np.array( ... [("Rex", 9, 81.0), ("Fido", 3, 27.0)], ... dtype=[("name", "U10"), ("age", "i4"), ("weight", "f4")], ... ) >>> td = TensorDict.from_struct_array(x) >>> x_recon = td.to_struct_array() >>> assert (x_recon == x).all() >>> assert x_recon.shape == x.shape >>> # Try modifying x age field and check effect on td >>> x["age"] += 1 >>> assert (td["age"] == np.array([10, 4])).all()
- classmethod from_tuple(obj, *, auto_batch_size: bool = False, batch_dims: Optional[int] = None, device: Optional[device] = None, batch_size: Optional[Size] = None)¶
将一个元组转换为 TensorDict。
- 参数:
obj – 要转换的元组实例。
- 关键字参数:
auto_batch_size (bool, 可选) – 如果为
True
,则会自动计算批量大小。默认为False
。batch_dims (int, optional) – 如果 auto_batch_size 为
True
,则定义输出 tensordict 应具有的维度数。 默认为None
(每个级别的完整批次大小)。device (torch.device, optional) – TensorDict 将被创建在其上的设备。默认为
None
。(可选)batch_size (torch.Size, optional) – TensorDict 的批量大小。默认为
None
。(可选)
- 返回值:
输入元组的 TensorDict 表示。
示例
>>> my_tuple = (1, 2, 3) >>> td = TensorDict.from_tuple(my_tuple) >>> print(td) TensorDict( fields={ 0: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), 1: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), 2: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
- classmethod fromkeys(keys: List[NestedKey], value: Any = 0)¶
从一个键列表和一个单独的值创建一个 tensordict。
- 参数:
keys (NestedKey 的列表) – 一个可迭代对象,指定新字典的键。
value (兼容的类型, 可选) – 所有键的值。默认为
0
。
- gather(dim: int, index: Tensor, out: Optional[T] = None) T ¶
沿着 dim 指定的轴收集值。
- 参数:
dim (int) – 收集元素的维度。
index (torch.Tensor) – 一个长整型张量,其维度数与 tensordict 的维度数匹配,且只有收集维度不同。它的元素是指沿所需维度收集的索引。
out (TensorDictBase, optional) – 一个目标 tensordict。它必须与索引具有相同的形状。
示例
>>> td = TensorDict( ... {"a": torch.randn(3, 4, 5), ... "b": TensorDict({"c": torch.zeros(3, 4, 5)}, [3, 4, 5])}, ... [3, 4]) >>> index = torch.randint(4, (3, 2)) >>> td_gather = td.gather(dim=1, index=index) >>> print(td_gather) TensorDict( fields={ a: Tensor(shape=torch.Size([3, 2, 5]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([3, 2, 5]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3, 2, 5]), device=None, is_shared=False)}, batch_size=torch.Size([3, 2]), device=None, is_shared=False)
Gather 保留维度名称。
示例
>>> td.names = ["a", "b"] >>> td_gather = td.gather(dim=1, index=index) >>> td_gather.names ["a", "b"]
- gather_and_stack(dst: int, group: 'torch.distributed.ProcessGroup' | None = None) T | None ¶
从不同的工作进程收集 tensordict,并将它们堆叠到目标工作进程的 self 上。
- 参数:
dst (int) – 将调用
gather_and_stack()
的目标工作进程的秩。group (torch.distributed.ProcessGroup, 可选) – 如果设置,将使用指定的进程组进行通信。否则,将使用默认进程组。默认为
None
。
示例
>>> from torch import multiprocessing as mp >>> from tensordict import TensorDict >>> import torch >>> >>> def client(): ... torch.distributed.init_process_group( ... "gloo", ... rank=1, ... world_size=2, ... init_method=f"tcp://localhost:10003", ... ) ... # Create a single tensordict to be sent to server ... td = TensorDict( ... {("a", "b"): torch.randn(2), ... "c": torch.randn(2)}, [2] ... ) ... td.gather_and_stack(0) ... >>> def server(): ... torch.distributed.init_process_group( ... "gloo", ... rank=0, ... world_size=2, ... init_method=f"tcp://localhost:10003", ... ) ... # Creates the destination tensordict on server. ... # The first dim must be equal to world_size-1 ... td = TensorDict( ... {("a", "b"): torch.zeros(2), ... "c": torch.zeros(2)}, [2] ... ).expand(1, 2).contiguous() ... td.gather_and_stack(0) ... assert td["a", "b"] != 0 ... print("yuppie") ... >>> if __name__ == "__main__": ... mp.set_start_method("spawn") ... ... main_worker = mp.Process(target=server) ... secondary_worker = mp.Process(target=client) ... ... main_worker.start() ... secondary_worker.start() ... ... main_worker.join() ... secondary_worker.join()
- get(key: NestedKey, default: Any = None) Tensor ¶
获取与输入键存储的值。
- 参数:
key (str, str 的元组) – 要查询的键。如果是 str 的元组,则等效于链式调用 getattr。
default –
如果在 tensordict 中未找到键,则返回默认值。默认为
None
。警告
以前,如果在 tensordict 中不存在某个键且没有传递默认值,则会引发 KeyError。从 v0.7 开始,此行为已更改,而是返回 None 值(与 dict.get 行为一致)。要采用旧的行为,请设置环境变量 export TD_GET_DEFAULTS_TO_NONE=’0’ 或调用 :func`~tensordict.set_get_defaults_to_none(False)`。
示例
>>> td = TensorDict({"x": 1}, batch_size=[]) >>> td.get("x") tensor(1) >>> td.get("y") None
- get_at(key: NestedKey, *args, **kwargs) Tensor ¶
从键 key 在索引 idx 处获取 tensordict 的值。
- 参数:
key (str, str 的元组) – 要检索的键。
index (int, slice, torch.Tensor, iterable) – 张量的索引。
default (torch.Tensor) – 如果在 tensordict 中不存在该键,则返回默认值。
- 返回值:
索引张量。
示例
>>> td = TensorDict({"x": torch.arange(3)}, batch_size=[]) >>> td.get_at("x", index=1) tensor(1)
- get_buffer(target: str) Tensor ¶
如果存在,则返回由
target
给出的缓冲区,否则抛出错误。有关此方法的功能以及如何正确指定
target
的更详细说明,请参阅get_submodule
的文档字符串。- 参数:
target – 要查找的缓冲区的完全限定字符串名称。(有关如何指定完全限定字符串,请参阅
get_submodule
。)- 返回值:
由
target
引用的缓冲区- 返回类型:
- 引发:
AttributeError – 如果目标字符串引用了无效路径或解析为非缓冲区的内容
- get_extra_state() Any ¶
返回要包含在模块的 state_dict 中的任何额外状态。
如果您需要存储额外的状态,请为此模块实现此方法和相应的
set_extra_state()
。在构建模块的 state_dict() 时调用此函数。请注意,额外状态应该是可 pickle 化的,以确保 state_dict 的工作序列化。我们仅提供序列化张量的向后兼容性保证;如果其序列化的 pickle 形式发生更改,其他对象可能会破坏向后兼容性。
- 返回值:
要存储在模块的 state_dict 中的任何额外状态
- 返回类型:
- get_non_tensor(key: NestedKey, default=_NoDefault.ZERO)¶
获取非张量值(如果存在),或者在找不到非张量值时获取 default。
此方法对于张量/TensorDict 值是稳健的,这意味着如果收集的值是常规张量,它也将被返回(尽管此方法带有一些开销,不应超出其自然范围使用)。
有关如何在 tensordict 中设置非张量值的更多信息,请参阅
set_non_tensor()
。- 参数:
key (NestedKey) – NonTensorData 对象的位置。
default (Any, 可选) – 如果找不到键,则返回的值。
- 返回:
tensordict.tensorclass.NonTensorData
的内容, 如果该条目不是
tensordict.tensorclass.NonTensorData
类型,则返回与key
对应的条目(如果找不到该条目,则返回default
)。
示例
>>> data = TensorDict({}, batch_size=[]) >>> data.set_non_tensor(("nested", "the string"), "a string!") >>> assert data.get_non_tensor(("nested", "the string")) == "a string!" >>> # regular `get` works but returns a NonTensorData object >>> data.get(("nested", "the string")) NonTensorData( data='a string!', batch_size=torch.Size([]), device=None, is_shared=False)
- get_parameter(target: str) Parameter ¶
如果存在
target
指定的 parameter,则返回该 parameter,否则抛出错误。有关此方法的功能以及如何正确指定
target
的更详细说明,请参阅get_submodule
的文档字符串。- 参数:
target – 要查找的 Parameter 的完整字符串名称。(有关如何指定完整字符串,请参阅
get_submodule
。)- 返回值:
由
target
引用的 Parameter- 返回类型:
torch.nn.Parameter
- 引发:
AttributeError – 如果目标字符串引用了无效路径或解析为非
nn.Parameter
的对象,则引发此异常
- get_submodule(target: str) Module ¶
如果存在
target
指定的 submodule,则返回该 submodule,否则抛出错误。例如,假设你有一个
nn.Module
A
,其结构如下:A( (net_b): Module( (net_c): Module( (conv): Conv2d(16, 33, kernel_size=(3, 3), stride=(2, 2)) ) (linear): Linear(in_features=100, out_features=200, bias=True) ) )
(该图显示了一个
nn.Module
A
。A
具有一个嵌套的 submodulenet_b
,它本身又有两个 submodulenet_c
和linear
。net_c
又有一个 submoduleconv
。)要检查是否具有
linear
submodule,我们将调用get_submodule("net_b.linear")
。 要检查是否具有conv
submodule,我们将调用get_submodule("net_b.net_c.conv")
。get_submodule
的运行时受target
中 module 嵌套程度的限制。 对named_modules
的查询可以实现相同的结果,但它在传递 module 的数量上是 O(N) 的。 因此,对于检查某些 submodule 是否存在的简单检查,应始终使用get_submodule
。- 参数:
target – 要查找的 submodule 的完整字符串名称。(有关如何指定完整字符串,请参阅上面的示例。)
- 返回值:
由
target
引用的 submodule- 返回类型:
- 引发:
AttributeError – 如果目标字符串产生的路径中的任何一点上的(子)路径解析为不存在的属性名称或不是
nn.Module
实例的对象,则会引发此异常。
- property grad¶
返回一个 tensordict,其中包含叶 tensor 的 .grad 属性。
- half()¶
将所有 tensor 转换为
torch.half
。
- int()¶
将所有 tensor 转换为
torch.int
。
- int16()¶
将所有 tensor 转换为
torch.int16
。
- int32()¶
将所有 tensor 转换为
torch.int32
。
- int64()¶
将所有 tensor 转换为
torch.int64
。
- int8()¶
将所有 tensor 转换为
torch.int8
。
- ipu(device: Optional[Union[int, device]] = None) T ¶
将所有模型参数和缓冲区移动到 IPU。
这也会使关联的参数和缓冲区成为不同的对象。 因此,如果模块将在 IPU 上进行优化,则应在构建优化器之前调用此方法。
注意
此方法会就地修改模块。
- 参数:
device (int, optional) – 如果指定,所有参数都将复制到该设备
- 返回值:
self
- 返回类型:
模块
- irecv(src: int, *, group: 'torch.distributed.ProcessGroup' | None = None, return_premature: bool = False, init_tag: int = 0, pseudo_rand: bool = False) tuple[int, list[torch.Future]] | list[torch.Future] | None ¶
异步接收 tensordict 的内容并使用它更新内容。
有关上下文,请查看
isend()
方法中的示例。- 参数:
src (int) – 源 worker 的排名。
- 关键字参数:
group (torch.distributed.ProcessGroup, 可选) – 如果设置,将使用指定的进程组进行通信。否则,将使用默认进程组。默认为
None
。return_premature (bool) – 如果为
True
,则返回一个 futures 列表,用于等待直到 tensordict 被更新。默认为False
,即在调用中等待直到更新完成。init_tag (int) – 源 worker 使用的
init_tag
。pseudo_rand (bool) – 如果为 True,则标签序列将是伪随机的,允许从不同节点发送多个数据而不会重叠。 请注意,生成这些伪随机数非常耗时(1e-5 秒/数字),这意味着它可能会降低算法的运行时。 该值必须与传递给
isend()
的值匹配。 默认为False
。
- 返回值:
- 如果
return_premature=True
,则为要等待的 futures 列表 直到 tensordict 被更新。
- 如果
- is_consolidated()¶
检查 TensorDict 是否具有 consolidated 存储。
- is_contiguous(*args, **kwargs)¶
返回一个布尔值,指示所有张量是否都是连续的。
- property is_memmap: bool¶
检查 tensordict 是否为内存映射。
如果 TensorDict 实例是内存映射的,则它被锁定(条目无法重命名、删除或添加)。 如果使用都是内存映射的张量创建
TensorDict
,这 __并不__ 意味着is_memmap
将返回True
(因为新的张量可能是也可能不是内存映射的)。 只有当调用 tensordict.memmap_() 时,tensordict 才会被认为是内存映射的。对于 CUDA 设备上的 tensordict,这始终为
True
。
检查 tensordict 是否在共享内存中。
如果 TensorDict 实例在共享内存中,则它被锁定(条目无法重命名、删除或添加)。 如果使用都在共享内存中的张量创建
TensorDict
,这 __并不__ 意味着is_shared
将返回True
(因为新的张量可能是也可能不是在共享内存中)。 只有当调用 tensordict.share_memory_() 或将 tensordict 放置在默认情况下内容共享的设备上(例如,"cuda"
)时,tensordict 才会被认为是在共享内存中。对于 CUDA 设备上的 tensordict,这始终为
True
。
- isend(dst: int, *, group: 'torch.distributed.ProcessGroup' | None = None, init_tag: int = 0, pseudo_rand: bool = False) int ¶
异步发送 tensordict 的内容。
- 参数:
dst (int) – 目标 worker 的 rank,内容应发送到该 worker。
- 关键字参数:
示例
>>> import torch >>> from tensordict import TensorDict >>> from torch import multiprocessing as mp >>> def client(): ... torch.distributed.init_process_group( ... "gloo", ... rank=1, ... world_size=2, ... init_method=f"tcp://localhost:10003", ... ) ... ... td = TensorDict( ... { ... ("a", "b"): torch.randn(2), ... "c": torch.randn(2, 3), ... "_": torch.ones(2, 1, 5), ... }, ... [2], ... ) ... td.isend(0) ... >>> >>> def server(queue, return_premature=True): ... torch.distributed.init_process_group( ... "gloo", ... rank=0, ... world_size=2, ... init_method=f"tcp://localhost:10003", ... ) ... td = TensorDict( ... { ... ("a", "b"): torch.zeros(2), ... "c": torch.zeros(2, 3), ... "_": torch.zeros(2, 1, 5), ... }, ... [2], ... ) ... out = td.irecv(1, return_premature=return_premature) ... if return_premature: ... for fut in out: ... fut.wait() ... assert (td != 0).all() ... queue.put("yuppie") ... >>> >>> if __name__ == "__main__": ... queue = mp.Queue(1) ... main_worker = mp.Process( ... target=server, ... args=(queue, ) ... ) ... secondary_worker = mp.Process(target=client) ... ... main_worker.start() ... secondary_worker.start() ... out = queue.get(timeout=10) ... assert out == "yuppie" ... main_worker.join() ... secondary_worker.join()
- isfinite() T ¶
返回一个新的 tensordict,其中包含布尔元素,表示每个元素是否有限。
当实数值不是 NaN、负无穷或正无穷时,它们是有限的。 当复数的实部和虚部都有限时,它们是有限的。
- isnan() T ¶
返回一个新的 tensordict,其中包含布尔元素,表示输入的每个元素是否为 NaN。
当复数的实部和/或虚部为 NaN 时,该复数被认为是 NaN。
- isneginf() T ¶
测试输入的每个元素是否为负无穷。
- isposinf() T ¶
测试输入的每个元素是否为负无穷。
- isreal() T ¶
返回一个新的 tensordict,其中包含布尔元素,表示输入的每个元素是否为实数值。
- items(include_nested: bool = False, leaves_only: bool = False, is_leaf: Optional[Callable[[Type], bool]] = None, *, sort: bool = False) Iterator[Tensor] ¶
返回 tensordict 的键值对生成器。
- 参数:
include_nested (bool, optional) – 如果
True
, 将返回嵌套的值。默认为False
。leaves_only (bool, optional) – 如果
False
,则仅返回叶子节点。默认为False
。is_leaf (callable, optional) –
一个可调用对象,接受一个类类型作为参数,返回一个布尔值,指示该类是否应被视为叶节点。
注意
is_leaf 的目的不是阻止对嵌套 tensordict 的递归调用,而是将某些类型标记为“叶节点”,以便在 leaves_only=True 时进行过滤。 即使 is_leaf(cls) 返回 True,如果 include_nested=True,tensordict 的嵌套结构仍将被遍历。 换句话说,is_leaf 不控制递归深度,而是提供了一种在 leaves_only=True 时从结果中过滤掉某些类型的方法。 这意味着树中的一个节点可以既是叶节点,又是带有子节点的节点。 实际上,
is_leaf
的默认值会将 tensordict 和 tensorclass 实例从叶节点集中排除。另请参阅
- 关键字参数:
sort (bool, optional) – 是否应该对键进行排序。对于嵌套键,键将根据它们的连接名称进行排序(即,
("a", "key")
将被视为"a.key"
进行排序)。请注意,处理大型 tensordict 时,排序可能会产生显着的开销。默认为False
。
- keys(*args, **kwargs)¶
返回 tensordict 键的生成器。
警告
TensorDict 的
keys()
方法返回键的惰性视图。如果查询了keys
但未对其进行迭代,然后修改了 tensordict,则稍后迭代键将返回键的新配置。- 参数:
include_nested (bool, optional) – 如果
True
, 将返回嵌套的值。默认为False
。leaves_only (bool, optional) – 如果
False
,则仅返回叶子节点。默认为False
。is_leaf (callable, optional) –
一个可调用对象,接受一个类类型作为参数,返回一个布尔值,指示该类是否应被视为叶节点。
注意
is_leaf 的目的不是阻止对嵌套 tensordict 的递归调用,而是将某些类型标记为“叶节点”,以便在 leaves_only=True 时进行过滤。 即使 is_leaf(cls) 返回 True,如果 include_nested=True,tensordict 的嵌套结构仍将被遍历。 换句话说,is_leaf 不控制递归深度,而是提供了一种在 leaves_only=True 时从结果中过滤掉某些类型的方法。 这意味着树中的一个节点可以既是叶节点,又是带有子节点的节点。 实际上,
is_leaf
的默认值会将 tensordict 和 tensorclass 实例从叶节点集中排除。另请参阅
- 关键字参数:
sort (bool, optional) – 是否应对键进行排序。对于嵌套键,键将根据它们的连接名称进行排序(即,
("a", "key")
将被视为"a.key"
进行排序)。请注意,处理大型 tensordict 时,排序可能会产生显着的开销。默认为False
。
示例
>>> from tensordict import TensorDict >>> data = TensorDict({"0": 0, "1": {"2": 2}}, batch_size=[]) >>> data.keys() ['0', '1'] >>> list(data.keys(leaves_only=True)) ['0'] >>> list(data.keys(include_nested=True, leaves_only=True)) ['0', '1', ('1', '2')]
- classmethod lazy_stack(input, dim=0, *, out=None, **kwargs)¶
创建 tensordict 的惰性堆栈。
有关详细信息,请参见
lazy_stack()
。
- lerp(end: tensordict.base.TensorDictBase | torch.Tensor, weight: tensordict.base.TensorDictBase | torch.Tensor | float)¶
根据标量或张量
weight
对两个张量start
(由self
给出)和end
进行线性插值。\[\text{out}_i = \text{start}_i + \text{weight}_i \times (\text{end}_i - \text{start}_i)\]start
和end
的形状必须是可广播的。如果weight
是一个张量,那么weight
、start
和end
的形状必须是可广播的。- 参数:
end (TensorDict) – 包含结束点的 tensordict。
weight (TensorDict, tensor 或 float) – 插值公式的权重。
- 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 或 Path to folder) – 保存的 tensordict 所在的文件夹路径。
device (torch.device 或 等价物, 可选) – 如果提供,数据将被异步地转换到该设备。支持 “meta” 设备,在这种情况下,数据不会被加载,而是创建一组空的 “meta” 张量。这对于了解总模型大小和结构而不实际打开任何文件很有用。
non_blocking (bool, 可选) – 如果
True
,则在设备上加载张量后不会调用 synchronize。默认为False
。out (TensorDictBase, 可选) – 可选的 tensordict,数据应写入其中。
示例
>>> from tensordict import TensorDict >>> td = TensorDict.fromkeys(["a", "b", "c", ("nested", "e")], 0) >>> td.memmap("./saved_td") >>> td_load = TensorDict.load_memmap("./saved_td") >>> assert (td == td_load).all()
此方法还允许加载嵌套的 tensordicts。
示例
>>> nested = TensorDict.load_memmap("./saved_td/nested") >>> assert nested["e"] == 0
一个 tensordict 也可以被加载到 “meta” 设备上,或者,作为假张量。
示例
>>> import tempfile >>> td = TensorDict({"a": torch.zeros(()), "b": {"c": torch.zeros(())}}) >>> with tempfile.TemporaryDirectory() as path: ... td.save(path) ... td_load = TensorDict.load_memmap(path, device="meta") ... print("meta:", td_load) ... from torch._subclasses import FakeTensorMode ... with FakeTensorMode(): ... td_load = TensorDict.load_memmap(path) ... print("fake:", td_load) meta: TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=meta, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([]), device=meta, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=meta, is_shared=False)}, batch_size=torch.Size([]), device=meta, is_shared=False) fake: TensorDict( fields={ a: FakeTensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: FakeTensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=cpu, is_shared=False)}, batch_size=torch.Size([]), device=cpu, is_shared=False)
- load_memmap_(prefix: str | pathlib.Path)¶
在调用
load_memmap_
的 tensordict 中加载一个内存映射的 tensordict 的内容。有关更多信息,请参阅
load_memmap()
。
- load_state_dict(state_dict: OrderedDict[str, Any], strict=True, assign=False)¶
加载一个 state_dict (状态字典), 格式如
state_dict()
,到 tensordict 中。- 参数:
state_dict (OrderedDict) – 要复制的 state_dict。
strict (bool, 可选) – 是否严格强制
state_dict
中的键与此 tensordict 的torch.nn.Module.state_dict()
函数返回的键匹配。默认值:True
assign (bool, 可选) – 是否将状态字典中的项目分配给 tensordict 中对应的键,而不是将它们就地复制到 tensordict 的当前张量中。当
False
时,当前模块中张量的属性将被保留,而当True
时,状态字典中张量的属性将被保留。默认值:False
from_flatten (bool, 可选) – 如果
True
,则假定输入的 state_dict 已被扁平化。默认为False
。
示例
>>> data = TensorDict({"1": 1, "2": 2, "3": {"3": 3}}, []) >>> data_zeroed = TensorDict({"1": 0, "2": 0, "3": {"3": 0}}, []) >>> sd = data.state_dict() >>> data_zeroed.load_state_dict(sd) >>> print(data_zeroed["3", "3"]) tensor(3) >>> # with flattening >>> data_zeroed = TensorDict({"1": 0, "2": 0, "3": {"3": 0}}, []) >>> data_zeroed.load_state_dict(data.state_dict(flatten=True), from_flatten=True) >>> print(data_zeroed["3", "3"]) tensor(3)
- lock_() T ¶
锁定一个 tensordict,以防止非就地操作。
诸如
set()
,__setitem__()
,update()
,rename_key_()
或其他添加或删除条目的操作将被阻止。此方法可以用作装饰器。
示例
>>> from tensordict import TensorDict >>> td = TensorDict({"a": 1, "b": 2, "c": 3}, batch_size=[]) >>> with td.lock_(): ... assert td.is_locked ... try: ... td.set("d", 0) # error! ... except RuntimeError: ... print("td is locked!") ... try: ... del td["d"] ... except RuntimeError: ... print("td is locked!") ... try: ... td.rename_key_("a", "d") ... except RuntimeError: ... print("td is locked!") ... td.set("a", 0, inplace=True) # No storage is added, moved or removed ... td.set_("a", 0) # No storage is added, moved or removed ... td.update({"a": 0}, inplace=True) # No storage is added, moved or removed ... td.update_({"a": 0}) # No storage is added, moved or removed >>> assert not td.is_locked
- log() T ¶
计算 TensorDict 中每个元素的
log()
值。
- log10() T ¶
计算 TensorDict 中每个元素的
log10()
值。
- log10_() T ¶
就地计算 TensorDict 中每个元素的
log10()
值。
- log1p() T ¶
计算 TensorDict 中每个元素的
log1p()
值。
- log1p_() T ¶
就地计算 TensorDict 中每个元素的
log1p()
值。
- log2() T ¶
计算 TensorDict 中每个元素的
log2()
值。
- log2_() T ¶
原地计算 TensorDict 中每个元素的
log2()
值。
- log_() T ¶
原地计算 TensorDict 中每个元素的
log()
值。
- logical_and(other: tensordict.base.TensorDictBase | torch.Tensor, *, default: str | torch.Tensor | None = None) TensorDictBase ¶
执行
self
和other
之间的逻辑与运算。\[\text{{out}}_i = \text{{input}}_i \land \text{{other}}_i\]- 参数:
other (TensorDictBase 或 torch.Tensor) – 用于执行逻辑与运算的 tensor 或 TensorDict。
- 关键字参数:
default (torch.Tensor 或 str, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递
default="intersection"
,则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default
将用于操作两侧所有缺失的条目。
- logsumexp(dim=None, keepdim=False, *, out=None)¶
返回给定维度
dim
中输入 tensordict 每行的指数和的对数。该计算经过数值稳定处理。如果 keepdim 为
True
,则输出张量的大小与输入张量相同,只是在维度dim
中大小为1
。 否则,dim
被压缩(参见squeeze()
),导致输出张量的维度减少 1(或 len(dim))。- 参数:
- 关键字参数:
out (TensorDictBase, 可选) – 输出 tensordict。
- make_memmap(key: NestedKey, shape: torch.Size | torch.Tensor, *, dtype: Optional[dtype] = None) MemoryMappedTensor ¶
根据形状(shape)和可能的 dtype 创建一个空的内存映射张量。
警告
此方法在设计上不是锁安全的。 存在于多个节点上的内存映射 TensorDict 实例需要使用方法
memmap_refresh_()
进行更新。写入现有条目将导致错误。
- 参数:
key (NestedKey) – 要写入的新条目的键。 如果该键已存在于 tensordict 中,则会引发异常。
shape (torch.Size 或 等效项, 嵌套张量的 torch.Tensor) – 要写入的张量的形状。
- 关键字参数:
dtype (torch.dtype, 可选) – 新张量的 dtype。
- 返回值:
一个新的内存映射张量。
- make_memmap_from_storage(key: NestedKey, storage: UntypedStorage, shape: torch.Size | torch.Tensor, *, dtype: Optional[dtype] = None) MemoryMappedTensor ¶
根据存储(storage)、形状(shape)和可能的 dtype 创建一个空的内存映射张量。
警告
此方法在设计上不是锁安全的。 存在于多个节点上的内存映射 TensorDict 实例需要使用方法
memmap_refresh_()
进行更新。注意
如果存储具有关联的文件名,则它必须与该文件的新文件名匹配。 如果它没有关联的文件名,但 tensordict 具有关联的路径,则会导致异常。
- 参数:
key (NestedKey) – 要写入的新条目的键。 如果该键已存在于 tensordict 中,则会引发异常。
storage (torch.UntypedStorage) – 用于新 MemoryMappedTensor 的存储。 必须是物理内存存储。
shape (torch.Size 或 等效项, 嵌套张量的 torch.Tensor) – 要写入的张量的形状。
- 关键字参数:
dtype (torch.dtype, 可选) – 新张量的 dtype。
- 返回值:
具有给定存储的新内存映射张量。
- make_memmap_from_tensor(key: NestedKey, tensor: Tensor, *, copy_data: bool = True) MemoryMappedTensor ¶
根据张量创建一个空的内存映射张量。
警告
此方法在设计上不是锁安全的。 存在于多个节点上的内存映射 TensorDict 实例需要使用方法
memmap_refresh_()
进行更新。如果
copy_data
为True
(即存储未共享),则此方法始终复制存储内容。- 参数:
key (NestedKey) – 要写入的新条目的键。 如果该键已存在于 tensordict 中,则会引发异常。
tensor (torch.Tensor) – 要在物理内存上复制的张量。
- 关键字参数:
copy_data (bool, optional) – 如果
False
,则新张量将共享输入的元数据,例如形状和数据类型,但内容将为空。 默认为True
。- 返回值:
具有给定存储的新内存映射张量。
- map(fn: Callable, dim: int = 0, num_workers: Optional[int] = None, chunksize: Optional[int] = None, num_chunks: Optional[int] = None, pool: Optional[Pool] = None, generator: Optional[Generator] = None, max_tasks_per_child: Optional[int] = None, worker_threads: int = 1, mp_start_method: Optional[str] = None)¶
将函数映射到 tensordict 沿一个维度的拆分。
此方法将通过将 tensordict 实例分成大小相等的 tensordict 并将操作分派到所需数量的工作程序,从而将函数应用于 tensordict 实例。
函数签名应为
Callabe[[TensorDict], Union[TensorDict, Tensor]]
。 输出必须支持torch.cat()
操作。 函数必须是可序列化的。注意
当处理存储在磁盘上的大型数据集(例如,内存映射的 tensordict)时,此方法特别有用,其中块将是原始数据的零拷贝切片,可以几乎零成本地传递到进程。 这允许以很小的代价处理非常大的数据集(例如,超过 Tb)。
- 参数:
- 关键字参数:
out (TensorDictBase, optional) – 输出的可选容器。 其沿提供的
dim
的批处理大小必须与self.ndim
匹配。 如果它是共享的或 memmap (is_shared()
或is_memmap()
返回True
) ,它将在远程进程中填充,从而避免数据向内传输。 否则,来自self
切片的数据将被发送到进程,在当前进程上收集并就地写入out
。chunksize (int, optional) – 每个数据块的大小。
chunksize
为 0 将沿所需的维度解绑定 tensordict 并在应用函数后重新堆叠它,而chunksize>0
将拆分 tensordict 并在生成的 tensordict 列表上调用torch.cat()
。 如果未提供,块的数量将等于工作程序的数量。 对于非常大的 tensordict,如此大的块可能不适合在内存中进行操作,并且可能需要更多块才能使操作在实践中可行。 此参数与num_chunks
互斥。num_chunks (int, optional) – 将 tensordict 分成块的数量。 如果未提供,块的数量将等于工作程序的数量。 对于非常大的 tensordict,如此大的块可能不适合在内存中进行操作,并且可能需要更多块才能使操作在实践中可行。 此参数与
chunksize
互斥。pool (mp.Pool, optional) – 用于执行作业的多进程池实例。 如果未提供,则将在
map
方法中创建一个池。generator (torch.Generator, optional) –
用于播种的生成器。 将从中生成一个基本种子,并且池的每个工作程序都将使用提供的种子递增一个从
0
到num_workers
的唯一整数来播种。 如果未提供生成器,则将使用一个随机整数作为种子。 要使用未播种的工作程序,应单独创建一个池并直接传递给map()
。注意
提供一个低值的种子时应谨慎,因为这可能会导致实验之间的自相关,例如:如果请求了 8 个工作程序,并且种子为 4,则工作程序种子将从 4 到 11。如果种子为 5,则工作程序种子将从 5 到 12。这两个实验将有 7 个种子的重叠,这可能会对结果产生意想不到的影响。
注意
worker 初始化的目标是让每个 worker 拥有独立的种子,而**不是**让 map 方法的每次调用都产生可复现的结果。 换句话说,由于无法知道哪个 worker 将选择哪个任务,因此两个实验可能并且很可能会返回不同的结果。但是,我们可以确保每个 worker 都有不同的种子,并且每个 worker 上的伪随机操作是不相关的。
max_tasks_per_child (int, optional) – 每个子进程选择的最大任务数。默认为
None
,即对任务数量没有限制。worker_threads (int, optional) – worker 使用的线程数。默认为
1
。index_with_generator (bool, optional) – 如果为
True
,则将在查询期间完成 tensordict 的拆分/分块,从而节省初始化时间。请注意,chunk()
和split()
比索引(在生成器中使用)效率高得多,因此在初始化时节省处理时间可能会对总运行时间产生负面影响。默认为False
。pbar (bool, optional) – 如果为
True
,将显示进度条。需要安装 tqdm。默认为False
。mp_start_method (str, optional) – 多进程的启动方法。如果未提供,将使用默认启动方法。接受的字符串为
"fork"
和"spawn"
。请记住,使用"fork"
启动方法时,"cuda"
张量不能在进程之间共享。如果pool
传递给map
方法,则此设置无效。
示例
>>> import torch >>> from tensordict import TensorDict >>> >>> def process_data(data): ... data.set("y", data.get("x") + 1) ... return data >>> if __name__ == "__main__": ... data = TensorDict({"x": torch.zeros(1, 1_000_000)}, [1, 1_000_000]).memmap_() ... data = data.map(process_data, dim=1) ... print(data["y"][:, :10]) ... tensor([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])
- map_iter(fn: Callable[[TensorDictBase], TensorDictBase | None], dim: int = 0, num_workers: int | None = None, *, shuffle: bool = False, chunksize: int | None = None, num_chunks: int | None = None, pool: mp.Pool | None = None, generator: torch.Generator | None = None, max_tasks_per_child: int | None = None, worker_threads: int = 1, index_with_generator: bool = True, pbar: bool = False, mp_start_method: str | None = None)¶
迭代地将函数映射到 tensordict 沿一个维度的拆分。
这是
map()
的可迭代版本。此方法将通过将 tensordict 实例分块为大小相等的 tensordict,并将操作分派到所需数量的 worker 上来将函数应用于 tensordict 实例。它将一次产生一个结果。
函数签名应为
Callabe[[TensorDict], Union[TensorDict, Tensor]]
。该函数必须是可序列化的。注意
当处理存储在磁盘上的大型数据集(例如,内存映射的 tensordict)时,此方法特别有用,其中块将是原始数据的零拷贝切片,可以几乎零成本地传递到进程。 这允许以很小的代价处理非常大的数据集(例如,超过 Tb)。
注意
此函数可用于表示数据集并从中加载数据,类似于 dataloader 的方式。
- 参数:
- 关键字参数:
shuffle (bool, optional) – 是否应全局打乱索引。如果为
True
,则每个批次将包含非连续样本。如果index_with_generator=False
并且 shuffle=True`,则会引发错误。默认为False
。chunksize (int, optional) – 每个数据块的大小。
chunksize
为 0 将沿所需的维度解绑定 tensordict 并在应用函数后重新堆叠它,而chunksize>0
将拆分 tensordict 并在生成的 tensordict 列表上调用torch.cat()
。 如果未提供,块的数量将等于工作程序的数量。 对于非常大的 tensordict,如此大的块可能不适合在内存中进行操作,并且可能需要更多块才能使操作在实践中可行。 此参数与num_chunks
互斥。num_chunks (int, optional) – 将 tensordict 分成块的数量。 如果未提供,块的数量将等于工作程序的数量。 对于非常大的 tensordict,如此大的块可能不适合在内存中进行操作,并且可能需要更多块才能使操作在实践中可行。 此参数与
chunksize
互斥。pool (mp.Pool, optional) – 用于执行作业的多进程池实例。 如果未提供,则将在
map
方法中创建一个池。generator (torch.Generator, optional) –
用于播种的生成器。 将从中生成一个基本种子,并且池的每个工作程序都将使用提供的种子递增一个从
0
到num_workers
的唯一整数来播种。 如果未提供生成器,则将使用一个随机整数作为种子。 要使用未播种的工作程序,应单独创建一个池并直接传递给map()
。注意
提供一个低值的种子时应谨慎,因为这可能会导致实验之间的自相关,例如:如果请求了 8 个工作程序,并且种子为 4,则工作程序种子将从 4 到 11。如果种子为 5,则工作程序种子将从 5 到 12。这两个实验将有 7 个种子的重叠,这可能会对结果产生意想不到的影响。
注意
worker 初始化的目标是让每个 worker 拥有独立的种子,而**不是**让 map 方法的每次调用都产生可复现的结果。 换句话说,由于无法知道哪个 worker 将选择哪个任务,因此两个实验可能并且很可能会返回不同的结果。但是,我们可以确保每个 worker 都有不同的种子,并且每个 worker 上的伪随机操作是不相关的。
max_tasks_per_child (int, optional) – 每个子进程选择的最大任务数。默认为
None
,即对任务数量没有限制。worker_threads (int, optional) – worker 使用的线程数。默认为
1
。index_with_generator (bool, optional) –
如果为
True
,则将在查询期间完成 tensordict 的拆分/分块,从而节省初始化时间。请注意,chunk()
和split()
比索引(在生成器中使用)效率高得多,因此在初始化时节省处理时间可能会对总运行时间产生负面影响。默认为True
。注意
对于
map_iter
和map
,index_with_generator
的默认值不同,前者假定将 TensorDict 的拆分版本存储在内存中成本过高。pbar (bool, optional) – 如果为
True
,将显示进度条。需要安装 tqdm。默认为False
。mp_start_method (str, optional) – 多进程的启动方法。如果未提供,将使用默认启动方法。接受的字符串为
"fork"
和"spawn"
。请记住,使用"fork"
启动方法时,"cuda"
张量不能在进程之间共享。如果pool
传递给map
方法,则此设置无效。
示例
>>> import torch >>> from tensordict import TensorDict >>> >>> def process_data(data): ... data.unlock_() ... data.set("y", data.get("x") + 1) ... return data >>> if __name__ == "__main__": ... data = TensorDict({"x": torch.zeros(1, 1_000_000)}, [1, 1_000_000]).memmap_() ... for sample in data.map_iter(process_data, dim=1, chunksize=5): ... print(sample["y"]) ... break ... tensor([[1., 1., 1., 1., 1.]])
- masked_fill(*args, **kwargs)¶
masked_fill 的非原地版本。
- 参数:
mask (boolean torch.Tensor) – 要填充的值的掩码。形状必须与 tensordict 的批大小匹配。
value – 用于填充张量的值。
- 返回值:
self
示例
>>> td = TensorDict(source={'a': torch.zeros(3, 4)}, ... batch_size=[3]) >>> mask = torch.tensor([True, False, False]) >>> td1 = td.masked_fill(mask, 1.0) >>> td1.get("a") tensor([[1., 1., 1., 1.], [0., 0., 0., 0.], [0., 0., 0., 0.]])
- masked_fill_(*args, **kwargs)¶
用所需的值填充对应于掩码的值。
- 参数:
mask (boolean torch.Tensor) – 要填充的值的掩码。形状必须与 tensordict 的批大小匹配。
value – 用于填充张量的值。
- 返回值:
self
示例
>>> td = TensorDict(source={'a': torch.zeros(3, 4)}, ... batch_size=[3]) >>> mask = torch.tensor([True, False, False]) >>> td.masked_fill_(mask, 1.0) >>> td.get("a") tensor([[1., 1., 1., 1.], [0., 0., 0., 0.], [0., 0., 0., 0.]])
- masked_select(mask: Tensor) T ¶
屏蔽 TensorDict 的所有张量,并返回一个新的 TensorDict 实例,该实例具有指向屏蔽值的相似键。
- 参数:
mask (torch.Tensor) – 用于张量的布尔掩码。形状必须与 TensorDict 的
batch_size
匹配。
示例
>>> td = TensorDict(source={'a': torch.zeros(3, 4)}, ... batch_size=[3]) >>> mask = torch.tensor([True, False, False]) >>> td_mask = td.masked_select(mask) >>> td_mask.get("a") tensor([[0., 0., 0., 0.]])
- max(dim: int | NO_DEFAULT = _NoDefault.ZERO, keepdim: bool = False, *, reduce: bool | None = None, return_indices: bool = True) TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有元素的最大值。
- 参数:
- 关键字参数:
示例
>>> 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 ¶
计算
self
和other
的逐元素最大值。- 参数:
other (TensorDict or Tensor) – 另一个输入 tensordict 或 tensor。
- 关键字参数:
default (torch.Tensor 或 str, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递
default="intersection"
,则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default
将用于操作两侧所有缺失的条目。
- maximum_(other: tensordict.base.TensorDictBase | torch.Tensor) T ¶
maximum()
的原地版本。注意
原地
maximum
不支持default
关键字参数。
- classmethod maybe_dense_stack(input, dim=0, *, out=None, **kwargs)¶
尝试制作 tensordict 的密集堆栈,并在需要时回退到惰性堆栈。
有关详细信息,请参见
maybe_dense_stack()
。
- mean(dim: Union[int, Tuple[int], Literal['feature']] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, dtype: Optional[dtype] = None, reduce: Optional[bool] = None) tensordict.base.TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有元素的平均值。
- 参数:
dim (int, int 元组, str, 可选) – 如果为
None
,则返回包含所有叶子节点平均值的无维度 tensordict(如果可以计算)。如果为整数或整数元组,则仅当此维度与 tensordict 形状兼容时,才对指定的维度调用 mean。目前只允许使用 “feature” 字符串。使用 dim=”feature” 将实现对所有特征维度的缩减。如果 reduce=True,则返回一个形状与 TensorDict 的 batch-size 相同的张量。否则,将返回一个新的 tensordict,其结构与self
相同,但特征维度已缩减。keepdim (bool) – 输出张量是否保留 dim。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回张量的所需数据类型。如果指定,输入张量在执行操作之前会被强制转换为 dtype。这对于防止数据类型溢出非常有用。默认值:
None
。reduce (bool, 可选) – 如果为
True
,则将在所有 TensorDict 值上进行规约,并返回单个规约后的 tensor。默认为False
。
示例
>>> from tensordict import TensorDict >>> import torch >>> td = TensorDict( ... a=torch.randn(3, 4, 5), ... b=TensorDict( ... c=torch.randn(3, 4, 5, 6), ... d=torch.randn(3, 4, 5), ... batch_size=(3, 4, 5), ... ), ... batch_size=(3, 4) ... ) >>> td.mean(dim=0) TensorDict( fields={ a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([4]), device=None, is_shared=False) >>> td.mean() TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> td.mean(reduce=True) tensor(-0.0547) >>> td.mean(dim="feature") TensorDict( fields={ a: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3, 4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([3, 4]), device=None, is_shared=False) >>> td = TensorDict( ... a=torch.ones(3, 4, 5), ... b=TensorDict( ... c=torch.ones(3, 4, 5), ... d=torch.ones(3, 4, 5), ... batch_size=(3, 4, 5), ... ), ... batch_size=(3, 4) ... ) >>> td.mean(reduce=True, dim="feature") tensor([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]) >>> td.mean(reduce=True, dim=0) tensor([[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]])
- memmap(prefix: Optional[str] = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False, existsok: bool = True) T ¶
将所有张量写入新 tensordict 中对应的内存映射张量。
- 参数:
prefix (str) – 内存映射张量将存储的目录前缀。目录树结构将模仿 tensordict 的结构。
copy_existing (bool) – 如果为 False(默认值),如果 tensordict 中的条目已经是存储在磁盘上的张量,并且有相关联的文件,但没有根据前缀保存在正确的位置,则会引发异常。如果为
True
,任何现有张量都将被复制到新位置。
- 关键字参数:
num_threads (int, 可选) – 用于写入 memmap 张量的线程数。默认为 0。
return_early (bool, 可选) – 如果
True
且num_threads>0
,该方法将返回 tensordict 的 future。share_non_tensor (bool, 可选) – 如果为
True
,非张量数据将在进程之间共享,并且在单个节点内的任何 worker 上执行的写入操作(例如,就地更新或设置)将更新所有其他 worker 上的值。 如果非张量叶子的数量很高(例如,共享大量的非张量数据堆栈),这可能会导致 OOM 或类似的错误。默认为False
。existsok (bool, 可选) – 如果为
False
,如果张量已存在于同一路径中,则会引发异常。默认为True
。
然后,TensorDict 被锁定,这意味着任何非就地写入操作都会引发异常(例如,重命名、设置或删除条目)。一旦 tensordict 被解锁,memory-mapped 属性将变为
False
,因为无法再保证跨进程标识。- 返回值:
如果
return_early=False
,则返回一个新的 tensordict,其中张量存储在磁盘上,否则返回一个TensorDictFuture
实例。
注意
以这种方式序列化对于深度嵌套的 tensordict 可能会很慢,因此不建议在训练循环中调用此方法。
- memmap_(prefix: Optional[str] = None, copy_existing: bool = False, num_threads: int = 0) TensorDictBase ¶
将所有张量就地写入对应的内存映射张量。
- 参数:
prefix (str) – 内存映射张量将存储的目录前缀。目录树结构将模仿 tensordict 的结构。
copy_existing (bool) – 如果为 False(默认值),如果 tensordict 中的条目已经是存储在磁盘上的张量,并且有相关联的文件,但没有根据前缀保存在正确的位置,则会引发异常。如果为
True
,任何现有张量都将被复制到新位置。
- 关键字参数:
num_threads (int, 可选) – 用于写入 memmap 张量的线程数。默认为 0。
return_early (bool, 可选) – 如果为
True
且num_threads>0
,则该方法将返回 tensordict 的 future 对象。 可以使用 future.result() 查询生成的 tensordict。share_non_tensor (bool, 可选) – 如果为
True
,非张量数据将在进程之间共享,并且在单个节点内的任何 worker 上执行的写入操作(例如,就地更新或设置)将更新所有其他 worker 上的值。 如果非张量叶子的数量很高(例如,共享大量的非张量数据堆栈),这可能会导致 OOM 或类似的错误。默认为False
。existsok (bool, 可选) – 如果为
False
,如果张量已存在于同一路径中,则会引发异常。默认为True
。
然后,TensorDict 被锁定,这意味着任何非就地写入操作都会引发异常(例如,重命名、设置或删除条目)。一旦 tensordict 被解锁,memory-mapped 属性将变为
False
,因为无法再保证跨进程标识。- 返回值:
如果
return_early=False
,则返回 self,否则返回一个TensorDictFuture
实例。
注意
以这种方式序列化对于深度嵌套的 tensordict 可能会很慢,因此不建议在训练循环中调用此方法。
- memmap_like(prefix: str | None = None, copy_existing: bool = False, num_threads: int = 0) T ¶
创建一个与原始 tensordict 具有相同形状的无内容内存映射 tensordict。
- 参数:
prefix (str) – 内存映射张量将存储的目录前缀。目录树结构将模仿 tensordict 的结构。
copy_existing (bool) – 如果为 False(默认值),如果 tensordict 中的条目已经是存储在磁盘上的张量,并且有相关联的文件,但没有根据前缀保存在正确的位置,则会引发异常。如果为
True
,任何现有张量都将被复制到新位置。
- 关键字参数:
num_threads (int, 可选) – 用于写入 memmap 张量的线程数。默认为 0。
return_early (bool, 可选) – 如果
True
且num_threads>0
,该方法将返回 tensordict 的 future。share_non_tensor (bool, 可选) – 如果为
True
,非张量数据将在进程之间共享,并且在单个节点内的任何 worker 上执行的写入操作(例如,就地更新或设置)将更新所有其他 worker 上的值。 如果非张量叶子的数量很高(例如,共享大量的非张量数据堆栈),这可能会导致 OOM 或类似的错误。默认为False
。existsok (bool, 可选) – 如果为
False
,如果张量已存在于同一路径中,则会引发异常。默认为True
。
然后,TensorDict 被锁定,这意味着任何非就地写入操作都会引发异常(例如,重命名、设置或删除条目)。一旦 tensordict 被解锁,memory-mapped 属性将变为
False
,因为无法再保证跨进程标识。- 返回值:
如果
return_early=False
,则返回一个新的TensorDict
实例,其中数据存储为内存映射张量,否则返回一个TensorDictFuture
实例。
注意
这是在磁盘上写入一组大型缓冲区的推荐方法,因为
memmap_()
将复制信息,对于大型内容来说,这可能会很慢。示例
>>> td = TensorDict({ ... "a": torch.zeros((3, 64, 64), dtype=torch.uint8), ... "b": torch.zeros(1, dtype=torch.int64), ... }, batch_size=[]).expand(1_000_000) # expand does not allocate new memory >>> buffer = td.memmap_like("/path/to/dataset")
- memmap_refresh_()¶
如果内存映射 tensordict 具有
saved_path
,则刷新其内容。如果没有与它关联的路径,此方法将引发异常。
- min(dim: int | NO_DEFAULT = _NoDefault.ZERO, keepdim: bool = False, *, reduce: bool | None = None, return_indices: bool = True) TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有元素的最小值。
- 参数:
- 关键字参数:
示例
>>> 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 ¶
计算
self
和other
的逐元素最小值。- 参数:
other (TensorDict or Tensor) – 另一个输入 tensordict 或 tensor。
- 关键字参数:
default (torch.Tensor 或 str, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递
default="intersection"
,则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default
将用于操作两侧所有缺失的条目。
- minimum_(other: tensordict.base.TensorDictBase | torch.Tensor) T ¶
minimum()
的原地版本。注意
原地
minimum
不支持default
关键字参数。
- modules() Iterator[Module] ¶
返回网络中所有模块的迭代器。
- Yields:
Module – 网络中的一个模块
注意
重复的模块只返回一次。在下面的例子中,
l
只会被返回一次。示例
>>> l = nn.Linear(2, 2) >>> net = nn.Sequential(l, l) >>> for idx, m in enumerate(net.modules()): ... print(idx, '->', m) 0 -> Sequential( (0): Linear(in_features=2, out_features=2, bias=True) (1): Linear(in_features=2, out_features=2, bias=True) ) 1 -> Linear(in_features=2, out_features=2, bias=True)
- mtia(device: Optional[Union[int, device]] = None) T ¶
将所有模型参数和缓冲区移动到 MTIA。
这也使得相关的参数和缓冲区成为不同的对象。因此,如果模块在优化时将驻留在 MTIA 上,则应在构建优化器之前调用此方法。
注意
此方法会就地修改模块。
- 参数:
device (int, optional) – 如果指定,所有参数都将复制到该设备
- 返回值:
self
- 返回类型:
模块
- mul(other: tensordict.base.TensorDictBase | torch.Tensor, *, default: str | torch.Tensor | None = None) T ¶
将
other
乘以self
。\[\text{{out}}_i = \text{{input}}_i \times \text{{other}}_i\]支持广播、类型提升以及整数、浮点数和复数输入。
- 参数:
other (TensorDict, Tensor 或 Number) – 要从
self
中减去的 tensor 或数字。- 关键字参数:
default (torch.Tensor 或 str, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递
default="intersection"
,则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default
将用于操作两侧所有缺失的条目。
- mul_(other: tensordict.base.TensorDictBase | torch.Tensor) T ¶
mul()
的原地版本。注意
原地
mul
不支持default
关键字参数。
- named_apply(fn: Callable, *others: TensorDictBase, batch_size: Optional[Sequence[int]] = None, device: torch.device | None = _NoDefault.ZERO, names: Optional[Sequence[str]] = _NoDefault.ZERO, inplace: bool = False, default: Any = _NoDefault.ZERO, filter_empty: bool | None = None, call_on_nested: bool = False, **constructor_kwargs) tensordict.base.TensorDictBase | None ¶
将一个键条件可调用对象应用于 tensordict 中存储的所有值,并将它们设置在一个新的 tensordict 中。
可调用对象的签名必须是
Callable[Tuple[str, Tensor, ...], Optional[Union[Tensor, TensorDictBase]]]
。- 参数:
fn (Callable) – 要应用于 tensordict 中的 (name, tensor) 对的函数。对于每个叶子节点,仅使用其叶子名称(而不是完整的 NestedKey)。
*others (TensorDictBase 实例, optional) – 如果提供,这些 tensordict 实例应具有与 self 匹配的结构。
fn
参数应接收与 tensordict 数量一样多的未命名输入,包括 self。 如果其他 tensordict 缺少条目,则可以通过default
关键字参数传递默认值。nested_keys (bool, 可选) – 如果
True
,将使用到叶子节点的完整路径。默认为False
,即仅将最后一个字符串传递给函数。batch_size (int 序列, 可选) – 如果提供,生成的 TensorDict 将具有所需的 batch_size。
batch_size
参数应与转换后的 batch_size 匹配。 这是一个仅关键字参数。device (torch.device, 可选) – 生成的设备(如果有)。
names (str 列表, 可选) – 新的维度名称,以防修改了 batch_size。
inplace (bool, 可选) – 如果为 True,则进行原地修改。默认为 False。这是一个仅关键字参数。
default (Any, 可选) – 其他 tensordict 中缺失条目的默认值。 如果未提供,缺失的条目将引发 KeyError。
filter_empty (bool, 可选) – 如果
True
,将过滤掉空的 tensordict。这也可以降低计算成本,因为不会创建和销毁空的数据结构。为了向后兼容,默认为False
。propagate_lock (bool, 可选) – 如果
True
,锁定的 tensordict 将生成另一个锁定的 tensordict。默认为False
。call_on_nested (bool, 可选) –
如果
True
,则将在第一级张量和容器(TensorDict 或 tensorclass)上调用该函数。 在这种情况下,func
负责将其调用传播到嵌套级别。 这允许在将调用传播到嵌套 tensordict 时进行细粒度控制。 如果False
,则仅在叶子上调用该函数,并且apply
将负责将该函数分派到所有叶子上。>>> td = TensorDict({"a": {"b": [0.0, 1.0]}, "c": [1.0, 2.0]}) >>> def mean_tensor_only(val): ... if is_tensor_collection(val): ... raise RuntimeError("Unexpected!") ... return val.mean() >>> td_mean = td.apply(mean_tensor_only) >>> def mean_any(val): ... if is_tensor_collection(val): ... # Recurse ... return val.apply(mean_any, call_on_nested=True) ... return val.mean() >>> td_mean = td.apply(mean_any, call_on_nested=True)
out (TensorDictBase, 可选) –
一个用于写入结果的 tensordict。 这可以用于避免创建新的 tensordict
>>> td = TensorDict({"a": 0}) >>> td.apply(lambda x: x+1, out=td) >>> assert (td==1).all()
警告
如果在 tensordict 上执行的操作需要访问多个键才能进行单个计算,则提供等于
self
的out
参数可能会导致操作静默地提供错误的结果。 例如>>> td = TensorDict({"a": 1, "b": 1}) >>> td.apply(lambda x: x+td["a"])["b"] # Right! tensor(2) >>> td.apply(lambda x: x+td["a"], out=td)["b"] # Wrong! tensor(3)
**constructor_kwargs – 要传递给 TensorDict 构造函数的其他关键字参数。
- 返回值:
一个具有 transformed_in 张量的新 tensordict。
示例
>>> td = TensorDict({ ... "a": -torch.ones(3), ... "nested": {"a": torch.ones(3), "b": torch.zeros(3)}}, ... batch_size=[3]) >>> def name_filter(name, tensor): ... if name == "a": ... return tensor >>> td.named_apply(name_filter) TensorDict( fields={ a: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False), nested: TensorDict( fields={ a: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3]), device=None, is_shared=False)}, batch_size=torch.Size([3]), device=None, is_shared=False) >>> def name_filter(name, *tensors): ... if name == "a": ... r = 0 ... for tensor in tensors: ... r = r + tensor ... return tensor >>> out = td.named_apply(name_filter, td) >>> print(out) TensorDict( fields={ a: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False), nested: TensorDict( fields={ a: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3]), device=None, is_shared=False)}, batch_size=torch.Size([3]), device=None, is_shared=False) >>> print(out["a"]) tensor([-1., -1., -1.])
注意
如果该函数返回
None
,则忽略该条目。 这可用于过滤 tensordict 中的数据>>> td = TensorDict({"1": 1, "2": 2, "b": {"2": 2, "1": 1}}, []) >>> def name_filter(name, tensor): ... if name == "1": ... return tensor >>> td.named_apply(name_filter) TensorDict( fields={ 1: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), b: TensorDict( fields={ 1: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
- named_buffers(prefix: str = '', recurse: bool = True, remove_duplicate: bool = True) Iterator[tuple[str, torch.Tensor]] ¶
返回一个模块缓冲区上的迭代器,产生缓冲区的名称和缓冲区本身。
- 参数:
- Yields:
(str, torch.Tensor) – 包含名称和缓冲区的元组
示例
>>> # xdoctest: +SKIP("undefined vars") >>> for name, buf in self.named_buffers(): >>> if name in ['running_var']: >>> print(buf.size())
- named_children() Iterator[tuple[str, 'Module']] ¶
返回一个直接子模块上的迭代器,产生模块的名称和模块本身。
- Yields:
(str, Module) – 包含名称和子模块的元组
示例
>>> # xdoctest: +SKIP("undefined vars") >>> for name, module in model.named_children(): >>> if name in ['conv4', 'conv5']: >>> print(module)
- named_modules(memo: Optional[set['Module']] = None, prefix: str = '', remove_duplicate: bool = True)¶
返回网络中所有模块上的迭代器,产生模块的名称以及模块本身。
- 参数:
memo – 一个备忘录,用于存储已添加到结果中的模块集
prefix – 将被添加到模块名称的前缀
remove_duplicate – 是否移除结果中重复的模块实例
- Yields:
(str, Module) – 名称和模块的元组
注意
重复的模块只返回一次。在下面的例子中,
l
只会被返回一次。示例
>>> l = nn.Linear(2, 2) >>> net = nn.Sequential(l, l) >>> for idx, m in enumerate(net.named_modules()): ... print(idx, '->', m) 0 -> ('', Sequential( (0): Linear(in_features=2, out_features=2, bias=True) (1): Linear(in_features=2, out_features=2, bias=True) )) 1 -> ('0', Linear(in_features=2, out_features=2, bias=True))
- named_parameters(prefix: str = '', recurse: bool = True, remove_duplicate: bool = True) Iterator[tuple[str, torch.nn.parameter.Parameter]] ¶
返回一个模块参数的迭代器,产生参数的名称和参数本身。
- 参数:
- Yields:
(str, Parameter) – 包含名称和参数的元组
示例
>>> # xdoctest: +SKIP("undefined vars") >>> for name, param in self.named_parameters(): >>> if name in ['bias']: >>> print(param.size())
- property names¶
tensordict的维度名称。
可以使用
names
参数在构造时设置名称。另请参阅
refine_names()
,了解有关如何在构造后设置名称的详细信息。
- nanmean(dim: Union[int, Tuple[int], Literal['feature']] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, dtype: Optional[dtype] = None, reduce: Optional[bool] = None) tensordict.base.TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有非 NaN 元素的平均值。
- 参数:
dim (int, tuple of int, optional) – 如果
None
,则返回一个包含所有叶子的平均值的无维度 tensordict(如果可以计算)。 如果是整数或整数元组,则仅当此维度与 tensordict 形状兼容时,才对指定维度调用 mean。 目前只允许使用 “feature” 字符串。 使用 dim=”feature” 将实现对所有特征维度的缩减。 如果 reduce=True,将返回一个与 TensorDict 的批大小形状相同的张量。 否则,将返回一个与self
具有相同结构,但特征维度缩减的 tensordict。keepdim (bool) – 输出张量是否保留 dim。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回张量的所需数据类型。如果指定,输入张量在执行操作之前会被强制转换为 dtype。这对于防止数据类型溢出非常有用。默认值:
None
。reduce (bool, 可选) – 如果为
True
,则将在所有 TensorDict 值上进行规约,并返回单个规约后的 tensor。默认为False
。
示例
>>> from tensordict import TensorDict >>> import torch >>> td = TensorDict( ... a=torch.randn(3, 4, 5), ... b=TensorDict( ... c=torch.randn(3, 4, 5, 6), ... d=torch.randn(3, 4, 5), ... batch_size=(3, 4, 5), ... ), ... batch_size=(3, 4) ... ) >>> td.nanmean(dim=0) TensorDict( fields={ a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([4]), device=None, is_shared=False) >>> td.nanmean() TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> td.nanmean(reduce=True) tensor(-0.0547) >>> td.nanmean(dim="feature") TensorDict( fields={ a: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3, 4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([3, 4]), device=None, is_shared=False) >>> td = TensorDict( ... a=torch.ones(3, 4, 5), ... b=TensorDict( ... c=torch.ones(3, 4, 5), ... d=torch.ones(3, 4, 5), ... batch_size=(3, 4, 5), ... ), ... batch_size=(3, 4) ... ) >>> td.nanmean(reduce=True, dim="feature") tensor([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]) >>> td.nanmean(reduce=True, dim=0) tensor([[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]])
- nansum(dim: Union[int, Tuple[int], Literal['feature']] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, dtype: Optional[dtype] = None, reduce: Optional[bool] = None) tensordict.base.TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有非 NaN 元素的总和。
- 参数:
dim (int, tuple of int, optional) – 如果
None
,则返回一个包含所有叶子的总和值的无维度 tensordict(如果可以计算)。 如果是整数或整数元组,则仅当此维度与 tensordict 形状兼容时,才对指定维度调用 sum。 目前只允许使用 “feature” 字符串。 使用 dim=”feature” 将实现对所有特征维度的缩减。 如果 reduce=True,将返回一个与 TensorDict 的批大小形状相同的张量。 否则,将返回一个与self
具有相同结构,但特征维度缩减的 tensordict。keepdim (bool) – 输出张量是否保留 dim。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回张量的所需数据类型。如果指定,输入张量在执行操作之前会被强制转换为 dtype。这对于防止数据类型溢出非常有用。默认值:
None
。reduce (bool, 可选) – 如果为
True
,则将在所有 TensorDict 值上进行规约,并返回单个规约后的 tensor。默认为False
。
示例
>>> from tensordict import TensorDict >>> import torch >>> td = TensorDict( ... a=torch.randn(3, 4, 5), ... b=TensorDict( ... c=torch.randn(3, 4, 5, 6), ... d=torch.randn(3, 4, 5), ... batch_size=(3, 4, 5), ... ), ... batch_size=(3, 4) ... ) >>> td.nansum(dim=0) TensorDict( fields={ a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([4]), device=None, is_shared=False) >>> td.nansum() TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> td.nansum(reduce=True) tensor(-0.) >>> td.nansum(dim="feature") TensorDict( fields={ a: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3, 4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([3, 4]), device=None, is_shared=False) >>> td = TensorDict( ... a=torch.ones(3, 4, 5), ... b=TensorDict( ... c=torch.ones(3, 4, 5), ... d=torch.ones(3, 4, 5), ... batch_size=(3, 4, 5), ... ), ... batch_size=(3, 4) ... ) >>> td.nansum(reduce=True, dim="feature") tensor([[15., 15., 15., 15.], [15., 15., 15., 15.], [15., 15., 15., 15.]]) >>> td.nansum(reduce=True, dim=0) tensor([[9., 9., 9., 9., 9.], [9., 9., 9., 9., 9.], [9., 9., 9., 9., 9.], [9., 9., 9., 9., 9.]])
- property ndim: int¶
参见
batch_dims()
。
- ndimension() int ¶
参见
batch_dims()
。
- neg() T ¶
计算 TensorDict 中每个元素的
neg()
值。
- neg_() T ¶
就地计算 TensorDict 中每个元素的
neg()
值。
- new_empty(*size: Size, dtype: Optional[dtype] = None, device: Union[device, str, int] = _NoDefault.ZERO, requires_grad: bool = False, layout: layout = torch.strided, pin_memory: Optional[bool] = None)¶
返回一个大小为
size
且包含空 tensors 的 TensorDict。默认情况下,返回的 TensorDict 具有与此 tensordict 相同的
torch.dtype
和torch.device
。- 参数:
size (int...) – 定义输出 tensor 形状的整数列表、元组或 torch.Size。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回的 tensordict 的期望类型。默认值:如果
None
,则 torch.dtype 将保持不变。device (torch.device, 可选) – 返回的 tensordict 的期望设备。默认值:如果
None
,则torch.device
将保持不变。requires_grad (bool, 可选) – 如果 autograd 应该记录返回 tensors 的操作。默认值:
False
。layout (torch.layout, 可选) – 返回的 TensorDict 值的期望布局。默认值:
torch.strided
。pin_memory (bool, 可选) – 如果设置,返回的 tensor 将分配在锁页内存中。仅适用于 CPU tensors。默认值:
False
。
- new_full(size: Size, fill_value, *, dtype: Optional[dtype] = None, device: Union[device, str, int] = _NoDefault.ZERO, requires_grad: bool = False, layout: layout = torch.strided, pin_memory: Optional[bool] = None)¶
返回一个大小为
size
并填充了 1 的 TensorDict。默认情况下,返回的 TensorDict 具有与此 tensordict 相同的
torch.dtype
和torch.device
。- 参数:
size (整数序列) – 定义输出 tensor 形状的整数列表、元组或 torch.Size。
fill_value (标量) – 用于填充输出 tensor 的数字。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回的 tensordict 的期望类型。默认值:如果
None
,则 torch.dtype 将保持不变。device (torch.device, 可选) – 返回的 tensordict 的期望设备。默认值:如果
None
,则torch.device
将保持不变。requires_grad (bool, 可选) – 如果 autograd 应该记录返回 tensors 的操作。默认值:
False
。layout (torch.layout, 可选) – 返回的 TensorDict 值的期望布局。默认值:
torch.strided
。pin_memory (bool, 可选) – 如果设置,返回的 tensor 将分配在锁页内存中。仅适用于 CPU tensors。默认值:
False
。
- new_ones(*size: Size, dtype: Optional[dtype] = None, device: Union[device, str, int] = _NoDefault.ZERO, requires_grad: bool = False, layout: layout = torch.strided, pin_memory: Optional[bool] = None)¶
返回一个大小为
size
并填充了 1 的 TensorDict。默认情况下,返回的 TensorDict 具有与此 tensordict 相同的
torch.dtype
和torch.device
。- 参数:
size (int...) – 定义输出 tensor 形状的整数列表、元组或 torch.Size。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回的 tensordict 的期望类型。默认值:如果
None
,则 torch.dtype 将保持不变。device (torch.device, 可选) – 返回的 tensordict 的期望设备。默认值:如果
None
,则torch.device
将保持不变。requires_grad (bool, 可选) – 如果 autograd 应该记录返回 tensors 的操作。默认值:
False
。layout (torch.layout, 可选) – 返回的 TensorDict 值的期望布局。默认值:
torch.strided
。pin_memory (bool, 可选) – 如果设置,返回的 tensor 将分配在锁页内存中。仅适用于 CPU tensors。默认值:
False
。
- new_tensor(data: torch.Tensor | tensordict.base.TensorDictBase, *, dtype: Optional[dtype] = None, device: Union[device, str, int] = _NoDefault.ZERO, requires_grad: bool = False, pin_memory: Optional[bool] = None)¶
返回一个以
data
张量为数据的新 TensorDict。默认情况下,返回的 TensorDict 值与此张量具有相同的
torch.dtype
和torch.device
。data
也可以是一个张量集合(TensorDict
或tensorclass
),在这种情况下,new_tensor
方法会迭代self
和data
的张量对。- 参数:
data (torch.Tensor 或 TensorDictBase) – 要复制的数据。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回的 tensordict 的期望类型。默认值:如果
None
,则 torch.dtype 将保持不变。device (torch.device, 可选) – 返回的 tensordict 的期望设备。默认值:如果
None
,则torch.device
将保持不变。requires_grad (bool, 可选) – 如果 autograd 应该记录返回 tensors 的操作。默认值:
False
。pin_memory (bool, 可选) – 如果设置,返回的 tensor 将分配在锁页内存中。仅适用于 CPU tensors。默认值:
False
。
- new_zeros(*size: Size, dtype: Optional[dtype] = None, device: Union[device, str, int] = _NoDefault.ZERO, requires_grad: bool = False, layout: layout = torch.strided, pin_memory: Optional[bool] = None)¶
返回一个大小为
size
且填充 0 的 TensorDict。默认情况下,返回的 TensorDict 具有与此 tensordict 相同的
torch.dtype
和torch.device
。- 参数:
size (int...) – 定义输出 tensor 形状的整数列表、元组或 torch.Size。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回的 tensordict 的期望类型。默认值:如果
None
,则 torch.dtype 将保持不变。device (torch.device, 可选) – 返回的 tensordict 的期望设备。默认值:如果
None
,则torch.device
将保持不变。requires_grad (bool, 可选) – 如果 autograd 应该记录返回 tensors 的操作。默认值:
False
。layout (torch.layout, 可选) – 返回的 TensorDict 值的期望布局。默认值:
torch.strided
。pin_memory (bool, 可选) – 如果设置,返回的 tensor 将分配在锁页内存中。仅适用于 CPU tensors。默认值:
False
。
- norm(*, out=None, dtype: torch.dtype | None = None)¶
计算 tensordict 中每个张量的范数。
- 关键字参数:
out (TensorDict, 可选) – 输出的 tensordict。
dtype (torch.dtype, 可选) – 输出的数据类型 (torch>=2.4)。
- numpy()¶
将 tensordict 转换为 (可能是嵌套的) numpy 数组字典。
非张量数据按原样公开。
示例
>>> from tensordict import TensorDict >>> import torch >>> data = TensorDict({"a": {"b": torch.zeros(()), "c": "a string!"}}) >>> print(data) TensorDict( fields={ a: TensorDict( fields={ b: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), c: NonTensorData(data=a string!, batch_size=torch.Size([]), device=None)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> print(data.numpy()) {'a': {'b': array(0., dtype=float32), 'c': 'a string!'}}
- param_count(*, count_duplicates: bool = True) int ¶
计算参数的数量 (可索引项目的总数),仅考虑张量。
- 关键字参数:
count_duplicates (bool) – 是否将重复的张量视为独立的。 如果为
False
,则只会丢弃完全相同的张量(来自公共基础张量的相同视图但不同的 ID 将被计算两次)。 默认为 True(假设每个张量都是单个副本)。
- parameters(recurse: bool = True) Iterator[Parameter] ¶
返回模块参数的迭代器。
这通常传递给优化器。
- 参数:
recurse (bool) – 如果为 True,则产生此模块和所有子模块的参数。 否则,仅产生作为此模块直接成员的参数。
- Yields:
Parameter – 模块参数
示例
>>> # xdoctest: +SKIP("undefined vars") >>> for param in model.parameters(): >>> print(type(param), param.size()) <class 'torch.Tensor'> (20L,) <class 'torch.Tensor'> (20L, 1L, 5L, 5L)
- permute(*args, **kwargs)¶
返回一个 tensordict 的视图,其中批次维度根据 dims 排列。
- 参数:
*dims_list (int) – tensordict 批次维度的新顺序。 或者,可以提供一个整数的可迭代对象。
dims (int 列表) – 调用 permute(…) 的另一种方式。
- 返回值:
一个新的 tensordict,其批次维度按照所需的顺序排列。
示例
>>> tensordict = TensorDict({"a": torch.randn(3, 4, 5)}, [3, 4]) >>> print(tensordict.permute([1, 0])) PermutedTensorDict( source=TensorDict( fields={ a: Tensor(torch.Size([3, 4, 5]), dtype=torch.float32)}, batch_size=torch.Size([3, 4]), device=cpu, is_shared=False), op=permute(dims=[1, 0])) >>> print(tensordict.permute(1, 0)) PermutedTensorDict( source=TensorDict( fields={ a: Tensor(torch.Size([3, 4, 5]), dtype=torch.float32)}, batch_size=torch.Size([3, 4]), device=cpu, is_shared=False), op=permute(dims=[1, 0])) >>> print(tensordict.permute(dims=[1, 0])) PermutedTensorDict( source=TensorDict( fields={ a: Tensor(torch.Size([3, 4, 5]), dtype=torch.float32)}, batch_size=torch.Size([3, 4]), device=cpu, is_shared=False), op=permute(dims=[1, 0]))
- pin_memory(*args, **kwargs)¶
在存储的张量上调用
pin_memory()
。- 参数:
num_threads (int 或 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。
- pop(key: NestedKey, default: Any = _NoDefault.ZERO) Tensor ¶
从 tensordict 中移除并返回一个值。
如果该值不存在且未提供默认值,则会抛出 KeyError。
- 参数:
key (str 或 嵌套键) – 要查找的条目。
default (Any, 可选) – 如果找不到键,则返回的值。
示例
>>> td = TensorDict({"1": 1}, []) >>> one = td.pop("1") >>> assert one == 1 >>> none = td.pop("1", default=None) >>> assert none is None
- popitem()¶
移除最后插入 TensorDict 的项。
popitem
将仅返回非嵌套值。
- pow(other: tensordict.base.TensorDictBase | torch.Tensor, *, default: str | torch.Tensor | None = None) T ¶
计算
self
中每个元素的other
次幂,并返回一个包含结果的张量。other
可以是单个float
数字,Tensor 或TensorDict
。当
other
是一个张量时,input
和other
的形状必须是可广播的。- 参数:
other (float, tensor 或 tensordict) – 指数值
- 关键字参数:
default (torch.Tensor 或 str, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递
default="intersection"
,则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default
将用于操作两侧所有缺失的条目。
- pow_(other: tensordict.base.TensorDictBase | torch.Tensor) T ¶
是
pow()
的原地 (in-place) 版本。注意
原地 (Inplace)
pow
不支持default
关键字参数。
- prod(dim: Union[int, Tuple[int], Literal['feature']] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, dtype: Optional[dtype] = None, reduce: Optional[bool] = None) tensordict.base.TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有元素的乘积。
- 参数:
- 关键字参数:
dtype (torch.dtype, 可选) – 返回张量的所需数据类型。如果指定,输入张量在执行操作之前会被强制转换为 dtype。这对于防止数据类型溢出非常有用。默认值:
None
。reduce (bool, 可选) – 如果为
True
,则将在所有 TensorDict 值上进行规约,并返回单个规约后的 tensor。默认为False
。
示例
>>> from tensordict import TensorDict >>> import torch >>> td = TensorDict( ... a=torch.randn(3, 4, 5), ... b=TensorDict( ... c=torch.randn(3, 4, 5, 6), ... d=torch.randn(3, 4, 5), ... batch_size=(3, 4, 5), ... ), ... batch_size=(3, 4) ... ) >>> td.prod(dim=0) TensorDict( fields={ a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([4]), device=None, is_shared=False) >>> td.prod() TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> td.prod(reduce=True) tensor(-0.) >>> td.prod(dim="feature") TensorDict( fields={ a: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3, 4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([3, 4]), device=None, is_shared=False) >>> td = TensorDict( ... a=torch.ones(3, 4, 5), ... b=TensorDict( ... c=torch.ones(3, 4, 5), ... d=torch.ones(3, 4, 5), ... batch_size=(3, 4, 5), ... ), ... batch_size=(3, 4) ... ) >>> td.prod(reduce=True, dim="feature") tensor([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]) >>> td.prod(reduce=True, dim=0) tensor([[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]])
- qint32()¶
将所有张量转换为
torch.qint32
。
- qint8()¶
将所有张量转换为
torch.qint8
。
- quint4x2()¶
将所有张量转换为
torch.quint4x2
。
- quint8()¶
将所有张量转换为
torch.quint8
。
- reciprocal() T ¶
计算 TensorDict 中每个元素的
reciprocal()
值。
- reciprocal_() T ¶
原地 (in-place) 计算 TensorDict 中每个元素的
reciprocal()
值。
- record_stream(stream: Stream) T ¶
将 tensordict 标记为已被该流使用。
当 tensordict 被释放时,确保张量内存不会被其他张量重用,直到在释放时流上排队的所有工作完成为止。
有关更多信息,请参见
record_stream()
。
- recv(src: int, *, group: 'torch.distributed.ProcessGroup' | None = None, init_tag: int = 0, pseudo_rand: bool = False) int ¶
接收 tensordict 的内容并使用它更新内容。
请查看 send 方法中的示例以了解上下文。
- 参数:
src (int) – 源 worker 的排名。
- 关键字参数:
- reduce(dst, op=None, async_op=False, return_premature=False, group=None) None ¶
在所有机器上缩减 tensordict。
只有具有
rank
dst 的进程才会收到最终结果。
- refine_names(*names) T ¶
根据名称细化 self 的维度名称。
细化是重命名的一种特殊情况,它“提升”了未命名的维度。 可以将 None 维度细化为具有任何名称; 命名的维度只能细化为具有相同的名称。
由于命名张量可以与未命名张量共存,因此细化名称提供了一种编写命名张量感知代码的好方法,该代码可以与命名张量和未命名张量一起使用。
名称最多可以包含一个省略号 (…)。 省略号被贪婪地扩展; 它被就地扩展以使用 self.names 中相应索引的名称,将名称填充到与 self.dim() 相同的长度。
返回:与输入相同,但维度根据输入命名的 tensordict。
示例
>>> td = TensorDict({}, batch_size=[3, 4, 5, 6]) >>> tdr = td.refine_names(None, None, None, "d") >>> assert tdr.names == [None, None, None, "d"] >>> tdr = td.refine_names("a", None, None, "d") >>> assert tdr.names == ["a", None, None, "d"]
- register_backward_hook(hook: Callable[[Module, Union[tuple[torch.Tensor, ...], Tensor], Union[tuple[torch.Tensor, ...], Tensor]], Union[None, tuple[torch.Tensor, ...], Tensor]]) RemovableHandle ¶
在模块上注册一个反向钩子。
此函数已被弃用,推荐使用
register_full_backward_hook()
,并且此函数的行为将在未来版本中更改。- 返回值:
一个句柄,可用于通过调用
handle.remove()
来删除添加的钩子。- 返回类型:
torch.utils.hooks.RemovableHandle
- register_buffer(name: str, tensor: Optional[Tensor], persistent: bool = True) None ¶
向模块添加一个缓冲区。
这通常用于注册一个不应被视为模型参数的缓冲区。 例如,BatchNorm 的
running_mean
不是一个参数,但它是模块状态的一部分。 默认情况下,缓冲区是持久的,并将与参数一起保存。 可以通过将persistent
设置为False
来更改此行为。 持久缓冲区和非持久缓冲区之间的唯一区别是后者不会是此模块的state_dict
的一部分。可以使用给定的名称作为属性访问缓冲区。
- 参数:
name (str) – 缓冲区的名称。 可以使用给定的名称从此模块访问缓冲区
tensor (Tensor 或 None) – 要注册的缓冲区。 如果
None
,则忽略在缓冲区上运行的操作,例如cuda
。 如果None
,则缓冲区不包含在模块的state_dict
中。persistent (bool) – 缓冲区是否是此模块的
state_dict
的一部分。
示例
>>> # xdoctest: +SKIP("undefined vars") >>> self.register_buffer('running_mean', torch.zeros(num_features))
- register_forward_hook(hook: Union[Callable[[T, tuple[Any, ...], Any], Optional[Any]], Callable[[T, tuple[Any, ...], dict[str, Any], Any], Optional[Any]]], *, prepend: bool = False, with_kwargs: bool = False, always_call: bool = False) RemovableHandle ¶
在模块上注册一个前向钩子。
每次
forward()
计算出一个输出后,都会调用该钩子。如果
with_kwargs
为False
或未指定,则输入仅包含传递给模块的位置参数。 关键字参数不会传递给钩子,仅传递给forward
。 钩子可以修改输出。 它可以就地修改输入,但由于在调用forward()
之后调用它,因此它不会对前向产生影响。 钩子应具有以下签名hook(module, args, output) -> None or modified output
如果
with_kwargs
为True
,则前向 hook 将会接收传递给前向函数的kwargs
,并应返回可能被修改的输出。该 hook 应具有以下签名:hook(module, args, kwargs, output) -> None or modified output
- 参数:
hook (Callable) – 要注册的用户定义的 hook。
prepend (bool) – 如果
True
,则提供的hook
将在此torch.nn.modules.Module
上所有现有forward
hook 之前触发。否则,提供的hook
将在此torch.nn.modules.Module
上所有现有forward
hook 之后触发。请注意,使用register_module_forward_hook()
注册的全局forward
hook 将在通过此方法注册的所有 hook 之前触发。 默认值:False
with_kwargs (bool) – 如果
True
,则hook
将接收传递给前向函数的 kwargs。 默认值:False
always_call (bool) – 如果
True
,则无论在调用 Module 时是否引发异常,都会运行hook
。 默认值:False
- 返回值:
一个句柄,可用于通过调用
handle.remove()
来删除添加的钩子。- 返回类型:
torch.utils.hooks.RemovableHandle
- register_forward_pre_hook(hook: Union[Callable[[T, tuple[Any, ...]], Optional[Any]], Callable[[T, tuple[Any, ...], dict[str, Any]], Optional[tuple[Any, dict[str, Any]]]]], *, prepend: bool = False, with_kwargs: bool = False) RemovableHandle ¶
在模块上注册一个前向预处理 hook。
每次调用
forward()
之前,都会调用该 hook。如果
with_kwargs
为 false 或未指定,则输入仅包含传递给模块的位置参数。关键字参数不会传递给 hook,而只会传递给forward
。该 hook 可以修改输入。用户可以在 hook 中返回一个元组或一个单独的修改值。如果返回单个值(除非该值已经是元组),我们将把该值包装到一个元组中。该 hook 应具有以下签名:hook(module, args) -> None or modified input
如果
with_kwargs
为 true,则前向预处理 hook 将会接收传递给前向函数的 kwargs。如果 hook 修改了输入,则应同时返回 args 和 kwargs。该 hook 应具有以下签名:hook(module, args, kwargs) -> None or a tuple of modified input and kwargs
- 参数:
hook (Callable) – 要注册的用户定义的 hook。
prepend (bool) – 如果为 true,则提供的
hook
将在此torch.nn.modules.Module
上所有现有forward_pre
hook 之前触发。 否则,提供的hook
将在此torch.nn.modules.Module
上所有现有forward_pre
hook 之后触发。 请注意,使用register_module_forward_pre_hook()
注册的全局forward_pre
hook 将在通过此方法注册的所有 hook 之前触发。 默认值:False
with_kwargs (bool) – 如果为 true,则
hook
将接收传递给前向函数的 kwargs。 默认值:False
- 返回值:
一个句柄,可用于通过调用
handle.remove()
来删除添加的钩子。- 返回类型:
torch.utils.hooks.RemovableHandle
- register_full_backward_hook(hook: Callable[[Module, Union[tuple[torch.Tensor, ...], Tensor], Union[tuple[torch.Tensor, ...], Tensor]], Union[None, tuple[torch.Tensor, ...], Tensor]], prepend: bool = False) RemovableHandle ¶
在模块上注册一个反向钩子。
每次计算模块的梯度时,都会调用该 hook,即,当且仅当计算模块输出的梯度时,才会执行该 hook。该 hook 应具有以下签名:
hook(module, grad_input, grad_output) -> tuple(Tensor) or None
grad_input
和grad_output
是元组,分别包含相对于输入和输出的梯度。Hook 不应该修改其参数,但可以选择性地返回相对于输入的新梯度,该梯度将代替grad_input
用于后续计算。grad_input
只对应于作为位置参数给出的输入,所有 kwarg 参数都会被忽略。对于所有非 Tensor 参数,grad_input
和grad_output
中的条目都将为None
。由于技术原因,当此 hook 应用于 Module 时,其 forward 函数将接收传递给 Module 的每个 Tensor 的视图。同样,调用者将接收由 Module 的 forward 函数返回的每个 Tensor 的视图。
警告
在使用 backward hooks 时,不允许就地修改输入或输出,否则会引发错误。
- 参数:
hook (Callable) – 要注册的,用户定义的 hook。
prepend (bool) – 如果为 true,则提供的
hook
将在该torch.nn.modules.Module
上的所有现有backward
hooks 之前触发。否则,提供的hook
将在该torch.nn.modules.Module
上的所有现有backward
hooks 之后触发。请注意,使用register_module_full_backward_hook()
注册的全局backward
hooks 将在通过此方法注册的所有 hooks 之前触发。
- 返回值:
一个句柄,可用于通过调用
handle.remove()
来删除添加的钩子。- 返回类型:
torch.utils.hooks.RemovableHandle
- register_full_backward_pre_hook(hook: Callable[[Module, Union[tuple[torch.Tensor, ...], Tensor]], Union[None, tuple[torch.Tensor, ...], Tensor]], prepend: bool = False) RemovableHandle ¶
在模块上注册一个 backward pre-hook。
每次计算模块的梯度时,都会调用该 hook。该 hook 应具有以下签名
hook(module, grad_output) -> tuple[Tensor] or None
grad_output
是一个元组。 Hook 不应该修改其参数,但可以选择性地返回相对于输出的新梯度,该梯度将代替grad_output
用于后续计算。对于所有非 Tensor 参数,grad_output
中的条目都将为None
。由于技术原因,当此 hook 应用于 Module 时,其 forward 函数将接收传递给 Module 的每个 Tensor 的视图。同样,调用者将接收由 Module 的 forward 函数返回的每个 Tensor 的视图。
警告
在使用 backward hooks 时,不允许就地修改输入,否则会引发错误。
- 参数:
hook (Callable) – 要注册的,用户定义的 hook。
prepend (bool) – 如果为 true,则提供的
hook
将在该torch.nn.modules.Module
上的所有现有backward_pre
hooks 之前触发。否则,提供的hook
将在该torch.nn.modules.Module
上的所有现有backward_pre
hooks 之后触发。请注意,使用register_module_full_backward_pre_hook()
注册的全局backward_pre
hooks 将在通过此方法注册的所有 hooks 之前触发。
- 返回值:
一个句柄,可用于通过调用
handle.remove()
来删除添加的钩子。- 返回类型:
torch.utils.hooks.RemovableHandle
- register_get_post_hook(hook)¶
注册一个 hook,以便在对叶张量执行任何 get 操作后调用它。
- register_load_state_dict_post_hook(hook)¶
注册一个 post-hook,以便在调用模块的
load_state_dict()
后运行。- 它应该具有以下签名:
hook(module, incompatible_keys) -> None
module
参数是注册此 hook 的当前模块,incompatible_keys
参数是一个NamedTuple
,由属性missing_keys
和unexpected_keys
组成。missing_keys
是一个list
的str
,包含缺失的键,而unexpected_keys
是一个list
的str
,包含意外的键。如果需要,可以就地修改给定的 incompatible_keys。
请注意,当使用
strict=True
调用load_state_dict()
时执行的检查会受到 hook 对missing_keys
或unexpected_keys
所做修改的影响,正如预期的那样。 向任一键集添加内容将导致在strict=True
时抛出错误,而清除缺失和意外的键将避免错误。- 返回值:
一个句柄,可用于通过调用
handle.remove()
来删除添加的钩子。- 返回类型:
torch.utils.hooks.RemovableHandle
- register_load_state_dict_pre_hook(hook)¶
注册一个 pre-hook,以便在调用模块的
load_state_dict()
之前运行。- 它应该具有以下签名:
hook(module, state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs) -> None # noqa: B950
- 参数:
hook (Callable) – 将在加载 state dict 之前调用的可调用 hook。
- register_parameter(name: str, param: Optional[Parameter]) None ¶
向模块添加参数。
可以使用给定的名称作为属性访问该参数。
- 参数:
name (str) – 参数的名称。可以使用给定的名称从该模块访问该参数
param (Parameter 或 None) – 要添加到模块的参数。如果
None
,则忽略在参数上运行的操作,例如cuda
。如果None
,则该参数不包含在模块的state_dict
中。
- register_state_dict_post_hook(hook)¶
为
state_dict()
方法注册一个后置钩子 (post-hook)。- 它应该具有以下签名:
hook(module, state_dict, prefix, local_metadata) -> None
注册的钩子可以就地修改
state_dict
。
- register_state_dict_pre_hook(hook)¶
为
state_dict()
方法注册一个前置钩子 (pre-hook)。- 它应该具有以下签名:
hook(module, prefix, keep_vars) -> None
注册的钩子可用于在进行
state_dict
调用之前执行预处理。
- rename(*names, **rename_map)¶
返回一个张量字典的克隆,其中维度已重命名。
示例
>>> td = TensorDict({}, batch_size=[1, 2, 3 ,4]) >>> td.names = list("abcd") >>> td_rename = td.rename(c="g") >>> assert td_rename.names == list("abgd")
- rename_(*names, **rename_map)¶
与
rename()
相同,但执行就地重命名。示例
>>> td = TensorDict({}, batch_size=[1, 2, 3 ,4]) >>> td.names = list("abcd") >>> assert td.rename_(c="g") >>> assert td.names == list("abgd")
- rename_key_(old_key: NestedKey, new_key: NestedKey, safe: bool = False) TensorDictBase ¶
使用新的字符串重命名键,并返回具有更新后的键名的相同张量字典。
- repeat(*repeats: int) TensorDictBase ¶
沿指定维度重复此张量。
与
expand()
不同,此函数会复制张量的数据。警告
repeat()
的行为与repeat()
不同,但更类似于numpy.tile()
。对于类似于numpy.repeat()
的运算符,请参阅repeat_interleave()
。- 参数:
repeat (torch.Size, int..., int 的元组 或 int 的列表) – 沿每个维度重复此张量的次数。
示例
>>> import torch >>> >>> from tensordict import TensorDict >>> >>> td = TensorDict( ... { ... "a": torch.randn(3, 4, 5), ... "b": TensorDict({ ... "c": torch.randn(3, 4, 10, 1), ... "a string": "a string!", ... }, batch_size=[3, 4, 10]) ... }, batch_size=[3, 4], ... ) >>> print(td.repeat(1, 2)) TensorDict( fields={ a: Tensor(shape=torch.Size([3, 8, 5]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ a string: NonTensorData(data=a string!, batch_size=torch.Size([3, 8, 10]), device=None), c: Tensor(shape=torch.Size([3, 8, 10, 1]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3, 8, 10]), device=None, is_shared=False)}, batch_size=torch.Size([3, 8]), device=None, is_shared=False)
- repeat_interleave(*shape: int)¶
重复 TensorDict 的元素。
警告
这与
repeat()
不同,但类似于numpy.repeat()
。- 参数:
repeats (torch.Tensor 或 int) – 每个元素的重复次数。repeats 被广播以适合给定轴的形状。
dim (int, 可选) – 沿其重复值的维度。默认情况下,使用展平的输入数组,并返回一个扁平的输出数组。
- 关键字参数:
output_size (int, 可选) – 给定轴的总输出大小(例如,重复的总和)。如果给定,它将避免计算张量字典的输出形状所需的流同步。
- 返回值:
重复的 TensorDict,其形状与输入相同,但沿给定轴除外。
示例
>>> import torch >>> >>> from tensordict import TensorDict >>> >>> td = TensorDict( ... { ... "a": torch.randn(3, 4, 5), ... "b": TensorDict({ ... "c": torch.randn(3, 4, 10, 1), ... "a string": "a string!", ... }, batch_size=[3, 4, 10]) ... }, batch_size=[3, 4], ... ) >>> print(td.repeat_interleave(2, dim=0)) TensorDict( fields={ a: Tensor(shape=torch.Size([6, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ a string: NonTensorData(data=a string!, batch_size=torch.Size([6, 4, 10]), device=None), c: Tensor(shape=torch.Size([6, 4, 10, 1]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([6, 4, 10]), device=None, is_shared=False)}, batch_size=torch.Size([6, 4]), device=None, is_shared=False)
- replace(*args, **kwargs)¶
创建一个 tensordict 的浅拷贝,其中的条目已被替换。
接受一个未命名的参数,该参数必须是
TensorDictBase
子类的字典。 此外,可以使用命名的关键字参数更新第一级条目。- 返回值:
如果输入不为空,则返回
self
的副本,其中的条目已更新。如果提供的是空字典或未提供字典,且 kwargs 为空,则返回self
。
- requires_grad_(requires_grad=True) T ¶
更改是否应记录此张量的自动求导操作:就地设置此张量的 requires_grad 属性。
返回此 tensordict。
- 参数:
requires_grad (bool, optional) – 是否应记录此 tensordict 的自动求导操作。 默认为
True
。
- reshape(*shape: int)¶
返回具有所需形状的连续的、重塑的张量。
- 参数:
*shape (int) – 生成的 tensordict 的新形状。
- 返回值:
一个带有重塑键的 TensorDict
示例
>>> td = TensorDict({ ... 'x': torch.arange(12).reshape(3, 4), ... }, batch_size=[3, 4]) >>> td = td.reshape(12) >>> print(td['x']) torch.Tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
- round() T ¶
计算 TensorDict 中每个元素的
round()
值。
- round_() T ¶
就地计算 TensorDict 中每个元素的
round()
值。
- save(prefix: Optional[str] = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False) T ¶
将 tensordict 保存到磁盘。
此函数是
memmap()
的代理。
- property saved_path¶
返回存储 memmap 保存的 TensorDict 的路径。
只要 is_memmap() 返回
False
(例如,当 tensordict 被解锁时),此参数就会消失。
- select(*keys: NestedKey, inplace: bool = False, strict: bool = True) T ¶
选择 tensordict 的键,并返回一个新的仅包含所选键的 tensordict。
这些值不会被复制:就地修改原始或新 tensordict 的张量会导致两个 tensordict 都发生更改。
- 参数:
- 返回值:
一个新的 tensordict(如果
inplace=True
则为同一个),仅包含所选键。
注意
要在 tensordict 中选择键并返回一个删除了这些键的 tensordict 版本,请参阅
split_keys()
方法。示例
>>> from tensordict import TensorDict >>> td = TensorDict({"a": 0, "b": {"c": 1, "d": 2}}, []) >>> td.select("a", ("b", "c")) TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> td.select("a", "b") TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> td.select("this key does not exist", strict=False) TensorDict( fields={ }, batch_size=torch.Size([]), device=None, is_shared=False)
- send(dst: int, *, group: 'torch.distributed.ProcessGroup' | None = None, init_tag: int = 0, pseudo_rand: bool = False) None ¶
将 tensordict 的内容发送给远程工作进程。
- 参数:
dst (int) – 目标 worker 的 rank,内容应发送到该 worker。
- 关键字参数:
示例
>>> 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()
,不同之处在于它返回数据的另一个拆分。- 参数:
- 返回值:
分离的 tensordict。
- 返回类型:
T
示例
>>> td = TensorDict( ... a=0, ... b=0, ... c=0, ... d=0, ... ) >>> td_a_c = td.separates("a", "c") >>> print(td_a_c) TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> print(td) TensorDict( fields={ b: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
- set(key: NestedKey, item: Tensor, inplace: bool = False, **kwargs: Any) TensorDictBase ¶
设置一个新的键值对。
- 参数:
key (str, tuple of str) – 要设置的键的名称。
item (torch.Tensor or equivalent, TensorDictBase instance) – 要存储在 tensordict 中的值。
inplace (bool, optional) – 如果
True
且某个键与 tensordict 中的现有键匹配,则将对该键值对进行就地更新。 如果 inplace 为True
且找不到条目,则会添加该条目。 对于更严格的就地操作,请改用set_()
。 默认为False
。
- 关键字参数:
non_blocking (bool, optional) – 如果
True
并且此复制发生在不同设备之间,则复制可能相对于主机异步发生。- 返回值:
self
示例
>>> td = TensorDict({}, batch_size[3, 4]) >>> td.set("x", torch.randn(3, 4)) >>> y = torch.randn(3, 4, 5) >>> td.set("y", y, inplace=True) # works, even if 'y' is not present yet >>> td.set("y", torch.zeros_like(y), inplace=True) >>> assert (y==0).all() # y values are overwritten >>> td.set("y", torch.ones(5), inplace=True) # raises an exception as shapes mismatch
- set_(key: NestedKey, item: Tensor) T ¶
设置现有键的值,同时保留原始存储。
- 参数:
key (str) – 值的名称
item (torch.Tensor or compatible type, TensorDictBase) – 要存储在 tensordict 中的值
- 关键字参数:
non_blocking (bool, optional) – 如果
True
并且此复制发生在不同设备之间,则复制可能相对于主机异步发生。- 返回值:
self
示例
>>> td = TensorDict({}, batch_size[3, 4]) >>> x = torch.randn(3, 4) >>> td.set("x", x) >>> td.set_("x", torch.zeros_like(x)) >>> assert (x == 0).all()
- set_at_(key: NestedKey, value: Tensor, index: Union[None, int, slice, str, Tensor, List[Any], Tuple[Any, ...]]) T ¶
在
index
指示的索引处就地设置值。- 参数:
key (str, tuple of str) – 要修改的键。
value (torch.Tensor) – 要在索引 index 处设置的值
- 关键字参数:
non_blocking (bool, optional) – 如果
True
并且此复制发生在不同设备之间,则复制可能相对于主机异步发生。- 返回值:
self
示例
>>> td = TensorDict({}, batch_size[3, 4]) >>> x = torch.randn(3, 4) >>> td.set("x", x) >>> td.set_at_("x", value=torch.ones(1, 4), index=slice(1)) >>> assert (x[0] == 1).all()
- set_extra_state(state: Any) None ¶
设置加载的 state_dict 中包含的额外状态。
从
load_state_dict()
调用此函数,以处理 state_dict 中找到的任何额外状态。如果需要在模块的 state_dict 中存储额外状态,请为你的模块实现此函数以及相应的get_extra_state()
。- 参数:
state (dict) – 来自 state_dict 的额外状态
- set_non_tensor(key: NestedKey, value: Any)¶
使用
tensordict.tensorclass.NonTensorData
在 tensordict 中注册一个非张量值。可以使用
TensorDictBase.get_non_tensor()
或直接使用 get 检索该值,这将返回tensordict.tensorclass.NonTensorData
对象。return: self
示例
>>> data = TensorDict({}, batch_size=[]) >>> data.set_non_tensor(("nested", "the string"), "a string!") >>> assert data.get_non_tensor(("nested", "the string")) == "a string!" >>> # regular `get` works but returns a NonTensorData object >>> data.get(("nested", "the string")) NonTensorData( data='a string!', batch_size=torch.Size([]), device=None, is_shared=False)
- set_submodule(target: str, module: Module, strict: bool = False) None ¶
设置由
target
指定的子模块,如果该子模块存在;否则,抛出错误。注意
如果
strict
设置为False
(默认值),该方法将替换现有的子模块,或者如果父模块存在,则创建一个新的子模块。 如果strict
设置为True
,该方法将仅尝试替换现有的子模块,如果该子模块不存在,则抛出错误。例如,假设你有一个
nn.Module
A
,其结构如下:A( (net_b): Module( (net_c): Module( (conv): Conv2d(3, 3, 3) ) (linear): Linear(3, 3) ) )
(该图展示了一个
nn.Module
A
。A
具有一个嵌套的子模块net_b
,它本身有两个子模块net_c
和linear
。然后,net_c
具有一个子模块conv
。)要使用新的子模块
Linear
覆盖Conv2d
,您可以调用set_submodule("net_b.net_c.conv", nn.Linear(1, 1))
,其中strict
可以是True
或False
。要将新的子模块
Conv2d
添加到现有的net_b
模块,您可以调用set_submodule("net_b.conv", nn.Conv2d(1, 1, 1))
。在以上示例中,如果您设置
strict=True
并调用set_submodule("net_b.conv", nn.Conv2d(1, 1, 1), strict=True)
,则会引发 AttributeError,因为net_b
没有名为conv
的子模块。- 参数:
target – 要查找的 submodule 的完整字符串名称。(有关如何指定完整字符串,请参阅上面的示例。)
module – 要将子模块设置到的模块。
strict – 如果
False
,该方法将替换现有的子模块,或者如果父模块存在,则创建一个新的子模块。 如果True
,该方法将仅尝试替换现有的子模块,如果该子模块不存在,则抛出错误。
- 引发:
ValueError – 如果
target
字符串为空,或者如果module
不是nn.Module
的实例。AttributeError – 如果沿着
target
字符串产生的路径上的任何点,(子)路径解析为不存在的属性名称或不是nn.Module
实例的对象。
- setdefault(key: NestedKey, default: Tensor, inplace: bool = False) Tensor ¶
如果 tensordict 中不存在
key
,则插入key
条目,其值为default
。如果 tensordict 中存在
key
,则返回key
的值;否则返回default
。- 参数:
key (str 或 nested key) – 值的名称。
default (torch.Tensor 或 compatible type, TensorDictBase) – 如果 tensordict 中尚不存在该键,则将该值存储在 tensordict 中。
- 返回值:
tensordict 中键的值。如果先前未设置该键,则将为 default。
示例
>>> td = TensorDict({}, batch_size=[3, 4]) >>> val = td.setdefault("a", torch.zeros(3, 4)) >>> assert (val == 0).all() >>> val = td.setdefault("a", torch.ones(3, 4)) >>> assert (val == 0).all() # output is still 0
- property shape: Size¶
请参阅
batch_size
。
将所有张量放置在共享内存中。
然后锁定 TensorDict,这意味着任何非就地写入操作都将引发异常(例如,重命名、设置或删除条目)。 相反,一旦 tensordict 被解锁,share_memory 属性将变为
False
,因为不再保证跨进程标识。- 返回值:
self
- sigmoid() T ¶
计算 TensorDict 中每个元素的
sigmoid()
值。
- sigmoid_() T ¶
就地计算 TensorDict 中每个元素的
sigmoid()
值。
- sign() T ¶
计算 TensorDict 中每个元素的
sign()
值。
- sign_() T ¶
就地计算 TensorDict 中每个元素的
sign()
值。
- sin() T ¶
计算 TensorDict 中每个元素的
sin()
值。
- sin_() T ¶
就地计算 TensorDict 中每个元素的
sin()
值。
- sinh() T ¶
计算 TensorDict 中每个元素的
sinh()
值。
- sinh_() T ¶
对 TensorDict 的每个元素执行原位
sinh()
值计算。
- size(dim: Optional[int] = None) torch.Size | int ¶
返回由
dim
指示的维度的大小。如果未指定
dim
,则返回 TensorDict 的batch_size
属性。
- softmax(dim: int, dtype: Optional[dtype] = None)¶
将 softmax 函数应用于 tensordict 元素。
- 参数:
dim (int 或 ints 元组) – 将计算 softmax 的 tensordict 维度。
dtype (torch.dtype, 可选) – 返回张量的期望数据类型。 如果指定,则在执行操作之前将输入张量转换为 dtype。 这对于防止数据类型溢出很有用。
- property sorted_keys: list[tensordict._nestedkey.NestedKey]¶
返回按字母顺序排序的键。
不支持额外的参数。
如果 TensorDict 被锁定,则键将被缓存,直到 tensordict 被解锁以加快执行速度。
- split(split_size: int | list[int], dim: int = 0) list[tensordict.base.TensorDictBase] ¶
使用给定维度中的指定大小分割 TensorDict 中的每个张量,如 torch.split。
返回一个
TensorDict
实例列表,其中包含分割块的视图。- 参数:
split_size (int 或 List(int)) – 单个块的大小或每个块的大小列表。
dim (int) – 用于分割张量的维度。
- 返回值:
具有给定维度中指定大小的 TensorDict 列表。
示例
>>> td = TensorDict({ ... 'x': torch.arange(12).reshape(3, 4), ... }, batch_size=[3, 4]) >>> td0, td1 = td.split([1, 2], dim=0) >>> print(td0['x']) torch.Tensor([[0, 1, 2, 3]])
- split_keys(*key_sets, inplace=False, default: Any = _NoDefault.ZERO, strict: bool = True, reproduce_struct: bool = False) Tuple[T, ...] ¶
将 tensordict 分割为给定一个或多个键集的子集。
该方法将返回
N+1
个 tensordict,其中N
是提供的参数数量。- 参数:
key_sets (Dict[in_key, out_key] 序列或 键列表) – 各种拆分。
inplace (bool, 可选) – 如果为
True
,则键将从self
中原位删除。 默认为False
。default (Any, 可选) – 缺少键时要返回的值。 如果未指定且
strict=True
,则会引发异常。strict (bool, optional) – 如果
True
,则在键缺失时会引发异常。默认为True
。reproduce_struct (bool, 可选) – 如果为
True
,则所有返回的 tensordict 都具有与self
相同的树结构,即使某些子 tensordict 不包含任何叶子。
注意
None
非张量值将被忽略且不会返回。注意
该方法不检查提供的列表中是否存在重复项。
示例
>>> td = TensorDict( ... a=0, ... b=0, ... c=0, ... d=0, ... ) >>> td_a, td_bc, td_d = td.split_keys(["a"], ["b", "c"]) >>> print(td_bc)
- sqrt()¶
计算
self
的逐元素平方根。
- squeeze(*args, **kwargs)¶
压缩 -self.batch_dims+1 和 self.batch_dims-1 之间的维度的所有张量,并在新的 tensordict 中返回它们。
- 参数:
dim (Optional[int]) – 要沿其压缩的维度。 如果 dim 是
None
,则将压缩所有单例维度。 默认为None
。
示例
>>> td = TensorDict({ ... 'x': torch.arange(24).reshape(3, 1, 4, 2), ... }, batch_size=[3, 1, 4]) >>> td = td.squeeze() >>> td.shape torch.Size([3, 4]) >>> td.get("x").shape torch.Size([3, 4, 2])
此操作也可以用作上下文管理器。 对原始 tensordict 的更改将发生在外部,即不会更改原始张量的内容。 这也假设 tensordict 未被锁定(否则,需要解锁 tensordict)。 此功能与隐式压缩不兼容。
>>> td = TensorDict({ ... 'x': torch.arange(24).reshape(3, 1, 4, 2), ... }, batch_size=[3, 1, 4]) >>> with td.squeeze(1) as tds: ... tds.set("y", torch.zeros(3, 4)) >>> assert td.get("y").shape == [3, 1, 4]
- classmethod stack(input, dim=0, *, out=None)¶
将 tensordict 沿给定维度堆叠到单个 tensordict 中。
此调用等效于调用
torch.stack()
但与 torch.compile 兼容。
- stack_from_tensordict(dim: int = 0, *, sorted: Optional[Union[bool, List[NestedKey]]] = None, out: Optional[Tensor] = None) Tensor ¶
将tensordict中的所有条目堆叠成单个张量。
- 参数:
dim (int, 可选) – 条目应沿其堆叠的维度。
- 关键字参数:
sorted (bool 或 NestedKey 的列表) – 如果
True
,条目将按字母顺序堆叠。 如果False
(默认),将使用字典顺序。 或者,可以提供键名称的列表,并且张量将相应地堆叠。 这会产生一些开销,因为将根据 tensordict 中的叶名称列表检查键列表。out (torch.Tensor, 可选) – 用于堆叠操作的可选目标张量。
- stack_tensors(*keys: NestedKey, out_key: NestedKey, dim: int = 0, keep_entries: bool = False) T ¶
将条目堆叠到新条目中,并可能删除原始值。
- 参数:
keys (NestedKey 的序列) – 要堆叠的条目。
- 关键字参数
out_key (NestedKey): 堆叠输入的新键名。 keep_entries (bool, optional): 如果
False
,keys
中的条目将被删除。默认为
False
。- dim (int, optional): 堆叠必须发生的维度。
默认为
0
。
返回: self
示例
>>> td = TensorDict(a=torch.zeros(()), b=torch.ones(())) >>> td.stack_tensors("a", "b", out_key="c") >>> assert "a" not in td >>> assert (td["c"] == torch.tensor([0, 1])).all()
- state_dict(*args, destination=None, prefix='', keep_vars=False, flatten=True)¶
从 tensordict 生成 state_dict。
state-dict 的结构仍然是嵌套的,除非
flatten
设置为True
。tensordict state-dict 包含重建 tensordict 所需的所有张量和元数据(当前不支持名称)。
- 参数:
destination (dict, 可选) – 如果提供,tensordict 的状态将更新到 dict 中,并返回相同的对象。 否则,将创建并返回一个
OrderedDict
。 默认值:None
。prefix (str, 可选) – 添加到张量名称的前缀,用于组成 state_dict 中的键。 默认值:
''
。keep_vars (bool, 可选) – 默认情况下,在状态字典中返回的
torch.Tensor
项与 autograd 分离。 如果设置为True
,则不会执行分离。 默认值:False
。flatten (bool, 可选) – 是否应使用
"."
字符来展平结构。 默认为False
。
示例
>>> data = TensorDict({"1": 1, "2": 2, "3": {"3": 3}}, []) >>> sd = data.state_dict() >>> print(sd) OrderedDict([('1', tensor(1)), ('2', tensor(2)), ('3', OrderedDict([('3', tensor(3)), ('__batch_size', torch.Size([])), ('__device', None)])), ('__batch_size', torch.Size([])), ('__device', None)]) >>> sd = data.state_dict(flatten=True) OrderedDict([('1', tensor(1)), ('2', tensor(2)), ('3.3', tensor(3)), ('__batch_size', torch.Size([])), ('__device', None)])
- std(dim: Union[int, Tuple[int], Literal['feature']] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, correction: int = 1, reduce: Optional[bool] = None) tensordict.base.TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有元素的标准偏差值。
- 参数:
dim (int, int 元组, 可选) – 如果为
None
,则返回一个无维度 tensordict,其中包含所有叶子的总和值(如果可以计算)。 如果是整数或整数元组,则仅当此维度与 tensordict 形状兼容时,才会在指定的维度上调用 std。 目前仅允许使用 “feature” 字符串。 使用 dim=”feature” 将实现对所有特征维度的缩减。 如果 reduce=True,则将返回一个形状为 TensorDict 批大小的张量。 否则,将返回一个与self
具有相同结构但缩减了特征维度的新 tensordict。keepdim (bool) – 输出张量是否保留 dim。
- 关键字参数:
示例
>>> 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, Tensor 或 Number) – 要从
self
中减去的 tensor 或数字。- 关键字参数:
alpha (数字) –
other
的乘数。default (torch.Tensor 或 str, 可选) – 用于互斥条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递
default="intersection"
,则只会考虑相交的键集合,其他键将被忽略。在所有其他情况下,default
将用于操作两侧所有缺失的条目。
- sub_(other: tensordict.base.TensorDictBase | torch.Tensor | float, alpha: Optional[float] = None)¶
sub()
的原地版本。注意
原地
sub
不支持default
关键字参数。
- sum(dim: Union[int, Tuple[int], Literal['feature']] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, dtype: Optional[dtype] = None, reduce: Optional[bool] = None) tensordict.base.TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有元素的总和值。
- 参数:
dim (int, tuple of int, optional) – 如果
None
,则返回一个包含所有叶子的总和值的无维度 tensordict(如果可以计算)。 如果是整数或整数元组,则仅当此维度与 tensordict 形状兼容时,才对指定维度调用 sum。 目前只允许使用 “feature” 字符串。 使用 dim=”feature” 将实现对所有特征维度的缩减。 如果 reduce=True,将返回一个与 TensorDict 的批大小形状相同的张量。 否则,将返回一个与self
具有相同结构,但特征维度缩减的 tensordict。keepdim (bool) – 输出张量是否保留 dim。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回张量的所需数据类型。如果指定,输入张量在执行操作之前会被强制转换为 dtype。这对于防止数据类型溢出非常有用。默认值:
None
。reduce (bool, 可选) – 如果为
True
,则将在所有 TensorDict 值上进行规约,并返回单个规约后的 tensor。默认为False
。
示例
>>> from tensordict import TensorDict >>> import torch >>> td = TensorDict( ... a=torch.randn(3, 4, 5), ... b=TensorDict( ... c=torch.randn(3, 4, 5, 6), ... d=torch.randn(3, 4, 5), ... batch_size=(3, 4, 5), ... ), ... batch_size=(3, 4) ... ) >>> td.sum(dim=0) TensorDict( fields={ a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([4]), device=None, is_shared=False) >>> td.sum() TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> td.sum(reduce=True) tensor(-0.) >>> td.sum(dim="feature") TensorDict( fields={ a: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3, 4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([3, 4]), device=None, is_shared=False) >>> td = TensorDict( ... a=torch.ones(3, 4, 5), ... b=TensorDict( ... c=torch.ones(3, 4, 5), ... d=torch.ones(3, 4, 5), ... batch_size=(3, 4, 5), ... ), ... batch_size=(3, 4) ... ) >>> td.sum(reduce=True, dim="feature") tensor([[15., 15., 15., 15.], [15., 15., 15., 15.], [15., 15., 15., 15.]]) >>> td.sum(reduce=True, dim=0) tensor([[9., 9., 9., 9., 9.], [9., 9., 9., 9., 9.], [9., 9., 9., 9., 9.], [9., 9., 9., 9., 9.]])
- tan() T ¶
计算 TensorDict 中每个元素的
tan()
值。
- tan_() T ¶
原地计算 TensorDict 中每个元素的
tan()
值。
- tanh() T ¶
计算 TensorDict 中每个元素的
tanh()
值。
- tanh_() T ¶
原地计算 TensorDict 中每个元素的
tanh()
值。
- to(*args, **kwargs) TensorDictBase ¶
将 TensorDictBase 子类映射到另一个设备、dtype 或另一个 TensorDictBase 子类(如果允许)。
不允许将张量转换为新的 dtype,因为 tensordict 不一定包含单一的张量 dtype。
- 参数:
device (torch.device, 可选) – tensordict 的所需设备。
dtype (torch.dtype, 可选) – tensordict 的所需浮点或复数 dtype。
tensor (torch.Tensor, 可选) – 张量,其 dtype 和设备是此 TensorDict 中所有张量的所需 dtype 和设备。
- 关键字参数:
non_blocking (bool, 可选) – 操作是否应为阻塞。
memory_format (torch.memory_format, 可选) – 此 tensordict 中 4D 参数和缓冲区的所需内存格式。
batch_size (torch.Size, 可选) – 输出的 tensordict 的结果批大小。
other (TensorDictBase, 可选) –
TensorDict 实例,其 dtype 和 device 是此 TensorDict 中所有张量所需的 dtype 和 device。
注意
由于
TensorDictBase
实例没有 dtype,因此 dtype 从示例叶子节点收集。 如果有多个 dtype,则不进行 dtype 转换。non_blocking_pin (bool, 可选) –
如果
True
, 张量在发送到设备之前会被 pinned。 这将异步完成,但可以通过num_threads
参数来控制。注意
调用
tensordict.pin_memory().to("cuda")
通常比tensordict.to("cuda", non_blocking_pin=True)
慢得多,因为在第二种情况下 pin_memory 是异步调用的。 如果张量很大且数量众多,则多线程pin_memory
通常是有益的:当要发送的张量太少时,生成线程和收集数据的开销会超过多线程的优势;如果张量很小,则迭代长列表的开销也大得惊人。num_threads (int 或 None, 可选) – 如果
non_blocking_pin=True
, 用于pin_memory
的线程数。 默认情况下,将生成max(1, torch.get_num_threads())
个线程。num_threads=0
将取消 pin_memory() 调用的任何多线程处理。inplace (bool, 可选) – 如果
True
, 数据将被直接写入同一个 tensordict 中。当构建 tensordict 的 CPU 开销受到限制时,这可能会显着加快速度。 默认为False
。
- 返回值:
如果设备与 tensordict 设备不同和/或传递了 dtype,则返回一个新的 tensordict 实例。 否则,返回相同的 tensordict。 只有
batch_size
的修改才会就地进行。
注意
如果 TensorDict 已整合,则结果 TensorDict 也将整合。 每个新张量都将是投射到所需设备的整合存储上的一个视图。
示例
>>> data = TensorDict({"a": 1.0}, [], device=None) >>> data_cuda = data.to("cuda:0") # casts to cuda >>> data_int = data.to(torch.int) # casts to int >>> data_cuda_int = data.to("cuda:0", torch.int) # multiple casting >>> data_cuda = data.to(torch.randn(3, device="cuda:0")) # using an example tensor >>> data_cuda = data.to(other=TensorDict({}, [], device="cuda:0")) # using a tensordict example
- to_dict(*, retain_none: bool = True) dict[str, Any] ¶
返回一个字典,其中的键值对与 tensordict 的键值对匹配。
- 参数:
retain_none (bool) – 如果
True
,则 tensorclass 实例中的None
值将被写入字典中。 否则,它们将被丢弃。 默认值:True
。
- to_empty(*, device: Optional[Union[int, str, device]], recurse: bool = True) T ¶
将参数和缓冲区移动到指定的设备,而不复制存储。
- 参数:
device (
torch.device
) – 此模块中参数和所需的设备。recurse (bool) – 子模块的参数和缓冲区是否应递归移动到指定的设备。
- 返回值:
self
- 返回类型:
模块
- to_h5(filename, **kwargs)¶
将 tensordict 转换为具有 h5 后端的 PersistentTensorDict。
- 参数:
filename (str 或 path) – h5 文件的路径。
**kwargs – 要传递给
h5py.File.create_dataset()
的 kwargs。
- 返回值:
一个链接到新创建的文件的
PersitentTensorDict
实例。
示例
>>> import tempfile >>> import timeit >>> >>> from tensordict import TensorDict, MemoryMappedTensor >>> td = TensorDict({ ... "a": MemoryMappedTensor.from_tensor(torch.zeros(()).expand(1_000_000)), ... "b": {"c": MemoryMappedTensor.from_tensor(torch.zeros(()).expand(1_000_000, 3))}, ... }, [1_000_000]) >>> >>> file = tempfile.NamedTemporaryFile() >>> td_h5 = td.to_h5(file.name, compression="gzip", compression_opts=9) >>> print(td_h5) PersistentTensorDict( fields={ a: Tensor(shape=torch.Size([1000000]), device=cpu, dtype=torch.float32, is_shared=False), b: PersistentTensorDict( fields={ c: Tensor(shape=torch.Size([1000000, 3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([1000000]), device=None, is_shared=False)}, batch_size=torch.Size([1000000]), device=None, is_shared=False)
- to_module(module: Module, *, inplace: bool | None = None, return_swap: bool = True, swap_dest=None, use_state_dict: bool = False, non_blocking: bool = False, memo=None)¶
递归地将 TensorDictBase 实例的内容写入给定的 nn.Module 属性。
to_module
也可以用作上下文管理器,以临时使用一系列参数/缓冲区填充模块(请参见下面的示例)。- 参数:
module (nn.Module) – 一个要将参数写入的模块。
- 关键字参数:
inplace (bool, 可选) – 如果
True
,则模块中的参数或张量将就地更新。 默认为False
。return_swap (bool, 可选) – 如果
True
,则返回旧的参数配置。 默认为False
。swap_dest (TensorDictBase, 可选) – 如果
return_swap
为True
,则应写入交换的 tensordict。use_state_dict (bool, 可选) – 如果
True
,则将使用 state-dict API 加载参数(包括 state-dict 钩子)。 默认为False
。non_blocking (bool, optional) – 如果
True
并且此复制发生在不同设备之间,则复制可能相对于主机异步发生。
示例
>>> from torch import nn >>> module = nn.TransformerDecoder( ... decoder_layer=nn.TransformerDecoderLayer(nhead=4, d_model=4), ... num_layers=1) >>> params = TensorDict.from_module(module) >>> params.data.zero_() >>> params.to_module(module) >>> assert (module.layers[0].linear1.weight == 0).all()
将 tensordict 用作上下文管理器对于进行函数式调用很有用: .. rubric:: 示例
>>> from tensordict import from_module >>> module = nn.TransformerDecoder( ... decoder_layer=nn.TransformerDecoderLayer(nhead=4, d_model=4), ... num_layers=1) >>> params = TensorDict.from_module(module) >>> params = params.data * 0 # Use TensorDictParams to remake these tensors regular nn.Parameter instances >>> with params.to_module(module): ... # Call the module with zeroed params ... y = module(*inputs) >>> # The module is repopulated with its original params >>> assert (TensorDict.from_module(module) != 0).any()
- 返回值:
如果
return_swap
为True
,则包含模块中值的 tensordict;否则,为None
。
- to_namedtuple(dest_cls: Optional[type] = None)¶
将 tensordict 转换为 namedtuple。
- 参数:
dest_cls (Type, 可选) – 要使用的可选的 namedtuple 类。
示例
>>> from tensordict import TensorDict >>> import torch >>> data = TensorDict({ ... "a_tensor": torch.zeros((3)), ... "nested": {"a_tensor": torch.zeros((3)), "a_string": "zero!"}}, [3]) >>> data.to_namedtuple() GenericDict(a_tensor=tensor([0., 0., 0.]), nested=GenericDict(a_tensor=tensor([0., 0., 0.]), a_string='zero!'))
- to_padded_tensor(padding=0.0, mask_key: Optional[NestedKey] = None) T ¶
将所有嵌套张量转换为填充版本,并相应地调整批次大小。
- 参数:
padding (float) – tensordict 中张量的填充值。默认为
0.0
。mask_key (NestedKey, optional) – 如果提供,则写入有效值的掩码的键。如果异构维度不是 tensordict 批次大小的一部分,则会导致错误。默认为
None
- to_pytree()¶
将 tensordict 转换为 PyTree。
如果 tensordict 不是从 pytree 创建的,此方法仅返回
self
而不做修改。有关更多信息和示例,请参阅
from_pytree()
。
- to_struct_array()¶
将 tensordict 转换为 numpy 结构化数组。
在
from_struct_array()
-to_struct_array()
循环中,输入和输出数组的内容应匹配。但是,to_struct_array 不会保留原始数组的内存内容。另请参阅
有关更多信息,请参阅
from_struct_array()
。- 返回值:
输入 TensorDict 的 numpy 结构化数组表示。
示例
>>> import torch >>> from tensordict import TensorDict >>> td = TensorDict({'a': torch.tensor([1, 2, 3]), 'b': torch.tensor([4.0, 5.0, 6.0])}, batch_size=[3]) >>> arr = td.to_struct_array() >>> print(arr) [(1, 4.) (2, 5.) (3, 6.)]
- to_tensordict(*, retain_none: bool | None = None)¶
从 TensorDictBase 返回一个常规的 TensorDict 实例。
- 参数:
retain_none (bool) –
如果
True
,tensorclass 实例中的None
值将被写入 tensordict。否则,它们将被丢弃。默认值:True
。注意
从 v0.8 开始,默认值将切换为
False
。- 返回值:
包含相同值的新的 TensorDict 对象。
- train(mode: bool = True) T ¶
将模块设置为训练模式。
这仅对某些模块有效。有关训练/评估模式下特定模块的行为的详细信息,请参阅特定模块的文档,例如,它们是否受到影响,例如
Dropout
,BatchNorm
, 等等。- 参数:
mode (bool) – 是否设置训练模式 (
True
) 或评估模式 (False
)。默认值:True
。- 返回值:
self
- 返回类型:
模块
- transpose(dim0, dim1)¶
返回一个转置版本的输入 tensordict。给定的维度
dim0
和dim1
被交换。转置 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()
值。
- uint16()¶
将所有张量强制转换为
torch.uint16
。
- uint32()¶
将所有张量强制转换为
torch.uint32
。
- uint64()¶
将所有张量强制转换为
torch.uint64
。
- uint8()¶
将所有张量强制转换为
torch.uint8
。
- unbind(dim: int) tuple[T, ...] ¶
返回一个索引 tensordict 的元组,沿指示的维度解绑。
示例
>>> td = TensorDict({ ... 'x': torch.arange(12).reshape(3, 4), ... }, batch_size=[3, 4]) >>> td0, td1, td2 = td.unbind(0) >>> td0['x'] tensor([0, 1, 2, 3]) >>> td1['x'] tensor([4, 5, 6, 7])
- unflatten(dim, unflattened_size)¶
展开一个 tensordict 维度,将其扩展为所需的形状。
- 参数:
dim (int) – 指定要展开的输入张量的维度。
unflattened_size (shape) – 是 tensordict 的展开维度的新形状。
示例
>>> td = TensorDict({ ... "a": torch.arange(60).view(3, 4, 5), ... "b": torch.arange(12).view(3, 4)}, ... batch_size=[3, 4]) >>> td_flat = td.flatten(0, 1) >>> td_unflat = td_flat.unflatten(0, [3, 4]) >>> assert (td == td_unflat).all()
- unflatten_keys(separator: str = '.', inplace: bool = False) TensorDictBase ¶
递归地将扁平的 tensordict 转换为嵌套的 tensordict。
TensorDict 类型将丢失,结果将是一个简单的 TensorDict 实例。嵌套 tensordict 的元数据将从根推断:数据树中的所有实例将共享相同的批次大小、维度名称和设备。
- 参数:
示例
>>> data = TensorDict({"a": 1, "b - c": 2, "e - f - g": 3}, batch_size=[]) >>> data.unflatten_keys(separator=" - ") TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False), e: TensorDict( fields={ f: TensorDict( fields={ g: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
此方法和
unflatten_keys()
在处理 state-dicts 时特别有用,因为它们可以无缝地将扁平字典转换为模仿模型结构的数据结构。示例
>>> model = torch.nn.Sequential(torch.nn.Linear(3 ,4)) >>> ddp_model = torch.ao.quantization.QuantWrapper(model) >>> state_dict = TensorDict(ddp_model.state_dict(), batch_size=[]).unflatten_keys(".") >>> print(state_dict) TensorDict( fields={ module: TensorDict( fields={ 0: TensorDict( fields={ bias: Tensor(shape=torch.Size([4]), device=cpu, dtype=torch.float32, is_shared=False), weight: Tensor(shape=torch.Size([4, 3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> model_state_dict = state_dict.get("module") >>> print(model_state_dict) TensorDict( fields={ 0: TensorDict( fields={ bias: Tensor(shape=torch.Size([4]), device=cpu, dtype=torch.float32, is_shared=False), weight: Tensor(shape=torch.Size([4, 3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> model.load_state_dict(dict(model_state_dict.flatten_keys(".")))
- unsqueeze(*args, **kwargs)¶
对所有张量沿 -td.batch_dims 和 td.batch_dims 之间的维度进行 unsqueeze 操作,并将它们返回到新的 tensordict 中。
- 参数:
dim (int) – 进行 unsqueeze 操作的维度
示例
>>> td = TensorDict({ ... 'x': torch.arange(24).reshape(3, 4, 2), ... }, batch_size=[3, 4]) >>> td = td.unsqueeze(-2) >>> td.shape torch.Size([3, 1, 4]) >>> td.get("x").shape torch.Size([3, 1, 4, 2])
此操作也可以用作上下文管理器。对原始 tensordict 的更改将在外部进行,即原始张量的内容不会被改变。这还假设 tensordict 没有被锁定(否则,需要解锁 tensordict)。
>>> td = TensorDict({ ... 'x': torch.arange(24).reshape(3, 4, 2), ... }, batch_size=[3, 4]) >>> with td.unsqueeze(-2) as tds: ... tds.set("y", torch.zeros(3, 1, 4)) >>> assert td.get("y").shape == [3, 4]
- update(input_dict_or_td: dict[str, torch.Tensor] | tensordict.base.TensorDictBase, clone: bool = False, inplace: bool = False, *, non_blocking: bool = False, keys_to_update: Optional[Sequence[NestedKey]] = None, is_leaf: Optional[Callable[[Type], bool]] = None) TensorDictBase ¶
使用字典或另一个 TensorDict 中的值更新 TensorDict。
- 参数:
input_dict_or_td (TensorDictBase 或 dict) – 要写入 self 的输入数据。
clone (bool, optional) – 是否应在设置之前克隆输入(张量)字典中的张量。默认为
False
。inplace (bool, optional) – 如果为
True
并且键与 tensordict 中的现有键匹配,则该键值对的更新将就地进行。 如果找不到该条目,则会将其添加。默认为False
。
- 关键字参数:
- 返回值:
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 或 dict) – 要写入 self 的输入数据。
clone (bool, optional) – 是否应在设置之前克隆输入(张量)字典中的张量。默认为
False
。
- 关键字参数:
keys_to_update (NestedKeys 序列, 可选) – 如果提供,则仅更新
key_to_update
中的键列表。 旨在避免调用data_dest.update_(data_src.select(*keys_to_update))
。non_blocking (bool, optional) – 如果
True
并且此复制发生在不同设备之间,则复制可能相对于主机异步发生。
- 返回值:
self
示例
>>> a = torch.randn(3) >>> b = torch.randn(3, 4) >>> td = TensorDict({"a": a, "b": b}, batch_size=[3]) >>> other_td = TensorDict({"a": a*0, "b": b*0}, batch_size=[]) >>> td.update_(other_td) >>> assert td['a'] is not other_td['a'] >>> assert (td['a'] == other_td['a']).all() >>> assert (td['a'] == 0).all()
- update_at_(input_dict_or_td: Union[dict[str, torch.Tensor], T], idx: Union[None, int, slice, str, Tensor, List[Any], Tuple[Any, ...]], clone: bool = False, *, non_blocking: bool = False, keys_to_update: Optional[Sequence[NestedKey]] = None) T ¶
在指定的索引处,使用来自字典或另一个 TensorDict 的值,就地更新 TensorDict。
与 TensorDict.update 不同,如果 TensorDict 不知道该键,此函数将抛出错误。
- 参数:
input_dict_or_td (TensorDictBase 或 dict) – 要写入 self 的输入数据。
idx (int, torch.Tensor, iterable, slice) – 应该发生更新的 tensordict 的索引。
clone (bool, optional) – 是否应在设置之前克隆输入(tensor)字典中的张量。 默认为 False。
- 关键字参数:
keys_to_update (NestedKeys 的序列, optional) – 如果提供,则只会更新
key_to_update
中的键列表。non_blocking (bool, optional) – 如果
True
并且此复制发生在不同设备之间,则复制可能相对于主机异步发生。
- 返回值:
self
示例
>>> td = TensorDict({ ... 'a': torch.zeros(3, 4, 5), ... 'b': torch.zeros(3, 4, 10)}, batch_size=[3, 4]) >>> td.update_at_( ... TensorDict({ ... 'a': torch.ones(1, 4, 5), ... 'b': torch.ones(1, 4, 10)}, batch_size=[1, 4]), ... slice(1, 2)) TensorDict( fields={ a: Tensor(torch.Size([3, 4, 5]), dtype=torch.float32), b: Tensor(torch.Size([3, 4, 10]), dtype=torch.float32)}, batch_size=torch.Size([3, 4]), device=None, is_shared=False) >>> assert (td[1] == 1).all()
- values(include_nested: bool = False, leaves_only: bool = False, is_leaf: Optional[Callable[[Type], bool]] = None, *, sort: bool = False) Iterator[Tensor] ¶
返回一个生成器,表示 tensordict 的值。
- 参数:
include_nested (bool, optional) – 如果
True
, 将返回嵌套的值。默认为False
。leaves_only (bool, optional) – 如果
False
,则仅返回叶子节点。默认为False
。is_leaf (callable, optional) –
一个可调用对象,接受一个类类型作为参数,返回一个布尔值,指示该类是否应被视为叶节点。
注意
is_leaf 的目的不是阻止对嵌套 tensordict 的递归调用,而是将某些类型标记为“叶节点”,以便在 leaves_only=True 时进行过滤。 即使 is_leaf(cls) 返回 True,如果 include_nested=True,tensordict 的嵌套结构仍将被遍历。 换句话说,is_leaf 不控制递归深度,而是提供了一种在 leaves_only=True 时从结果中过滤掉某些类型的方法。 这意味着树中的一个节点可以既是叶节点,又是带有子节点的节点。 实际上,
is_leaf
的默认值会将 tensordict 和 tensorclass 实例从叶节点集中排除。另请参阅
- 关键字参数:
sort (bool, optional) – 是否应该对键进行排序。对于嵌套键,键将根据它们的连接名称进行排序(即,
("a", "key")
将被视为"a.key"
进行排序)。请注意,处理大型 tensordict 时,排序可能会产生显着的开销。默认为False
。
- var(dim: Union[int, Tuple[int], Literal['feature']] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, correction: int = 1, reduce: Optional[bool] = None) tensordict.base.TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有元素的方差值。
- 参数:
dim (int, int 元组, optional) – 如果
None
,则返回一个无量纲的 tensordict,其中包含所有叶节点的总和值(如果可以计算)。 如果是整数或整数元组,则仅当此维度与 tensordict 形状兼容时才对指定的维度调用 var。 目前只允许使用 “feature” 字符串。 使用 dim="feature" 将实现所有特征维度上的缩减。 如果 reduce=True,则将返回一个 TensorDict 批大小形状的张量。 否则,将返回一个与self
具有相同结构的新 tensordict,其中包含缩减的特征维度。keepdim (bool) – 输出张量是否保留 dim。
- 关键字参数:
示例
>>> from tensordict import TensorDict >>> import torch >>> td = TensorDict( ... a=torch.randn(3, 4, 5), ... b=TensorDict( ... c=torch.randn(3, 4, 5, 6), ... d=torch.randn(3, 4, 5), ... batch_size=(3, 4, 5), ... ), ... batch_size=(3, 4) ... ) >>> td.var(dim=0) TensorDict( fields={ a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([4]), device=None, is_shared=False) >>> td.var() TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> td.var(reduce=True) tensor(1.0006) >>> td.var(dim="feature") TensorDict( fields={ a: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3, 4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([3, 4]), device=None, is_shared=False) >>> td = TensorDict( ... a=torch.ones(3, 4, 5), ... b=TensorDict( ... c=torch.ones(3, 4, 5), ... d=torch.ones(3, 4, 5), ... batch_size=(3, 4, 5), ... ), ... batch_size=(3, 4) ... ) >>> td.var(reduce=True, dim="feature") tensor([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]) >>> td.var(reduce=True, dim=0) tensor([[0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.]])
- view(*shape: int, size: list | tuple | torch.Size | None = None, batch_size: torch.Size | None = None)¶
返回一个 tensordict,其中包含根据与 tensordict batch_size 兼容的新形状查看的张量。
或者,可以提供 dtype 作为第一个未命名参数。在这种情况下,所有张量都将使用相应的 dtype 查看。请注意,这假设新形状将与提供的 dtype 兼容。有关 dtype 视图的更多信息,请参见
view()
。- 参数:
*shape (int) – 生成的 tensordict 的新形状。
dtype (torch.dtype) – 或者,用于表示张量内容的 dtype。
size – 可迭代对象
- 关键字参数:
batch_size (torch.Size, optional) – 如果提供了 dtype,则可以使用此关键字参数重置 batch_size。 如果调用带有 shape 的
view
,则此操作无效。- 返回值:
具有所需 batch_size 的新 tensordict。
示例
>>> td = TensorDict(source={'a': torch.zeros(3,4,5), ... 'b': torch.zeros(3,4,10,1)}, batch_size=torch.Size([3, 4])) >>> td_view = td.view(12) >>> print(td_view.get("a").shape) # torch.Size([12, 5]) >>> print(td_view.get("b").shape) # torch.Size([12, 10, 1]) >>> td_view = td.view(-1, 4, 3) >>> print(td_view.get("a").shape) # torch.Size([1, 4, 3, 5]) >>> print(td_view.get("b").shape) # torch.Size([1, 4, 3, 10, 1])
- where(condition, other, *, out=None, pad=None)¶
返回一个
TensorDict
,其中包含从 self 或 other 中选择的元素,具体取决于 condition。- 参数:
condition (BoolTensor) – 当
True
(非零) 时,产生self
,否则产生other
。other (TensorDictBase 或 Scalar) – 值 (如果
other
是标量) 或在 condition 为False
的索引处选择的值。
- 关键字参数:
out (TensorDictBase, optional) – 输出
TensorDictBase
实例。pad (scalar, optional) – 如果提供,则源或目标 tensordict 中缺少的键将写为 torch.where(mask, self, pad) 或 torch.where(mask, pad, other)。 默认为
None
,即不允许缺少键。
- xpu(device: Optional[Union[int, device]] = None) T ¶
将所有模型参数和缓冲区移动到 XPU。
这也会使关联的参数和缓冲区成为不同的对象。因此,如果模块将在 XPU 上进行优化,则应在构造优化器之前调用它。
注意
此方法会就地修改模块。
- 参数:
device (int, optional) – 如果指定,所有参数都将复制到该设备
- 返回值:
self
- 返回类型:
模块
- zero_() T ¶
就地将 tensordict 中的所有张量置零。