TensorDictParams¶
- class tensordict.TensorDictParams(parameters: Optional[Union[TensorDictBase, dict]] = None, *, no_convert=False, lock: bool = False, **kwargs)¶
A Wrapper for TensorDictBase with Parameter Exposure.
This class is designed to hold a TensorDictBase instance that contains parameters, making them accessible to a parent
Module
. This allows for seamless integration of tensordict parameters into PyTorch modules, enabling operations like parameter iteration and optimization.Key Features
Parameter Exposure: Parameters within the tensordict are exposed to the parent module, allowing them to be included in operations like named_parameters().
Indexing: Indexing works similarly to the wrapped tensordict. However, parameter names (in
named_parameters()
) are registered using TensorDict.flatten_keys(“_”), which may result in different key names compared to the tensordict content.Automatic Conversion: Any tensor set in the tensordict is automatically converted to a
torch.nn.Parameter
, unless specified otherwise through theno_convert
keyword argument.
- 参数 (Args)
- parameters (TensorDictBase or dict): The tensordict to represent as parameters. Values are converted to
parameters unless no_convert=True. If a dict is provided, it is wrapped in a TensorDict instance. Keyword arguments can also be used.
- 关键字参数:
no_convert (bool) – If True, no conversion to nn.Parameter occurs and all non-parameter, non-buffer tensors will be converted to a
Buffer
instance. IfFalse
, all tensors with non-integer dtypes will be converted toParameter
whereas integer dtypes will be converted toBuffer
instances. Defaults to False.lock (bool) –
If True, the tensordict hosted by TensorDictParams is locked, preventing modifications and potentially impacting performance when unlock_() is required. Defaults to False.
警告
Because the inner tensordict isn’t copied or locked by default, registering the tensordict in a
TensorDictParams
and modifying its content afterwards will __not__ update the values within theTensorDictParams
parameters()
andbuffers()
sequences.**kwargs – Key-value pairs to populate the TensorDictParams. Exclusive with the parameters input.
- 示例
>>> 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 ¶
Adds
other
, scaled byalpha
, toself
.\[\text{{out}}_i = \text{{input}}_i + \text{{alpha}} \times \text{{other}}_i\]- 参数:
other (TensorDictBase or torch.Tensor) – the tensor or TensorDict to add to
self
.- 关键字参数:
alpha (数字, 可选) –
other
的乘数。default (torch.Tensor or str, optional) – the default value to use for exclusive entries. If none is provided, the two tensordicts key list must match exactly. If
default="intersection"
is passed, only the intersecting key sets will be considered and other keys will be ignored. In all other cases,default
will be used for all missing entries on both sides of the operation.
- add_(other: tensordict.base.TensorDictBase | torch.Tensor | float, *, alpha: Optional[float] = None)¶
In-place version of
add()
.注意
原地
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)¶
Performs the element-wise division of
other1
byother2
, multiplies the result by the scalarvalue
and adds it toself
.\[\text{out}_i = \text{input}_i + \text{value} \times \frac{\text{tensor1}_i}{\text{tensor2}_i}\]The shapes of the elements of
self
,other1
, andother2
must be broadcastable.对于 FloatTensor 或 DoubleTensor 类型的输入,
value
必须是实数,否则为整数。- 参数:
other1 (TensorDict 或 Tensor) – 被除数 tensordict(或 tensor)
tensor2 (TensorDict 或 Tensor) – 除数 tensordict(或 tensor)
- 关键字参数:
value (数字, 可选) – \(\text{tensor1} / \text{tensor2}\) 的乘数
- addcmul(other1: tensordict.base.TensorDictBase | torch.Tensor, other2: tensordict.base.TensorDictBase | torch.Tensor, *, value: float | None = 1)¶
Performs the element-wise multiplication of
other1
byother2
, multiplies the result by the scalarvalue
and adds it toself
.\[\text{out}_i = \text{input}_i + \text{value} \times \text{other1}_i \times \text{other2}_i\]The shapes of
self
,other1
, andother2
must be broadcastable.对于 FloatTensor 或 DoubleTensor 类型的输入,
value
必须是实数,否则为整数。- 参数:
other1 (TensorDict 或 Tensor) – 要相乘的 tensordict 或 tensor
other2 (TensorDict 或 Tensor) – 要相乘的 tensordict 或 tensor
- 关键字参数:
value (数字, 可选) – \(other1 .* other2\) 的乘数
- all(dim: int | None = None) bool | tensordict.base.TensorDictBase ¶
检查 tensordict 中的所有值是否都为 True/非空。
- 参数:
dim (int, optional) – if
None
, returns a boolean indicating whether all tensors return tensor.all() == True If integer, all is called upon the dimension specified if and only if this dimension is compatible with the tensordict shape.
- amax(dim: int | NO_DEFAULT = _NoDefault.ZERO, keepdim: bool = False, *, reduce: bool | None = None) TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有元素的最大值。
Same as
max()
withreturn_indices=False
.
- amin(dim: int | NO_DEFAULT = _NoDefault.ZERO, keepdim: bool = False, *, reduce: bool | None = None) TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有元素的最小值。
Same as
min()
withreturn_indices=False
.
- any(dim: int | None = None) bool | tensordict.base.TensorDictBase ¶
检查 tensordict 中的任何值是否为 True/非空。
- 参数:
dim (int, optional) – if
None
, returns a boolean indicating whether all tensors return tensor.any() == True. If integer, all is called upon the dimension specified if and only if this dimension is compatible with the tensordict shape.
- 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中张量的函数。
*others (TensorDictBase instances, optional) – if provided, these tensordict instances should have a structure matching the one of self. The
fn
argument should receive as many unnamed inputs as the number of tensordicts, including self. If other tensordicts have missing entries, a default value can be passed through thedefault
keyword argument.
- 关键字参数:
batch_size (sequence of int, optional) – if provided, the resulting TensorDict will have the desired batch_size. The
batch_size
argument should match the batch_size after the transformation. This is a keyword only argument.device (torch.device, 可选) – 生成的设备,如果有的话。
names (字符串列表, 可选) – 新的维度名称,以防batch_size被修改。
inplace (bool, optional) – if True, changes are made in-place. Default is False. This is a keyword only argument.
default (Any, 可选) – 其他tensordict中缺失条目的默认值。如果未提供,缺失的条目将引发KeyError。
filter_empty (bool, optional) – if
True
, empty tensordicts will be filtered out. This also comes with a lower computational cost as empty data structures won’t be created and destroyed. Non-tensor data is considered as a leaf and thereby will be kept in the tensordict even if left untouched by the function. Defaults toFalse
for backward compatibility.propagate_lock (bool, optional) – if
True
, a locked tensordict will produce another locked tensordict. Defaults toFalse
.call_on_nested (bool, optional) –
if
True
, the function will be called on first-level tensors and containers (TensorDict or tensorclass). In this scenario,func
is responsible of propagating its calls to nested levels. This allows a fine-grained behaviour when propagating the calls to nested tensordicts. IfFalse
, the function will only be called on leaves, andapply
will take care of dispatching the function to all leaves.>>> 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()
警告
If the operation executed on the tensordict requires multiple keys to be accessed for a single computation, providing an
out
argument equal toself
can cause the operation to provide silently wrong results. For instance>>> 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构造函数的其他关键字参数。
- 返回:
一个包含转换后张量的新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)
注意
The apply method will return an
TensorDict
instance, regardless of the input type. To keep the same type, one can execute>>> out = td.clone(False).update(td.apply(...))
- apply_(fn: Callable, *others, **kwargs) T ¶
将一个可调用对象应用于tensordict中存储的所有值,并原地重写它们。
- 参数:
fn (Callable) – 要应用于tensordict中张量的函数。
*others (TensorDictBase 序列, 可选) – 要使用的其他tensordicts。
Keyword Args: See
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, keep_compliant_size: bool = False) T ¶
设置tensordict的最大batch-size,最多可选batch_dims。
- 参数:
batch_dims (int, optional) – if provided, the batch-size will be at most
batch_dims
long.keep_compliant_size (bool, optional) – if True, a sub-tensordict with a compliant size will not see its shape be changed in case batch_dims is passed. If False, all contained tensordicts will have a batch_dims that matches batch_dims. Defaults to False.
- 返回:
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 ¶
自动设置设备,如果它是唯一的。
返回: self 及其编辑后的
device
属性。
- property batch_size: Size¶
TensorDict的形状(或batch_size)。
The shape of a tensordict corresponds to the common first
N
dimensions of the tensors it contains, whereN
is an arbitrary number. The batch-size contrasts with the “feature size” which repesents the semantically relevant shapes of a tensor. For instance, a batch of videos may have shape[B, T, C, W, H]
, where[B, T]
is the batch-size (batch and time dimensions) and[C, W, H]
are the feature dimensions (channels and spacial dimensions).`TensorDict`的形状在初始化时由用户控制(即,它不是从张量形状推断出来的)。
`batch_size`可以动态编辑,如果新大小与TensorDict内容兼容。例如,将批次大小设置为空值始终是允许的。
- 返回:
a
Size
object describing the TensorDict batch size.
示例
>>> data = TensorDict({ ... "key 0": torch.randn(3, 4), ... "key 1": torch.randn(3, 5), ... "nested": TensorDict({"key 0": torch.randn(3, 4)}, batch_size=[3, 4])}, ... batch_size=[3]) >>> data.batch_size = () # resets the batch-size to an empty value
- bfloat16()¶
将所有张量转换为
torch.bfloat16
。
- bitwise_and(other: tensordict.base.TensorDictBase | torch.Tensor, *, default: str | torch.Tensor | None = None) TensorDictBase ¶
执行`self`和`other`之间的按位AND运算。
\[\text{{out}}_i = \text{{input}}_i \land \text{{other}}_i\]- 参数:
other (TensorDictBase or torch.Tensor) – the tensor or TensorDict to perform the bitwise AND with.
- 关键字参数:
default (torch.Tensor or str, optional) – the default value to use for exclusive entries. If none is provided, the two tensordicts key list must match exactly. If
default="intersection"
is passed, only the intersecting key sets will be considered and other keys will be ignored. In all other cases,default
will be used for all missing entries on both sides of the operation.
- bool()¶
将所有张量转换为
torch.bool
。
- buffers(recurse: bool = True) Iterator[Tensor] ¶
返回模块缓冲区的迭代器。
- 参数:
recurse (bool) – if True, then yields buffers of this module and all submodules. Otherwise, yields only buffers that are direct members of this module.
- 产生:
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) – Whether to count duplicated tensor as independent or not. If
False
, only strictly identical tensors will be discarded (same views but different ids from a common base tensor will be counted twice). Defaults to True (each tensor is assumed to be a single copy).
- classmethod cat(input, dim: int = 0, *, out=None)¶
将tensordicts沿给定维度连接成一个tensordict。
This call is equivalent to calling
torch.cat()
but is compatible with torch.compile.
- cat_from_tensordict(dim: int = 0, *, sorted: Optional[Union[bool, List[NestedKey]]] = None, out: Optional[Tensor] = None) Tensor ¶
将tensordict的所有条目连接成一个单一的张量。
- 参数:
dim (int, 可选) – 应沿哪个维度连接条目。
- 关键字参数:
sorted (bool or list of NestedKeys) – if
True
, the entries will be concatenated in alphabetical order. IfFalse
(default), the dict order will be used. Alternatively, a list of key names can be provided and the tensors will be concatenated accordingly. This incurs some overhead as the list of keys will be checked against the list of leaf names in the tensordict.out (torch.Tensor, optional) – an optional destination tensor for the cat operation.
- cat_tensors(*keys: NestedKey, out_key: NestedKey, dim: int = 0, keep_entries: bool = False) T ¶
将条目连接成一个新条目,并可能删除原始值。
- 参数:
keys (NestedKey 序列) – 要连接的条目。
- 关键字参数
out_key (NestedKey): new key name for the concatenated inputs. keep_entries (bool, optional): if
False
, entries inkeys
will be deleted.默认为
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)¶
Clamps all elements in
self
into the range [min
,max
].Letting min_value and max_value be
min
andmax
, respectively, this returns注意
If
min
is greater thanmax
torch.clamp(..., min, max)
sets all elements ininput
to the value ofmax
.
- clamp_max(other: tensordict.base.TensorDictBase | torch.Tensor, *, default: str | torch.Tensor | None = None) T ¶
如果`self`中的元素大于`other`,则将它们限制为`other`。
- 参数:
other (TensorDict 或 Tensor) – 另一个输入tensordict或张量。
- 关键字参数:
default (torch.Tensor or str, optional) – the default value to use for exclusive entries. If none is provided, the two tensordicts key list must match exactly. If
default="intersection"
is passed, only the intersecting key sets will be considered and other keys will be ignored. In all other cases,default
will be used for all missing entries on both sides of the operation.
- clamp_max_(other: tensordict.base.TensorDictBase | torch.Tensor) T ¶
In-place version of
clamp_max()
.注意
原地`clamp_max`不支持`default`关键字参数。
- clamp_min(other: tensordict.base.TensorDictBase | torch.Tensor, default: str | torch.Tensor | None = None) T ¶
将
self
的元素限制在不小于other
的值。- 参数:
other (TensorDict 或 Tensor) – 另一个输入tensordict或张量。
- 关键字参数:
default (torch.Tensor or str, optional) – the default value to use for exclusive entries. If none is provided, the two tensordicts key list must match exactly. If
default="intersection"
is passed, only the intersecting key sets will be considered and other keys will be ignored. In all other cases,default
will be used for all missing entries on both sides of the operation.
- clamp_min_(other: tensordict.base.TensorDictBase | torch.Tensor) T ¶
In-place version of
clamp_min()
.注意
原地
clamp_min
不支持default
关键字参数。
- clear() T ¶
清除 tensordict 的内容。
- clear_device_() T ¶
清除 tensordict 的设备。
返回: self
- clear_refs_for_compile_() T ¶
清除弱引用,以便 tensordict 安全地退出编译区域。
在返回 TensorDict 之前遇到 torch._dynamo.exc.Unsupported: reconstruct: WeakRefVariable() 时,请使用此方法。
返回: self
- clone(recurse: bool = True, **kwargs) T ¶
将 TensorDictBase 子类实例克隆到相同类型的新 TensorDictBase 子类。
To create a TensorDict instance from any other TensorDictBase subtype, call the
to_tensordict()
method instead.- 参数:
recurse (bool, optional) – if
True
, each tensor contained in the TensorDict will be copied too. Otherwise only the TensorDict tree structure will be copied. Defaults toTrue
.
注意
Unlike many other ops (pointwise arithmetic, shape operations, …)
clone
does not inherit the original lock attribute. This design choice is made such that a clone can be created to be modified, which is the most frequent usage.
- compile(*args, **kwargs)¶
Compile this Module’s forward using
torch.compile()
.This Module’s __call__ method is compiled and all arguments are passed as-is to
torch.compile()
.See
torch.compile()
for details on the arguments for this function.
- 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, optional) – 用于内存映射张量的可选文件路径,作为 tensordict 的存储。
- 关键字参数:
num_threads (integer, optional) – 用于填充存储的线程数。
device (torch.device, optional) – an optional device where the storage must be instantiated。
inplace (bool, optional) – if
True
, the resulting tensordict is the same asself
with updated values。Defaults toFalse
。return_early (bool, optional) – if
True
andnum_threads>0
, the method will return a future of the tensordict。The resulting tensordict can be queried using future.result()。use_buffer (bool, optional) – if
True
and a filename is passed, an intermediate local buffer will be created in shared memory, and the data will be copied at the storage location as a last step。This may be faster than writing directly to a distant physical memory (e.g., NFS)。Defaults toFalse
。share_memory (bool, optional) – if
True
, the storage will be placed in shared memory。Defaults toFalse
。pin_memory (bool, optional) – whether the consolidated data should be placed in pinned memory。Defaults to
False
。metadata (bool, optional) – if
True
, the metadata will be stored alongisde the common storage。If a filename is provided, this is without effect。Storing the metadata can be useful when one wants to control how serialization is achieved, as TensorDict handles the pickling/unpickling of consolidated TDs differently if the metadata is or isn’t available。
注意
If the tensordict is already consolidated, all arguments are ignored and
self
is returned。Callcontiguous()
to re-consolidate。示例
>>> 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)。(Returns a new tensordict of the same type with contiguous values (or self if values are already contiguous).)
- copy()¶
返回 tensordict 的浅拷贝(即,复制结构但不复制数据)。
等同于 TensorDictBase.clone(recurse=False)
- copy_(tensordict: T, non_blocking: bool | None = None) T ¶
-
非阻塞参数将被忽略,仅为与
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。
如果值已存在,它将被此操作覆盖。此操作在锁定的 tensordicts 中被阻止。
示例
>>> 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, optional) – 如果提供,则为张量应被转换到的 cuda 设备。
This function also supports all the keyword arguments of
to()
。
- cummax(dim: int, *, reduce: Optional[bool] = None, return_indices: bool = True) tensordict.base.TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有元素的最大累积值。
- 参数:
dim (int) – 沿其执行 cummax 操作的维度的整数。
- 关键字参数:
reduce (bool, optional) – if
True
, the reduction will occur across all TensorDict values and a single reduced tensor will be returned。Defaults toFalse
。return_argmins (bool, optional) –
cummax()
returns a named tuple with values and indices when thedim
argument is passed。TheTensorDict
equivalent of this is to return a tensorclass with entries"values"
and"indices"
with idendical structure within。Defaults toTrue
。
示例
>>> from tensordict import TensorDict >>> import torch >>> td = TensorDict( ... a=torch.randn(3, 4, 5), ... b=TensorDict( ... c=torch.randn(3, 4, 5, 6), ... d=torch.randn(3, 4, 5), ... batch_size=(3, 4, 5), ... ), ... batch_size=(3, 4) ... ) >>> td.cummax(dim=0) cummax( indices=TensorDict( fields={ a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.int64, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.int64, is_shared=False), d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([4]), device=None, is_shared=False)}, batch_size=torch.Size([4]), device=None, is_shared=False), vals=TensorDict( fields={ a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([4]), device=None, is_shared=False)}, batch_size=torch.Size([4]), device=None, is_shared=False), batch_size=torch.Size([4]), device=None, is_shared=False) >>> td = TensorDict( ... a=torch.randn(3, 4, 5), ... b=TensorDict( ... c=torch.randn(3, 4, 5), ... d=torch.randn(3, 4, 5), ... batch_size=(3, 4, 5), ... ), ... batch_size=(3, 4) ... ) >>> td.cummax(reduce=True, dim=0) torch.return_types.cummax(...)
- cummin(dim: int, *, reduce: Optional[bool] = None, return_indices: bool = True) tensordict.base.TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有元素的最小累积值。
- 参数:
dim (int) – 沿其执行 cummin 操作的维度的整数。
- 关键字参数:
reduce (bool, optional) – if
True
, the reduction will occur across all TensorDict values and a single reduced tensor will be returned。Defaults toFalse
。return_argmins (bool, optional) –
cummin()
returns a named tuple with values and indices when thedim
argument is passed。TheTensorDict
equivalent of this is to return a tensorclass with entries"values"
and"indices"
with idendical structure within。Defaults toTrue
。
示例
>>> 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¶
返回一个包含叶张量的 .data 属性的 tensordict。
- data_ptr(*, storage: bool = False)¶
返回tensordict叶子节点的data_ptr。
这有助于检查两个tensordict是否共享相同的
data_ptr()
。- 关键字参数:
storage (bool, optional) – if
True
, tensor.untyped_storage().data_ptr() will be called instead。Defaults toFalse
。
示例
>>> 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
instances will be displayed as nested tensordicts to reflect the truedata_ptr()
of their leaves>>> 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) – the layout of the nested tensors, if any。Defaults to
strided
。
- detach() T ¶
分离tensordict中的张量。
- 返回:
返回一个不包含需要梯度的张量的新tensordict。
- detach_(*args, **kwargs)¶
就地分离tensordict中的张量。
- 返回:
self。
- property device¶
TensorDict的设备。
If the TensorDict has a specified device, all its tensors (incl. nested ones) must live on the same device。If the TensorDict device is
None
, different values can be located on different devices。- 返回:
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 ¶
See
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 or str, optional) – the default value to use for exclusive entries. If none is provided, the two tensordicts key list must match exactly. If
default="intersection"
is passed, only the intersecting key sets will be considered and other keys will be ignored. In all other cases,default
will be used for all missing entries on both sides of the operation.
- div_(other: tensordict.base.TensorDictBase | torch.Tensor) T ¶
In-place version of
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保存到磁盘。
This function is a proxy to
memmap()
。
- empty(recurse=False, *, batch_size=None, device=_NoDefault.ZERO, names=None) T ¶
返回一个新的、空的tensordict,具有相同的设备和批次大小。
- 参数:
recurse (bool, optional) – if
True
, the entire structure of theTensorDict
will be reproduced without content。Otherwise, only the root will be duplicated。Defaults toFalse
。- 关键字参数:
batch_size (torch.Size, optional) – tensordict的新批次大小。
device (torch.device, optional) – 新设备。
names (list of str, optional) – 维度名称。
- entry_class(*args, **kwargs)¶
返回条目的类,可能避免调用isinstance(td.get(key), type)。
This method should be preferred to
tensordict.get(key).shape
wheneverget()
can be expensive to execute。
- erf() T ¶
计算TensorDict中每个元素的
erf()
值。
- erf_() T ¶
就地计算TensorDict中每个元素的
erf()
值。
- erfc() T ¶
计算TensorDict中每个元素的
erfc()
值。
- erfc_() T ¶
就地计算TensorDict中每个元素的
erfc()
值。
- eval() Self ¶
将模块设置为评估模式。
This has an effect only on certain modules。See the documentation of particular modules for details of their behaviors in training/evaluation mode, i.e. whether they are affected, e.g.
Dropout
,BatchNorm
, etc。This is equivalent with
self.train(False)
。See Locally disabling gradient computation for a comparison between .eval() and several similar mechanisms that may be confused with it。
- 返回:
self
- 返回类型:
模块
- exclude(*keys: NestedKey, inplace: bool = False) T ¶
排除tensordict的键,并返回一个不包含这些条目的新tensordict。
值不会被复制:对原始tensordict或新tensordict的张量的就地修改将导致两个tensordict都发生变化。
- 参数:
- 返回:
一个新的tensordict(如果
inplace=True
则为相同的tensordict),不包含被排除的条目。
示例
>>> 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 ¶
Fills a tensor pointed by the key with a given scalar value。
- filter_empty_()¶
就地过滤掉所有空的tensordict。
- filter_non_tensor_data() T ¶
过滤掉所有非张量数据。
- flatten(start_dim: int | None = None, end_dim: int | None = None)¶
展平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) – if
True
, the resulting tensordict will have the same identity as the one where the call has been made。Defaults toFalse
。is_leaf (callable, optional) –
一个作用于类类型的可调用对象,返回一个布尔值,指示该类是否应被视为叶子节点。
注意
The purpose of is_leaf is not to prevent recursive calls into nested tensordicts, but rather to mark certain types as “leaves” for the purpose of filtering when leaves_only=True。Even if is_leaf(cls) returns True, the nested structure of the tensordict will still be traversed if include_nested=True。In other words, is_leaf does not control the recursion depth, but rather provides a way to filter out certain types from the result when leaves_only=True。This means that a node in the tree can be both a leaf and a node with children。In practice, the default value of
is_leaf
does exclude tensordict and tensorclass instances from the leaf set。另请参阅
示例
>>> 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)
This method and
unflatten_keys()
are particularly useful when handling state-dicts, as they make it possible to seamlessly convert flat dictionaries into data structures that mimic the structure of the model。示例
>>> 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 ¶
定义每次调用时执行的计算。
所有子类都应重写此方法。
注意
Although the recipe for forward pass needs to be defined within this function, one should call the
Module
instance afterwards instead of this since the former takes care of running the registered hooks while the latter silently ignores them。
- 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)¶
Recursively converts any object to a TensorDict。
注意
from_any
is less restrictive than the regular TensorDict constructor。It can cast data structures like dataclasses or tuples to a tensordict using custom heuristics。This approach may incur some extra overhead and involves more opinionated choices in terms of mapping strategies。注意
This method recursively converts the input object to a TensorDict。If the object is already a TensorDict (or any similar tensor collection object), it will be returned as is。
- 参数:
obj – The object to be converted。
- 关键字参数:
auto_batch_size (bool, optional) – if
True
, the batch size will be computed automatically。Defaults toFalse
。batch_dims (int, optional) – If auto_batch_size is
True
, defines how many dimensions the output tensordict should have。Defaults toNone
(full batch-size at each level)。device (torch.device, optional) – The device on which the TensorDict will be created。
batch_size (torch.Size, optional) – The batch size of the TensorDict。Exclusive with
auto_batch_size
。
- 返回:
A TensorDict representation of the input object。
Supported objects
Dataclasses through
from_dataclass()
(dataclasses will be converted to TensorDict instances, not tensorclasses)。Namedtuples through
from_namedtuple()
。Dictionaries through
from_dict()
。Tuples through
from_tuple()
。NumPy’s structured arrays through
from_struct_array()
。HDF5 objects through
from_h5()
。
- classmethod from_dataclass(dataclass, *, dest_cls: Optional[Type] = None, auto_batch_size: bool = False, batch_dims: Optional[int] = None, as_tensorclass: bool = False, device: Optional[device] = None, batch_size: Optional[Size] = None)¶
Converts a dataclass into a TensorDict instance。
- 参数:
dataclass – The dataclass instance to be converted。
- 关键字参数:
dest_cls (tensorclass, optional) – A tensorclass type to be used to map the data。If not provided, a new class is created。Without effect if
obj
is a type or as_tensorclass is False。auto_batch_size (bool, optional) – If
True
, automatically determines and applies batch size to the resulting TensorDict。Defaults toFalse
。batch_dims (int, optional) – If
auto_batch_size
isTrue
, defines how many dimensions the output tensordict should have。Defaults toNone
(full batch-size at each level)。as_tensorclass (bool, optional) – If
True
, delegates the conversion to the free functionfrom_dataclass()
and returns a tensor-compatible class (tensorclass()
) or instance instead of a TensorDict。Defaults toFalse
。device (torch.device, optional) – The device on which the TensorDict will be created。Defaults to
None
。batch_size (torch.Size, optional) – The batch size of the TensorDict。Defaults to
None
。
- 返回:
A TensorDict instance derived from the provided dataclass, unless as_tensorclass is True, in which case a tensor-compatible class or instance is returned。
- 抛出:
TypeError – If the provided input is not a dataclass instance。
警告
This method is distinct from the free function from_dataclass and serves a different purpose。While the free function returns a tensor-compatible class or instance, this method returns a TensorDict instance。
- classmethod from_dict(*args, **kwargs)¶
Returns a TensorDict created from a dictionary or another
TensorDict
。If
batch_size
is not specified, returns the maximum batch size possible。This function works on nested dictionaries too, or can be used to determine the batch-size of a nested tensordict。
- 参数:
input_dict (dictionary, optional) – a dictionary to use as a data source (nested keys compatible)。
- 关键字参数:
auto_batch_size (bool, optional) – if
True
, the batch size will be computed automatically。Defaults toFalse
。batch_size (iterable of int, optional) – a batch size for the tensordict。
device (torch.device or compatible type, optional) – a device for the TensorDict。
batch_dims (int, optional) – the
batch_dims
(ie number of leading dimensions to be considered forbatch_size
)。Exclusinve withbatch_size
。Note that this is the __maximum__ number of batch dims of the tensordict, a smaller number is tolerated。names (list of str, optional) – the dimension names of the 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)¶
Instance method version of
from_dict()
。Unlike
from_dict()
, this method will attempt to keep the tensordict types within the existing tree (for any existing leaf)。示例
>>> from tensordict import TensorDict, tensorclass >>> import torch >>> >>> @tensorclass >>> class MyClass: ... x: torch.Tensor ... y: int >>> >>> td = TensorDict({"a": torch.randn(()), "b": MyClass(x=torch.zeros(()), y=1)}) >>> print(td.from_dict_instance(td.to_dict())) TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), b: MyClass( x=Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), y=Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> print(td.from_dict(td.to_dict())) TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ x: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), y: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
- classmethod from_h5(filename, *, mode: str = 'r', auto_batch_size: bool = False, batch_dims: Optional[int] = None, batch_size: Optional[Size] = None)¶
从 h5 文件创建 PersistentTensorDict。
- 参数:
filename (str) – h5 文件的路径。
- 关键字参数
mode (str, optional): Reading mode。Defaults to
"r"
。auto_batch_size (bool, optional): IfTrue
, the batch size will be computed automatically。默认为
False
。- batch_dims (int, optional): 如果 auto_batch_size 为
True
,则定义输出 tensordict 的维度数。默认为
None
(每个级别的完整批次大小)。
batch_size (torch.Size, optional): TensorDict 的批次大小。默认为
None
。- batch_dims (int, optional): 如果 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) – if
True
, aTensorDictParams
instance will be returned which can be used to store parameters within atorch.nn.Module
。Defaults toFalse
。lock (bool, optional) – if
True
, the resulting tensordict will be locked。Defaults toTrue
。use_state_dict (bool, optional) –
if
True
, the state-dict from the module will be used and unflattened into a TensorDict with the tree structure of the model。Defaults toFalse
。注意
这在使用 state-dict hook 时尤其有用。
示例
>>> from torch import nn >>> module = nn.TransformerDecoder( ... decoder_layer=nn.TransformerDecoderLayer(nhead=4, d_model=4), ... num_layers=1 ... ) >>> params = TensorDict.from_module(module) >>> print(params["layers", "0", "linear1"]) TensorDict( fields={ bias: Parameter(shape=torch.Size([2048]), device=cpu, dtype=torch.float32, is_shared=False), weight: Parameter(shape=torch.Size([2048, 4]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
- classmethod from_modules(*modules, as_module: bool = False, lock: bool = True, use_state_dict: bool = False, lazy_stack: bool = False, expand_identical: bool = False)¶
为 vmap 的 ensemable 学习/特征期望应用检索多个模块的参数。
- 参数:
modules (sequence of nn.Module) – the modules to get the parameters from。If the modules differ in their structure, a lazy stack is needed (see the
lazy_stack
argument below)。- 关键字参数:
as_module (布尔值, 可选) – 如果为
True
,则返回一个TensorDictParams
实例,该实例可用于在torch.nn.Module
中存储参数。默认为False
。lock (布尔值, 可选) – 如果为
True
,则生成的 tensordict 将被锁定。默认为True
。use_state_dict (布尔值, 可选) –
if
True
, the state-dict from the module will be used and unflattened into a TensorDict with the tree structure of the model。Defaults toFalse
。注意
这在使用 state-dict hook 时尤其有用。
lazy_stack (布尔值, 可选) –
是否密集堆叠或懒惰堆叠参数。默认为
False
(密集堆叠)。注意
lazy_stack
和as_module
是互斥的特性。警告
懒惰输出和非懒惰输出之间存在关键区别:非懒惰输出将使用所需的批次大小重新实例化参数,而
lazy_stack
将仅将参数表示为懒惰堆叠。这意味着,虽然可以将原始参数安全地传递给优化器(当lazy_stack=True
时),但在设置为True
时,需要传递新参数。警告
虽然使用懒惰堆栈来保留原始参数引用很诱人,但请记住,每次调用
get()
时,懒惰堆栈都会执行一次堆叠。这将需要内存(参数大小的 N 倍,如果构建了图,则更多)和计算时间。它也意味着优化器将包含更多参数,并且像step()
或zero_grad()
这样的操作将需要更长的时间来执行。总的来说,lazy_stack
应保留给非常少的用例。expand_identical (布尔值, 可选) – 如果为
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
- 类方法 from_namedtuple(named_tuple, **, auto_batch_size: bool = False, batch_dims: Optional[int] = None, device: Optional[device] = None, batch_size: Optional[Size] = None)¶
递归地将命名元组转换为 TensorDict。
- 参数:
named_tuple – 要转换的命名元组实例。
- 关键字参数:
auto_batch_size (bool, optional) – if
True
, the batch size will be computed automatically。Defaults toFalse
。batch_dims (int, optional) – If
auto_batch_size
isTrue
, defines how many dimensions the output tensordict should have。Defaults toNone
(full batch-size at each level)。device (torch.device, optional) – The device on which the TensorDict will be created。Defaults to
None
。batch_size (torch.Size, optional) – The batch size of the TensorDict。Defaults to
None
。
- 返回:
输入命名元组的 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)
- 类方法 from_pytree(pytree, **, batch_size: Optional[Size] = None, auto_batch_size: bool = False, batch_dims: Optional[int] = None)¶
将 pytree 转换为 TensorDict 实例。
此方法旨在尽可能保留 pytree 的嵌套结构。
其他非张量键将被添加,以跟踪每个级别的标识,从而提供内置的 pytree 到 tensordict 的双射转换 API。
当前接受的类包括列表、元组、命名元组和字典。
注意
对于字典,非 NestedKey 键将作为
NonTensorData
实例单独注册。注意
可转换为张量类型(如 int、float 或 np.ndarray)将被转换为 torch.Tensor 实例。请注意,此转换是满射的:将 tensordict 转换回 pytree 将无法恢复原始类型。
示例
>>> # Create a pytree with tensor leaves, and one "weird"-looking dict key >>> class WeirdLookingClass: ... pass ... >>> weird_key = WeirdLookingClass() >>> # Make a pytree with tuple, lists, dict and namedtuple >>> pytree = ( ... [torch.randint(10, (3,)), torch.zeros(2)], ... { ... "tensor": torch.randn( ... 2, ... ), ... "td": TensorDict({"one": 1}), ... weird_key: torch.randint(10, (2,)), ... "list": [1, 2, 3], ... }, ... {"named_tuple": TensorDict({"two": torch.ones(1) * 2}).to_namedtuple()}, ... ) >>> # Build a TensorDict from that pytree >>> td = TensorDict.from_pytree(pytree) >>> # Recover the pytree >>> pytree_recon = td.to_pytree() >>> # Check that the leaves match >>> def check(v1, v2): >>> assert (v1 == v2).all() >>> >>> torch.utils._pytree.tree_map(check, pytree, pytree_recon) >>> assert weird_key in pytree_recon[1]
- 类方法 from_remote_init(src: int, group: 'ProcessGroup' | None = None, device: torch.device | None = None) T ¶
从远程发送的元数据创建新的 tensordict 实例。
此类方法接收由 init_remote 发送的元数据,创建具有匹配形状和 dtype 的新 tensordict,然后异步接收实际的 tensordict 内容。
- 参数:
src (int) – 发送元数据的源进程的秩。
group ("ProcessGroup", optional) – 要使用的进程组。默认为 None。
device (torch.device, 可选) – 用于张量操作的设备。默认为 None。
- 返回:
使用接收到的元数据和内容初始化的新 tensordict 实例。
- 返回类型:
另请参阅
发送进程应已调用 ~.init_remote 来发送元数据和内容。
- 类方法 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 (布尔值, 可选) – 如果为
True
,将自动计算批次大小。默认为False
。batch_dims (int, optional) – If
auto_batch_size
isTrue
, defines how many dimensions the output tensordict should have。Defaults toNone
(full batch-size at each level)。device (torch.device, 可选) –
将创建 TensorDict 的设备。默认为
None
。注意
更改设备(即,指定除
None
或"cpu"
以外的任何设备)将传输数据,导致返回数据的内存位置发生变化。batch_size (torch.Size, optional) – TensorDict 的批次大小。默认为 None。
- 返回:
输入的结构化 numpy 数组的 TensorDict 表示。
示例
>>> x = np.array( ... [("Rex", 9, 81.0), ("Fido", 3, 27.0)], ... dtype=[("name", "U10"), ("age", "i4"), ("weight", "f4")], ... ) >>> td = TensorDict.from_struct_array(x) >>> x_recon = td.to_struct_array() >>> assert (x_recon == x).all() >>> assert x_recon.shape == x.shape >>> # Try modifying x age field and check effect on td >>> x["age"] += 1 >>> assert (td["age"] == np.array([10, 4])).all()
- 类方法 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 (布尔值, 可选) – 如果为
True
,将自动计算批次大小。默认为False
。batch_dims (int, optional) – If auto_batch_size is
True
, defines how many dimensions the output tensordict should have。Defaults toNone
(full batch-size at each level)。device (torch.device, optional) – The device on which the TensorDict will be created。Defaults to
None
。batch_size (torch.Size, optional) – The batch size of the TensorDict。Defaults to
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)
- 类方法 fromkeys(keys: List[NestedKey], value: Any = 0)¶
从键列表和单个值创建 tensordict。
- 参数:
keys (list of NestedKey) – 指定新字典键的可迭代对象。
value (compatible type, optional) – 所有键的值。默认为
0
。
- gather(dim: int, index: Tensor, out: Optional[T] = None) T ¶
沿由 dim 指定的轴收集值。
- 参数:
dim (int) – 要收集元素的维度
index (torch.Tensor) – 一个长整型张量,其维度数量与 tensordict 的维度数量匹配,并且这两个张量之间只有一个维度不同(即收集维度)。其元素指的是沿所需维度收集的索引。
out (TensorDictBase, 可选) – 目标 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 ¶
从各个工作节点收集 tensordicts 并将它们堆叠到目标节点上的 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://: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://: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, **kwargs) Tensor ¶
从键 key 在索引 idx 处获取 tensordict 的值。
- 参数:
key (str, tuple of str) – 要检索的键。
index (int, slice, torch.Tensor, 可迭代对象) – 张量的索引。
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 – 要查找的 buffer 的完全限定字符串名称。(要指定完全限定字符串,请参阅
get_submodule
。)- 返回:
由
target
引用的缓冲区- 返回类型:
- 抛出:
AttributeError – 如果目标字符串引用了无效路径或解析为非 buffer 的内容。
- get_extra_state() Any ¶
返回要包含在模块 state_dict 中的任何额外状态。
如果需要存储额外状态,请实现此方法和相应的
set_extra_state()
。在构建模块的 state_dict() 时会调用此方法。请注意,为确保 state_dict 的序列化正常工作,额外状态应可进行 pickle。我们仅为张量的序列化提供向后兼容性保证;其他对象的序列化形式如果发生更改,可能无法保证向后兼容性。
- 返回:
要存储在模块 state_dict 中的任何额外状态
- 返回类型:
- get_non_tensor(key: NestedKey, default=_NoDefault.ZERO)¶
获取非张量值(如果存在),或者在找不到非张量值时返回 default。
此方法对张量/TensorDict 值具有鲁棒性,这意味着如果收集到的值是常规张量,它也会被返回(尽管此方法带有一些开销,不应超出其自然范围使用)。
有关如何在 tensordict 中设置非张量值的更多信息,请参阅
set_non_tensor()
。- 参数:
key (NestedKey) – 非张量数据的存储位置。
default (Any, optional) – 找不到键时要返回的值。
- 返回:
tensordict.tensorclass.NonTensorData
的内容, 或者,如果条目未找到,则返回与
key
对应的条目(如果它不是tensordict.tensorclass.NonTensorData
)。
示例
>>> 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
给定的参数,否则抛出错误。有关此方法功能以及如何正确指定
target
的更详细说明,请参阅get_submodule
的文档字符串。- 参数:
target – 要查找的 Parameter 的完全限定字符串名称。(要指定完全限定字符串,请参阅
get_submodule
。)- 返回:
由
target
引用的参数- 返回类型:
torch.nn.Parameter
- 抛出:
AttributeError – 如果目标字符串引用了无效路径或解析为非
nn.Parameter
的内容。
- get_submodule(target: str) Module ¶
如果存在,返回由
target
给定的子模块,否则抛出错误。例如,假设您有一个
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
包含一个嵌套的子模块net_b
,该子模块本身包含两个子模块net_c
和linear
。然后net_c
包含一个子模块conv
。)要检查我们是否拥有
linear
子模块,我们可以调用get_submodule("net_b.linear")
。要检查我们是否拥有conv
子模块,我们可以调用get_submodule("net_b.net_c.conv")
。get_submodule
的运行时受限于target
中模块嵌套的深度。named_modules
的查询也能达到相同的结果,但其复杂度是传递模块数量的 O(N)。因此,对于检查某个子模块是否存在这样的简单检查,应始终使用get_submodule
。- 参数:
target – 要查找的子模块的完全限定字符串名称。(要指定完全限定字符串,请参阅上面的示例。)
- 返回:
由
target
引用的子模块- 返回类型:
- 抛出:
AttributeError – 如果沿目标字符串产生的路径的任何一点,(子)路径解析为一个不存在的属性名称或一个非
nn.Module
实例的对象。
- 属性 grad¶
返回一个 tensordict,其中包含叶子张量的 .grad 属性。
- half()¶
将所有张量转换为
torch.half
。
- init_remote(dst: int, group: 'ProcessGroup' | None = None, device: torch.device | None = None)¶
通过发送元数据和内容来初始化远程 tensordict。
此方法将当前 tensordict 的元数据(形状、dtype 等)发送到指定的目标 rank(dst)。
然后异步发送实际的 tensordict 内容。
- 参数:
dst (int) – 目标进程的 rank。
group ("ProcessGroup", optional) – 要使用的进程组。默认为 None。
device (torch.device, 可选) – 用于张量操作的设备。默认为 None。
另请参阅
接收进程应调用 ~.from_remote_init 或等效方法来接收并基于发送的元数据初始化新的 tensordict。
示例
>>> import os >>> import torch >>> import torch.distributed as dist >>> from tensordict import TensorDict, MemoryMappedTensor >>> import multiprocessing as mp >>> >>> def server(queue): ... # Set environment variables for distributed communication ... os.environ["MASTER_ADDR"] = "localhost" ... os.environ["MASTER_PORT"] = "29505" ... ... # Initialize the distributed backend ... dist.init_process_group("gloo", rank=0, world_size=2) ... ... # Create a sample tensordict ... td = ( ... TensorDict( ... { ... ("a", "b"): torch.ones(2), ... "c": torch.ones(2), ... ("d", "e", "f"): MemoryMappedTensor.from_tensor(torch.ones(2, 2)), ... }, ... [2], ... ) ... .expand(1, 2) ... .contiguous() ... ) ... ... # Send the tensordict metadata and content to the client ... td.init_remote(dst=1) ... >>> def client(queue): ... # Set environment variables for distributed communication ... os.environ["MASTER_ADDR"] = "localhost" ... os.environ["MASTER_PORT"] = "29505" ... ... # Initialize the distributed backend ... dist.init_process_group("gloo", rank=1, world_size=2) ... ... # Receive the tensordict metadata and content from the server ... received_td = TensorDict.from_remote_init(src=0) ... ... # Verify that the received tensordict matches the expected structure and values ... assert set(received_td.keys()) == {"a", "c", "d"} ... assert (received_td == 1).all() ... ... # Signal that the test has completed successfully ... queue.put("yuppie") >>> >>> if __name__ == "__main__": ... queue = mp.Queue(1) ... ... # Create and start the server and client processes ... main_worker = mp.Process(target=server, args=(queue,)) ... secondary_worker = mp.Process(target=client, args=(queue,)) ... ... main_worker.start() ... secondary_worker.start() ... ... try: ... out = queue.get(timeout=10) # Wait for the signal with a timeout ... print(out) # Should print "yuppie" ... finally: ... queue.close() ... main_worker.join(timeout=10) ... secondary_worker.join(timeout=10)
- int()¶
将所有张量转换为
torch.int
。
- int16()¶
将所有张量转换为
torch.int16
。
- int32()¶
将所有张量转换为
torch.int32
。
- int64()¶
将所有张量转换为
torch.int64
。
- int8()¶
将所有张量转换为
torch.int8
。
- ipu(device: Optional[Union[device, int]] = None) Self ¶
将所有模型参数和缓冲区移动到 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) – 源工作进程的 rank。
- 关键字参数:
group (torch.distributed.ProcessGroup, 可选) – 如果设置,将使用指定的进程组进行通信。否则,将使用默认进程组。默认为
None
。return_premature (布尔值) – 如果为
True
,则返回一个 future 列表,直到 tensordict 更新后才能等待。默认为False
,即等待更新在调用内完成。init_tag (int) – 用于标记张量的初始 tag。请注意,此值将按包含在 TensorDict 中的张量数量递增。
pseudo_rand (布尔值) – 如果为 True,则 tag 序列将是伪随机的,允许从不同节点发送多个数据而不会重叠。请注意,这些伪随机数的生成成本很高(每秒 1e-5 个数字),这意味着它可能会降低算法的运行速度。此值必须与传递给
isend()
的值匹配。默认为False
。
- 返回:
- 如果
return_premature=True
,则返回一个未来列表以等待直到 tensordict 更新。 直到 tensordict 更新。
- 如果
- is_consolidated()¶
检查 TensorDict 是否具有合并的存储。
- is_contiguous(**kwargs)¶
返回一个布尔值,指示所有张量是否是连续的。
- 属性 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, return_early: bool = False) int | List['Work'] ¶
异步发送 tensordict 的内容。
- 参数:
dst (int) – 应将内容发送到的目标工作进程的 rank。
- 关键字参数:
group (torch.distributed.ProcessGroup, 可选) – 如果设置,将使用指定的进程组进行通信。否则,将使用默认进程组。默认为
None
。init_tag (int) – 要用于标记张量的初始 tag。请注意,此值将按包含在 TensorDict 中的张量数量递增。
pseudo_rand (布尔值) – 如果为 True,则 tag 序列将是伪随机的,允许从不同节点发送多个数据而不会重叠。请注意,这些伪随机数的生成成本很高(每秒 1e-5 个数字),这意味着它可能会降低算法的运行速度。默认为
False
。return_early (布尔值, 可选) – 如果为 True,则返回一个 future 列表,而不是最后一个发送的张量的 tag。默认为
False
。
示例
>>> import torch >>> from tensordict import TensorDict >>> from torch import multiprocessing as mp >>> def client(): ... torch.distributed.init_process_group( ... "gloo", ... rank=1, ... world_size=2, ... init_method=f"tcp://: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://: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 (布尔值, 可选) – 如果为
True
,则返回嵌套值。默认为False
。leaves_only (布尔值, 可选) – 如果为
False
,则仅返回叶子。默认为False
。is_leaf (callable, optional) –
一个作用于类类型的可调用对象,返回一个布尔值,指示该类是否应被视为叶子节点。
注意
The purpose of is_leaf is not to prevent recursive calls into nested tensordicts, but rather to mark certain types as “leaves” for the purpose of filtering when leaves_only=True。Even if is_leaf(cls) returns True, the nested structure of the tensordict will still be traversed if include_nested=True。In other words, is_leaf does not control the recursion depth, but rather provides a way to filter out certain types from the result when leaves_only=True。This means that a node in the tree can be both a leaf and a node with children。In practice, the default value of
is_leaf
does exclude tensordict and tensorclass instances from the leaf set。另请参阅
- 关键字参数:
sort (布尔值, 可选) – 键是否应排序。对于嵌套键,键根据其连接名称进行排序(即,
("a", "key")
在排序时将被计为"a.key"
)。请注意,排序可能会给处理大型 tensordicts 带来显著的开销。默认为False
。
- keys(**kwargs)¶
返回 tensordict 键的生成器。
警告
TensorDict 的
keys()
方法返回键的懒惰视图。如果查询了键但未迭代,然后修改了 tensordict,稍后迭代键将返回键的新配置。- 参数:
include_nested (布尔值, 可选) – 如果为
True
,则返回嵌套值。默认为False
。leaves_only (布尔值, 可选) – 如果为
False
,则仅返回叶子。默认为False
。is_leaf (callable, optional) –
一个作用于类类型的可调用对象,返回一个布尔值,指示该类是否应被视为叶子节点。
注意
The purpose of is_leaf is not to prevent recursive calls into nested tensordicts, but rather to mark certain types as “leaves” for the purpose of filtering when leaves_only=True。Even if is_leaf(cls) returns True, the nested structure of the tensordict will still be traversed if include_nested=True。In other words, is_leaf does not control the recursion depth, but rather provides a way to filter out certain types from the result when leaves_only=True。This means that a node in the tree can be both a leaf and a node with children。In practice, the default value of
is_leaf
does exclude tensordict and tensorclass instances from the leaf set。另请参阅
- 关键字参数:
sort (布尔值, 可选) – 键是否应排序。对于嵌套键,键根据其连接名称进行排序(即,
("a", "key")
在排序时将被计为"a.key"
)。请注意,排序可能会给处理大型 tensordicts 带来显著的开销。默认为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')]
- 类方法 lazy_stack(input, dim: int = 0, **, out=None, **kwargs)¶
创建 TensorDicts 的懒惰堆叠。
有关详细信息,请参阅
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, 张量或浮点数) – 插值公式的权重。
- lerp_(end: tensordict.base.TensorDictBase | torch.Tensor | float, weight: tensordict.base.TensorDictBase | torch.Tensor | float)¶
lerp()
的原地版本。
- lgamma() T ¶
计算 TensorDict 中每个元素的
lgamma()
值。
- lgamma_() T ¶
原地计算 TensorDict 中每个元素的
lgamma()
值。
- 类方法 load(prefix: str | pathlib.Path, **kwargs) T ¶
从磁盘加载 tensordict。
此类方法是
load_memmap()
的代理。
- load_(prefix: str | pathlib.Path, **kwargs)¶
在当前 tensordict 中从磁盘加载 tensordict。
此类方法是
load_memmap_()
的代理。
- 类方法 load_memmap(prefix: str | pathlib.Path, device: Optional[device] = None, non_blocking: bool = False, **, out: Optional[TensorDictBase] = None) T ¶
从磁盘加载内存映射的 tensordict。
- 参数:
prefix (str 或 文件夹路径) – 应从中获取已保存 tensordict 的文件夹路径。
device (torch.device 或 等效值, 可选) – 如果提供,数据将异步转换为该设备。支持 “meta” 设备,在这种情况下,数据不会被加载,但会创建一组空的“meta”张量。这有助于在不实际打开任何文件的情况下了解总模型大小和结构。
non_blocking (布尔值, 可选) – 如果为
True
,则加载张量到设备后不会调用同步。默认为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 (布尔值, 可选) – 是否严格强制
state_dict
中的键与此 tensordict 的torch.nn.Module.state_dict()
函数返回的键匹配。默认值:True
assign (布尔值, 可选) – 是否将 state dictionary 中的条目分配给 tensordict 中的相应键,而不是将它们就地复制到 tensordict 的当前张量中。当
False
时,将保留当前模块中张量的属性,当True
时,将保留 state dict 中张量的属性。默认值:False
from_flatten (布尔值, 可选) – 如果为
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) tensordict.base.TensorDictBase ¶
对
self
和other
执行逻辑 AND 操作。\[\text{{out}}_i = \text{{input}}_i \land \text{{other}}_i\]- 参数:
other (TensorDictBase 或 torch.Tensor) – 要执行逻辑 AND 操作的张量或 TensorDict。
- 关键字参数:
default (torch.Tensor or str, optional) – the default value to use for exclusive entries. If none is provided, the two tensordicts key list must match exactly. If
default="intersection"
is passed, only the intersecting key sets will be considered and other keys will be ignored. In all other cases,default
will be used for all missing entries on both sides of the operation.
- 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 ¶
根据形状和可选的 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 ¶
根据存储、形状和可选的 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, 可选) – 如果为
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 并分派操作到所需的 Worker 数量来应用一个函数。
函数签名应为
Callabe[[TensorDict], Union[TensorDict, Tensor]]
。输出必须支持torch.cat()
操作。该函数必须是可序列化的。注意
此方法特别适用于处理存储在磁盘上的大型数据集(例如内存映射的 tensordicts),其中块是原始数据的零拷贝切片,可以以几乎零成本传递给进程。这使得处理非常大的数据集(例如,超过 1TB)的成本很低。
- 参数:
- 关键字参数:
out (TensorDictBase, 可选) – 一个可选的输出容器。其沿提供的
dim
的批次大小必须与self.ndim
匹配。如果它是共享的或内存映射的(is_shared()
或is_memmap()
返回True
),它将在远程进程中被填充,从而避免数据向内传输。否则,将self
的切片数据发送到进程,在当前进程中收集,然后就地写入out
。chunksize (int, 可选) – 每个数据块的大小。大小为 0 的
chunksize
将沿指定维度解绑 tensordict,并在函数应用后重新堆叠;而chunksize>0
将分割 tensordict 并对结果 tensordicts 列表调用torch.cat()
。如果未提供,chunksize
将等于工作进程的数量。对于非常大的 tensordicts,如此大的块可能不适合在内存中进行操作,因此可能需要更多块才能使操作实际可行。此参数与num_chunks
互斥。num_chunks (int, 可选) – 要将 tensordict 分割成的块的数量。如果未提供,块的数量将等于工作进程的数量。对于非常大的 tensordicts,如此大的块可能不适合在内存中进行操作,因此可能需要更多块才能使操作实际可行。此参数与
chunksize
互斥。pool (mp.Pool, 可选) – 用于执行作业的多进程 Pool 实例。如果未提供,将在
map
方法中创建 Pool。generator (torch.Generator, 可选) –
用于设置种子的生成器。将从它生成一个基础种子,然后 Pool 的每个工作进程将使用基础种子加上一个唯一的整数(从
0
到num_workers
)进行种子设置。如果未提供生成器,将使用随机整数作为种子。要使用未设置种子的工作进程,应单独创建 Pool 并将其传递给map()
。注意
在提供低值种子时应格外小心,因为这可能导致实验之间的自相关。例如:如果请求了 8 个工作进程且种子为 4,则工作进程的种子将从 4 到 11。如果种子为 5,则工作进程的种子将从 5 到 12。这两个实验将有 7 个种子的重叠,这可能对结果产生意外影响。
注意
设置工作进程种子的目标是使每个工作进程具有独立的种子,而不是在 map 方法的调用之间具有可重现的结果。换句话说,两个实验可能返回不同的结果,因为不可能知道哪个工作进程会选择哪个作业。但是,我们可以确保每个工作进程都有不同的种子,并且每个工作进程上的伪随机操作是无关联的。
max_tasks_per_child (int, 可选) – 每个子进程选择的最大作业数。默认为
None
,即对作业数量没有限制。worker_threads (int, 可选) – 工作进程的线程数。默认为
1
。index_with_generator (bool, 可选) – 如果为
True
,则 tensordict 的拆分/分块将在查询期间完成,从而节省初始化时间。请注意,chunk()
和split()
比索引(在生成器中使用)效率更高,因此初始化时间的处理时间增加可能会对总运行时间产生负面影响。默认为False
。pbar (bool, 可选) – 如果为
True
,将显示进度条。需要安装 tqdm。默认为False
。mp_start_method (str, 可选) – 多进程的启动方法。如果未提供,将使用默认启动方法。可接受的字符串为
"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分块为大小相等的tensordicts并将操作分派到所需数量的工作进程来应用于tensordict实例。它将逐个生成结果。
函数签名应为
Callabe[[TensorDict], Union[TensorDict, Tensor]]
。函数必须是可序列化的。注意
此方法特别适用于处理存储在磁盘上的大型数据集(例如内存映射的 tensordicts),其中块是原始数据的零拷贝切片,可以以几乎零成本传递给进程。这使得处理非常大的数据集(例如,超过 1TB)的成本很低。
注意
此函数可用于表示数据集并以类似数据加载器的方式从中加载。
- 参数:
- 关键字参数:
shuffle (bool, 可选) – 索引是否应全局随机排序。如果为
True
,每个批次将包含不连续的样本。如果index_with_generator=False
且shuffle=True
,则会引发错误。默认为False
。chunksize (int, 可选) – 每个数据块的大小。大小为 0 的
chunksize
将沿指定维度解绑 tensordict,并在函数应用后重新堆叠;而chunksize>0
将分割 tensordict 并对结果 tensordicts 列表调用torch.cat()
。如果未提供,chunksize
将等于工作进程的数量。对于非常大的 tensordicts,如此大的块可能不适合在内存中进行操作,因此可能需要更多块才能使操作实际可行。此参数与num_chunks
互斥。num_chunks (int, 可选) – 要将 tensordict 分割成的块的数量。如果未提供,块的数量将等于工作进程的数量。对于非常大的 tensordicts,如此大的块可能不适合在内存中进行操作,因此可能需要更多块才能使操作实际可行。此参数与
chunksize
互斥。pool (mp.Pool, 可选) – 用于执行作业的多进程 Pool 实例。如果未提供,将在
map
方法中创建 Pool。generator (torch.Generator, 可选) –
用于设置种子的生成器。将从它生成一个基础种子,然后 Pool 的每个工作进程将使用基础种子加上一个唯一的整数(从
0
到num_workers
)进行种子设置。如果未提供生成器,将使用随机整数作为种子。要使用未设置种子的工作进程,应单独创建 Pool 并将其传递给map()
。注意
在提供低值种子时应格外小心,因为这可能导致实验之间的自相关。例如:如果请求了 8 个工作进程且种子为 4,则工作进程的种子将从 4 到 11。如果种子为 5,则工作进程的种子将从 5 到 12。这两个实验将有 7 个种子的重叠,这可能对结果产生意外影响。
注意
设置工作进程种子的目标是使每个工作进程具有独立的种子,而不是在 map 方法的调用之间具有可重现的结果。换句话说,两个实验可能返回不同的结果,因为不可能知道哪个工作进程会选择哪个作业。但是,我们可以确保每个工作进程都有不同的种子,并且每个工作进程上的伪随机操作是无关联的。
max_tasks_per_child (int, 可选) – 每个子进程选择的最大作业数。默认为
None
,即对作业数量没有限制。worker_threads (int, 可选) – 工作进程的线程数。默认为
1
。index_with_generator (bool, 可选) –
如果为
True
,则 tensordict 的拆分/分块将在查询期间完成,从而节省初始化时间。请注意,chunk()
和split()
比索引(在生成器中使用)效率更高,因此初始化时间的处理时间增加可能会对总运行时间产生负面影响。默认为True
。注意
index_with_generator
的默认值在map_iter
和map
之间有所不同,前者假定将拆分后的 TensorDict 存储在内存中是成本过高的。pbar (bool, 可选) – 如果为
True
,将显示进度条。需要安装 tqdm。默认为False
。mp_start_method (str, 可选) – 多进程的启动方法。如果未提供,将使用默认启动方法。可接受的字符串为
"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 或 Tensor) – 另一个输入tensordict或张量。
- 关键字参数:
default (torch.Tensor or str, optional) – the default value to use for exclusive entries. If none is provided, the two tensordicts key list must match exactly. If
default="intersection"
is passed, only the intersecting key sets will be considered and other keys will be ignored. In all other cases,default
will be used for all missing entries on both sides of the operation.
- maximum_(other: tensordict.base.TensorDictBase | torch.Tensor) T ¶
是
maximum()
的原地版本。注意
原地
maximum
不支持default
关键字参数。
- classmethod maybe_dense_stack(input, dim: int = 0, *, out=None, **kwargs)¶
尝试使 TensorDicts 密集堆叠,并在需要时回退到懒惰堆叠。
有关详细信息,请参阅
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 的批次大小相同的张量。否则,将返回一个与self
具有相同结构的新的 tensordict,其中特征维度已约简。keepdim (bool) – 输出张量是否保留维度。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回张量的所需数据类型。如果指定,将在执行操作之前将输入张量转换为 dtype。这对于防止数据类型溢出很有用。默认值:
None
。reduce (bool, optional) – if
True
, the reduction will occur across all TensorDict values and a single reduced tensor will be returned。Defaults toFalse
。
示例
>>> 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 ¶
将所有张量写入内存映射的 Tensor 中,并放入新的 tensordict。
- 参数:
- 关键字参数:
num_threads (int, 可选) – 用于写入 memmap 张量的线程数。默认为 0。
return_early (bool, 可选) – 如果为
True
且num_threads>0
,则该方法将返回 tensordict 的 future。share_non_tensor (bool, 可选) – 如果为
True
,则非张量数据将在进程之间共享,并且一个节点内的任何工作进程上的写入操作(如就地更新或设置)将更新所有其他工作进程上的值。如果非张量叶子的数量很多(例如,共享大量非张量数据),这可能会导致 OOM 或类似错误。默认为False
。existsok (bool, 可选) – 如果为
False
,如果同一路径下已存在张量,则会引发异常。默认为True
。
然后,TensorDict 将被锁定,这意味着任何非就地的写入操作都将引发异常(例如,重命名、设置或删除条目)。一旦 tensordict 被解锁,内存映射属性将变为
False
,因为无法保证跨进程的同一性。- 返回:
一个新 tensordict,其中张量存储在磁盘上(如果
return_early=False
),否则是一个TensorDictFuture
实例。
注意
以这种方式序列化对于深度嵌套的 tensordicts 来说可能很慢,因此不建议在训练循环中调用此方法。
- memmap_(prefix: Optional[str] = None, copy_existing: bool = False, num_threads: int = 0) TensorDictBase ¶
将所有张量原地写入相应的内存映射张量。
- 参数:
- 关键字参数:
num_threads (int, 可选) – 用于写入 memmap 张量的线程数。默认为 0。
return_early (bool, optional) – if
True
andnum_threads>0
, the method will return a future of the tensordict。The resulting tensordict can be queried using future.result()。share_non_tensor (bool, 可选) – 如果为
True
,则非张量数据将在进程之间共享,并且一个节点内的任何工作进程上的写入操作(如就地更新或设置)将更新所有其他工作进程上的值。如果非张量叶子的数量很多(例如,共享大量非张量数据),这可能会导致 OOM 或类似错误。默认为False
。existsok (bool, 可选) – 如果为
False
,如果同一路径下已存在张量,则会引发异常。默认为True
。
然后,TensorDict 将被锁定,这意味着任何非就地的写入操作都将引发异常(例如,重命名、设置或删除条目)。一旦 tensordict 被解锁,内存映射属性将变为
False
,因为无法保证跨进程的同一性。- 返回:
如果
return_early=False
,则返回 self,否则返回TensorDictFuture
实例。
注意
以这种方式序列化对于深度嵌套的 tensordicts 来说可能很慢,因此不建议在训练循环中调用此方法。
- memmap_like(prefix: str | None = None, copy_existing: bool = False, num_threads: int = 0) T ¶
创建一个无内容的内存映射 tensordict,其形状与原始 tensordict 相同。
- 参数:
- 关键字参数:
num_threads (int, 可选) – 用于写入 memmap 张量的线程数。默认为 0。
return_early (bool, 可选) – 如果为
True
且num_threads>0
,则该方法将返回 tensordict 的 future。share_non_tensor (bool, 可选) – 如果为
True
,则非张量数据将在进程之间共享,并且一个节点内的任何工作进程上的写入操作(如就地更新或设置)将更新所有其他工作进程上的值。如果非张量叶子的数量很多(例如,共享大量非张量数据),这可能会导致 OOM 或类似错误。默认为False
。existsok (bool, 可选) – 如果为
False
,如果同一路径下已存在张量,则会引发异常。默认为True
。
然后,TensorDict 将被锁定,这意味着任何非就地的写入操作都将引发异常(例如,重命名、设置或删除条目)。一旦 tensordict 被解锁,内存映射属性将变为
False
,因为无法保证跨进程的同一性。- 返回:
一个新
TensorDict
实例,其中数据存储为内存映射张量(如果return_early=False
),否则为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 或 Tensor) – 另一个输入tensordict或张量。
- 关键字参数:
default (torch.Tensor or str, optional) – the default value to use for exclusive entries. If none is provided, the two tensordicts key list must match exactly. If
default="intersection"
is passed, only the intersecting key sets will be considered and other keys will be ignored. In all other cases,default
will be used for all missing entries on both sides of the operation.
- minimum_(other: tensordict.base.TensorDictBase | torch.Tensor) T ¶
是
minimum()
的原地版本。注意
原地
minimum
不支持default
关键字参数。
- modules() Iterator[Module] ¶
返回网络中所有模块的迭代器。
- 产生:
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[device, int]] = None) Self ¶
将所有模型参数和缓冲区移动到 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
中减去的张量或数字。- 关键字参数:
default (torch.Tensor or str, optional) – the default value to use for exclusive entries. If none is provided, the two tensordicts key list must match exactly. If
default="intersection"
is passed, only the intersecting key sets will be considered and other keys will be ignored. In all other cases,default
will be used for all missing entries on both sides of the operation.
- 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 中存储的所有值,并将它们设置在一个新的 atensordict 中。
可调用签名必须是
Callable[Tuple[str, Tensor, ...], Optional[Union[Tensor, TensorDictBase]]]
。- 参数:
fn (Callable) – 要应用于 tensordict 中的(名称,张量)对的函数。对于每个叶子,只使用其叶子名称(不使用完整的 NestedKey)。
*others (TensorDictBase instances, optional) – if provided, these tensordict instances should have a structure matching the one of self. The
fn
argument should receive as many unnamed inputs as the number of tensordicts, including self. If other tensordicts have missing entries, a default value can be passed through thedefault
keyword argument.nested_keys (bool, optional) – 如果为
True
,则使用叶节点的完整路径。默认为False
,即仅将最后一个字符串传递给函数。batch_size (sequence of int, optional) – if provided, the resulting TensorDict will have the desired batch_size. The
batch_size
argument should match the batch_size after the transformation. This is a keyword only argument.device (torch.device, 可选) – 生成的设备,如果有的话。
names (字符串列表, 可选) – 新的维度名称,以防batch_size被修改。
inplace (bool, optional) – 如果为 True,则更改是就地进行的。默认为 False。这是一个仅关键字参数。
default (Any, 可选) – 其他tensordict中缺失条目的默认值。如果未提供,缺失的条目将引发KeyError。
filter_empty (bool, optional) – 如果为
True
,则会过滤掉空的 tensordict。这还带来了较低的计算成本,因为不会创建和销毁空数据结构。默认为False
以保持向后兼容。propagate_lock (bool, optional) – 如果为
True
,则锁定的 tensordict 将生成另一个锁定的 tensordict。默认为False
。call_on_nested (bool, optional) –
if
True
, the function will be called on first-level tensors and containers (TensorDict or tensorclass). In this scenario,func
is responsible of propagating its calls to nested levels. This allows a fine-grained behaviour when propagating the calls to nested tensordicts. IfFalse
, the function will only be called on leaves, andapply
will take care of dispatching the function to all leaves.>>> 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()
警告
If the operation executed on the tensordict requires multiple keys to be accessed for a single computation, providing an
out
argument equal toself
can cause the operation to provide silently wrong results. For instance>>> 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构造函数的其他关键字参数。
- 返回:
一个包含转换后张量的新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]] ¶
返回模块缓冲区上的迭代器,同时生成缓冲区的名称和缓冲区本身。
- 参数:
- 产生:
(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']] ¶
返回对直接子模块的迭代器,生成模块的名称和模块本身。
- 产生:
(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 – 用于存储已添加到结果中的模块集合的 memo
prefix – 将添加到模块名称的名称前缀
remove_duplicate – 是否从结果中删除重复的模块实例
- 产生:
(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]] ¶
返回模块参数的迭代器,同时生成参数的名称和参数本身。
- 参数:
- 产生:
(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) – 输出张量是否保留维度。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回张量的所需数据类型。如果指定,将在执行操作之前将输入张量转换为 dtype。这对于防止数据类型溢出很有用。默认值:
None
。reduce (bool, optional) – if
True
, the reduction will occur across all TensorDict values and a single reduced tensor will be returned。Defaults toFalse
。
示例
>>> 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) – 输出张量是否保留维度。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回张量的所需数据类型。如果指定,将在执行操作之前将输入张量转换为 dtype。这对于防止数据类型溢出很有用。默认值:
None
。reduce (bool, optional) – if
True
, the reduction will occur across all TensorDict values and a single reduced tensor will be returned。Defaults toFalse
。
示例
>>> 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¶
See
batch_dims()
。
- ndimension() int ¶
See
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, empty_lazy: bool = False)¶
返回一个大小为
size
的 TensorDict,其中包含空的张量。默认情况下,返回的 TensorDict 具有与此 tensordict 相同的
torch.dtype
和torch.device
。- 参数:
size (int...) – 定义输出张量形状的整数列表、元组或 torch.Size。
- 关键字参数:
dtype (torch.dtype, optional) – 返回的 tensordict 的期望类型。默认值:如果
None
,则 torch.dtype 将保持不变。device (torch.device, optional) – 返回的 tensordict 的期望设备。默认值:如果
None
,则torch.device
将保持不变。requires_grad (bool, optional) – 是否应为返回的张量记录 autograd 操作。默认值:
False
。layout (torch.layout, optional) – 返回的 TensorDict 值的期望布局。默认值:
torch.strided
。pin_memory (bool, optional) – 如果设置为 True,则返回的张量将被分配在固定内存中。仅适用于 CPU 张量。默认值:
False
。empty_lazy (bool, optional) – 如果为 True,则会清空懒惰堆栈的内容。这在填充新 tensordict 期间懒惰堆栈的内容可能发生更改时很有用。此参数会传播到子 tensordict。默认为
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, empty_lazy: bool = False)¶
返回一个大小为
size
的 TensorDict,其中填充值为 1。默认情况下,返回的 TensorDict 具有与此 tensordict 相同的
torch.dtype
和torch.device
。- 参数:
size (sequence of int) – 定义输出张量形状的整数列表、元组或 torch.Size。
fill_value (scalar) – 用于填充输出 Tensor 的数值。
- 关键字参数:
dtype (torch.dtype, optional) – 返回的 tensordict 的期望类型。默认值:如果
None
,则 torch.dtype 将保持不变。device (torch.device, optional) – 返回的 tensordict 的期望设备。默认值:如果
None
,则torch.device
将保持不变。requires_grad (bool, optional) – 是否应为返回的张量记录 autograd 操作。默认值:
False
。layout (torch.layout, optional) – 返回的 TensorDict 值的期望布局。默认值:
torch.strided
。pin_memory (bool, optional) – 如果设置为 True,则返回的张量将被分配在固定内存中。仅适用于 CPU 张量。默认值:
False
。empty_lazy (bool, optional) – 如果为 True,则会清空懒惰堆栈的内容。这在填充新 tensordict 期间懒惰堆栈的内容可能发生更改时很有用。此参数会传播到子 tensordict。默认为
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, empty_lazy: bool = False)¶
返回一个大小为
size
的 TensorDict,其中填充值为 1。默认情况下,返回的 TensorDict 具有与此 tensordict 相同的
torch.dtype
和torch.device
。- 参数:
size (int...) – 定义输出张量形状的整数列表、元组或 torch.Size。
- 关键字参数:
dtype (torch.dtype, optional) – 返回的 tensordict 的期望类型。默认值:如果
None
,则 torch.dtype 将保持不变。device (torch.device, optional) – 返回的 tensordict 的期望设备。默认值:如果
None
,则torch.device
将保持不变。requires_grad (bool, optional) – 是否应为返回的张量记录 autograd 操作。默认值:
False
。layout (torch.layout, optional) – 返回的 TensorDict 值的期望布局。默认值:
torch.strided
。pin_memory (bool, optional) – 如果设置为 True,则返回的张量将被分配在固定内存中。仅适用于 CPU 张量。默认值:
False
。empty_lazy (bool, optional) – 如果为 True,则会清空懒惰堆栈的内容。这在填充新 tensordict 期间懒惰堆栈的内容可能发生更改时很有用。此参数会传播到子 tensordict。默认为
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 (torch.Tensor 或 TensorDictBase) – 要复制的数据。此外,
data
也可以是张量集合(TensorDict
或tensorclass
),在这种情况下,new_tensor
方法将在self
和data
的张量对之间进行迭代。- 参数:
data (torch.Tensor or TensorDictBase) – 要复制的数据。
- 关键字参数:
dtype (torch.dtype, optional) – 返回的 tensordict 的期望类型。默认值:如果
None
,则 torch.dtype 将保持不变。device (torch.device, optional) – 返回的 tensordict 的期望设备。默认值:如果
None
,则torch.device
将保持不变。requires_grad (bool, optional) – 是否应为返回的张量记录 autograd 操作。默认值:
False
。pin_memory (bool, optional) – 如果设置为 True,则返回的张量将被分配在固定内存中。仅适用于 CPU 张量。默认值:
False
。
- new_zeros(*size: Size, dtype: Optional[dtype] = None, device: Union[device, str, int] = _NoDefault.ZERO, requires_grad: bool = False, layout: layout = torch.strided, pin_memory: Optional[bool] = None, empty_lazy: bool = False)¶
返回一个大小为
size
的 TensorDict,其中填充值为 0。默认情况下,返回的 TensorDict 具有与此 tensordict 相同的
torch.dtype
和torch.device
。- 参数:
size (int...) – 定义输出张量形状的整数列表、元组或 torch.Size。
- 关键字参数:
dtype (torch.dtype, optional) – 返回的 tensordict 的期望类型。默认值:如果
None
,则 torch.dtype 将保持不变。device (torch.device, optional) – 返回的 tensordict 的期望设备。默认值:如果
None
,则torch.device
将保持不变。requires_grad (bool, optional) – 是否应为返回的张量记录 autograd 操作。默认值:
False
。layout (torch.layout, optional) – 返回的 TensorDict 值的期望布局。默认值:
torch.strided
。pin_memory (bool, optional) – 如果设置为 True,则返回的张量将被分配在固定内存中。仅适用于 CPU 张量。默认值:
False
。empty_lazy (bool, optional) – 如果为 True,则会清空懒惰堆栈的内容。这在填充新 tensordict 期间懒惰堆栈的内容可能发生更改时很有用。此参数会传播到子 tensordict。默认为
False
。
- norm(*, out=None, dtype: torch.dtype | None = None)¶
计算 tensordict 中每个张量的范数。
- 关键字参数:
out (TensorDict, optional) – 输出 tensordict。
dtype (torch.dtype, optional) – 输出 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) – Whether to count duplicated tensor as independent or not. If
False
, only strictly identical tensors will be discarded (same views but different ids from a common base tensor will be counted twice). Defaults to True (each tensor is assumed to be a single copy).
- parameters(recurse: bool = True) Iterator[Parameter] ¶
返回模块参数的迭代器。
这通常传递给优化器。
- 参数:
recurse (bool) – 如果为 True,则会生成此模块和所有子模块的参数。否则,仅生成此模块的直接成员的参数。
- 产生:
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)¶
根据 dims 返回 tensordict 的视图,其中批次维度已重新排序。
- 参数:
*dims_list (int) – 批次维度的新顺序。或者,可以提供整数的可迭代对象。
dims (list of int) – 调用 permute(…) 的替代方法。
- 返回:
返回一个批次维度按所需顺序排列的新 tensordict。
示例
>>> tensordict = TensorDict({"a": torch.randn(3, 4, 5)}, [3, 4]) >>> print(tensordict.permute([1, 0])) PermutedTensorDict( source=TensorDict( fields={ a: Tensor(torch.Size([3, 4, 5]), dtype=torch.float32)}, batch_size=torch.Size([3, 4]), device=cpu, is_shared=False), op=permute(dims=[1, 0])) >>> print(tensordict.permute(1, 0)) PermutedTensorDict( source=TensorDict( fields={ a: Tensor(torch.Size([3, 4, 5]), dtype=torch.float32)}, batch_size=torch.Size([3, 4]), device=cpu, is_shared=False), op=permute(dims=[1, 0])) >>> print(tensordict.permute(dims=[1, 0])) PermutedTensorDict( source=TensorDict( fields={ a: Tensor(torch.Size([3, 4, 5]), dtype=torch.float32)}, batch_size=torch.Size([3, 4]), device=cpu, is_shared=False), op=permute(dims=[1, 0]))
- pin_memory(*args, **kwargs)¶
调用存储的张量上的
pin_memory()
。- 参数:
num_threads (int or str) – 如果提供,则用于调用叶节点的
pin_memory
的线程数。默认为None
,它在ThreadPoolExecutor(max_workers=None)
中设置了很高的线程数。要将所有对pin_memory()
的调用执行在主线程上,请传递num_threads=0
。inplace (bool, optional) – 如果为
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 or nested key) – 要查找的条目。
default (Any, optional) – 找不到键时要返回的值。
示例
>>> 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 or tensordict) – 指数
- 关键字参数:
default (torch.Tensor or str, optional) – the default value to use for exclusive entries. If none is provided, the two tensordicts key list must match exactly. If
default="intersection"
is passed, only the intersecting key sets will be considered and other keys will be ignored. In all other cases,default
will be used for all missing entries on both sides of the operation.
- pow_(other: tensordict.base.TensorDictBase | torch.Tensor) T ¶
是
pow()
的就地版本。注意
就地
pow
不支持default
关键字参数。
- prod(dim: Union[int, Tuple[int], Literal['feature']] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, dtype: Optional[dtype] = None, reduce: Optional[bool] = None) tensordict.base.TensorDictBase | torch.Tensor ¶
返回输入 TensorDict 中所有元素的乘积。
- 参数:
dim (int, tuple of int, optional) – 如果为
None
,则返回一个无量纲的 tensordict,其中包含所有叶子的乘积值(如果可以计算)。如果为整数或整数元组,则仅当此维度与 tensordict 形状兼容时,才会在指定的维度上调用 prod。目前只允许使用 “feature” 字符串。使用 dim=”feature” 将在所有特征维度上实现约减。如果 reduce=True,则返回的张量形状将与 TensorDict 的批次大小相同。否则,将返回一个结构与self
相同的新的 tensordict,其特征维度已减小。keepdim (bool) – 输出张量是否保留维度。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回张量的所需数据类型。如果指定,将在执行操作之前将输入张量转换为 dtype。这对于防止数据类型溢出很有用。默认值:
None
。reduce (bool, optional) – if
True
, the reduction will occur across all TensorDict values and a single reduced tensor will be returned。Defaults toFalse
。
示例
>>> from tensordict import TensorDict >>> import torch >>> td = TensorDict( ... a=torch.randn(3, 4, 5), ... b=TensorDict( ... c=torch.randn(3, 4, 5, 6), ... d=torch.randn(3, 4, 5), ... batch_size=(3, 4, 5), ... ), ... batch_size=(3, 4) ... ) >>> td.prod(dim=0) TensorDict( fields={ a: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([4, 5, 6]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([4, 5]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([4]), device=None, is_shared=False) >>> td.prod() TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> td.prod(reduce=True) tensor(-0.) >>> td.prod(dim="feature") TensorDict( fields={ a: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False), d: Tensor(shape=torch.Size([3, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3, 4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([3, 4]), device=None, is_shared=False) >>> td = TensorDict( ... a=torch.ones(3, 4, 5), ... b=TensorDict( ... c=torch.ones(3, 4, 5), ... d=torch.ones(3, 4, 5), ... batch_size=(3, 4, 5), ... ), ... batch_size=(3, 4) ... ) >>> td.prod(reduce=True, dim="feature") tensor([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]) >>> td.prod(reduce=True, dim=0) tensor([[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]])
- qint32()¶
将所有张量强制转换为
torch.qint32
。
- qint8()¶
将所有张量强制转换为
torch.qint8
。
- quint4x2()¶
将所有张量强制转换为
torch.quint4x2
。
- quint8()¶
将所有张量强制转换为
torch.quint8
。
- reciprocal() T ¶
计算 TensorDict 中每个元素的
reciprocal()
值。
- reciprocal_() T ¶
原地计算 TensorDict 中每个元素的
reciprocal()
值。
- record_stream(stream: Stream) T ¶
标记 TensorDict 已被此流使用。
当 TensorDict 被解除分配时,请确保在解除分配时该流上的所有工作完成之前,不要将张量内存重用于其他张量。
请参阅
record_stream()
以获取更多信息。
- recv(src: int, *, group: 'torch.distributed.ProcessGroup' | None = None, init_tag: int = 0, pseudo_rand: bool = False) int ¶
接收 TensorDict 的内容并用其更新内容。
有关上下文,请查看 send 方法中的示例。
- 参数:
src (int) – 源工作进程的 rank。
- 关键字参数:
- reduce(dst, op=None, async_op=False, return_premature=False, group=None) None ¶
在所有机器上归约 TensorDict。
只有具有
rank
dst 的进程才能接收最终结果。
- refine_names(*names) T ¶
根据名称精炼 self 的维度名称。
精炼是重命名的特殊情况,它“提升”未命名维度。None 维度可以精炼为任何名称;已命名维度只能精炼为相同名称。
由于命名张量可以与未命名张量共存,因此细化名称提供了一种很好的方式来编写既适用于命名张量又适用于未命名张量的命名张量感知代码。
names
可以包含最多一个 Ellipsis (...)。Ellipsis 会贪婪地展开;它会就地展开以使names
的长度与 self.dim() 相同,方法是使用 self.names 的相应索引处的名称。Returns: 具有根据输入命名的维度的相同的 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,因为它是在forward()
调用后调用的。挂钩应具有以下签名hook(module, args, output) -> None or modified output
如果
with_kwargs
为True
,则 forward 挂钩将获得传递给 forward 函数的kwargs
,并应返回可能已修改的输出。挂钩应具有以下签名hook(module, args, kwargs, output) -> None or modified output
- 参数:
hook (Callable) – 用户定义的待注册钩子。
prepend (bool) – 如果为
True
,则提供的hook
将在对此torch.nn.Module
的所有现有forward
挂钩之前触发。否则,提供的hook
将在此torch.nn.Module
的所有现有forward
挂钩之后触发。请注意,通过register_module_forward_hook()
注册的全局forward
挂钩将在通过此方法注册的所有挂钩之前触发。默认值:False
with_kwargs (bool) – 如果为
True
,则hook
将获得传递给 forward 函数的 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 ¶
在模块上注册一个前向预钩子。
挂钩将在每次调用
forward()
之前被调用。如果
with_kwargs
为 false 或未指定,输入仅包含传递给模块的位置参数。关键字参数不会传递给挂钩,只传递给forward
。挂钩可以修改输入。用户可以返回一个元组或挂钩中的单个修改值。如果我们返回单个值(除非该值已经是元组),我们将该值包装到元组中。挂钩应具有以下签名hook(module, args) -> None or modified input
如果
with_kwargs
为 true,则 forward pre-hook 将获得传递给 forward 函数的 kwargs,并且如果挂钩修改了输入,则应同时返回 args 和 kwargs。挂钩应具有以下签名hook(module, args, kwargs) -> None or a tuple of modified input and kwargs
- 参数:
hook (Callable) – 用户定义的待注册钩子。
prepend (bool) – 如果为 true,则提供的
hook
将在对此torch.nn.Module
的所有现有forward_pre
挂钩之前触发。否则,提供的hook
将在此torch.nn.Module
的所有现有forward_pre
挂钩之后触发。请注意,通过register_module_forward_pre_hook()
注册的全局forward_pre
挂钩将在通过此方法注册的所有挂钩之前触发。默认值:False
with_kwargs (bool) – 如果为 true,则
hook
将获得传递给 forward 函数的 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]], prepend: bool = False) RemovableHandle ¶
在模块上注册一个反向传播钩子。
每次计算相对于模块的梯度时,将调用此钩子,其触发规则如下:
通常,钩子在计算相对于模块输入的梯度时触发。
如果模块输入都不需要梯度,则在计算相对于模块输出的梯度时触发钩子。
如果模块输出都不需要梯度,则钩子将不触发。
钩子应具有以下签名
hook(module, grad_input, grad_output) -> tuple(Tensor) or None
grad_input
和grad_output
是包含相对于输入和输出的梯度的元组。挂钩不应修改其参数,但可以有选择地返回相对于输入的新的梯度,该梯度将在后续计算中用于替代grad_input
。grad_input
将仅对应于作为位置参数提供的输入,并且所有关键字参数都将被忽略。对于所有非 Tensor 参数,grad_input
和grad_output
中的条目将为None
。由于技术原因,当此钩子应用于模块时,其前向函数将接收传递给模块的每个张量的视图。类似地,调用者将接收模块前向函数返回的每个张量的视图。
警告
使用反向传播钩子时不允许就地修改输入或输出,否则将引发错误。
- 参数:
hook (Callable) – 要注册的用户定义钩子。
prepend (bool) – 如果为 true,则提供的
hook
将在对此torch.nn.Module
的所有现有backward
挂钩之前触发。否则,提供的hook
将在此torch.nn.Module
的所有现有backward
挂钩之后触发。请注意,通过register_module_full_backward_hook()
注册的全局backward
挂钩将在通过此方法注册的所有挂钩之前触发。
- 返回:
一个句柄,可用于通过调用
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 ¶
在模块上注册一个反向预钩子。
每次计算模块的梯度时,将调用此钩子。钩子应具有以下签名
hook(module, grad_output) -> tuple[Tensor] or None
grad_output
是一个元组。挂钩不应修改其参数,但可以有选择地返回相对于输出的新梯度,该梯度将在后续计算中用于替代grad_output
。对于所有非 Tensor 参数,grad_output
中的条目将为None
。由于技术原因,当此钩子应用于模块时,其前向函数将接收传递给模块的每个张量的视图。类似地,调用者将接收模块前向函数返回的每个张量的视图。
警告
使用反向传播钩子时不允许就地修改输入,否则将引发错误。
- 参数:
hook (Callable) – 要注册的用户定义钩子。
prepend (bool) – 如果为 true,则提供的
hook
将在对此torch.nn.Module
的所有现有backward_pre
挂钩之前触发。否则,提供的hook
将在此torch.nn.Module
的所有现有backward_pre
挂钩之后触发。请注意,通过register_module_full_backward_pre_hook()
注册的全局backward_pre
挂钩将在通过此方法注册的所有挂钩之前触发。
- 返回:
一个句柄,可用于通过调用
handle.remove()
来移除添加的钩子- 返回类型:
torch.utils.hooks.RemovableHandle
- register_get_post_hook(hook)¶
注册一个挂钩,在任何 get 操作发生在叶张量之后调用。
- register_load_state_dict_post_hook(hook)¶
注册一个后钩子,用于在模块的
load_state_dict()
被调用后运行。- 它应该具有以下签名:
hook(module, incompatible_keys) -> None
module
参数是当前注册此挂钩的模块,incompatible_keys
参数是一个NamedTuple
,由missing_keys
和unexpected_keys
属性组成。missing_keys
是一个包含缺失键的list
,unexpected_keys
是一个包含意外键的list
。如果需要,可以就地修改给定的 incompatible_keys。
请注意,当以
strict=True
调用load_state_dict()
时执行的检查会受到挂钩对missing_keys
或unexpected_keys
所做修改的影响,正如预期的那样。向任一键集添加键将导致在strict=True
时引发错误,清空缺失和意外键将避免错误。- 返回:
一个句柄,可用于通过调用
handle.remove()
来移除添加的钩子- 返回类型:
torch.utils.hooks.RemovableHandle
- register_load_state_dict_pre_hook(hook)¶
注册一个预钩子,用于在模块的
load_state_dict()
被调用之前运行。- 它应该具有以下签名:
hook(module, state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs) -> None # noqa: B950
- 参数:
hook (Callable) – 在加载状态字典之前将调用的可调用钩子。
- 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()
方法注册一个后挂钩。- 它应该具有以下签名:
hook(module, state_dict, prefix, local_metadata) -> None
注册的钩子可以就地修改
state_dict
。
- register_state_dict_pre_hook(hook)¶
为
state_dict()
方法注册一个前挂钩。- 它应该具有以下签名:
hook(module, prefix, keep_vars) -> None
注册的钩子可用于在进行
state_dict
调用之前执行预处理。
- rename(*names, **rename_map)¶
返回一个克隆的 TensorDict,其中维度已重命名。
示例
>>> td = TensorDict({}, batch_size=[1, 2, 3 ,4]) >>> td.names = list("abcd") >>> td_rename = td.rename(c="g") >>> assert td_rename.names == list("abgd")
- rename_(*names, **rename_map)¶
与
rename()
相同,但执行原地重命名。示例
>>> td = TensorDict({}, batch_size=[1, 2, 3 ,4]) >>> td.names = list("abcd") >>> assert td.rename_(c="g") >>> assert td.names == list("abgd")
- rename_key_(old_key: NestedKey, new_key: NestedKey, safe: bool = False) TensorDictBase ¶
用新字符串重命名一个键,并返回具有更新后的键名的相同 TensorDict。
- repeat(*repeats: int) TensorDictBase ¶
沿指定维度重复此张量。
与
expand()
不同,此函数会复制张量的数据。警告
repeat()
的行为与repeat()
不同,但与numpy.tile()
更相似。对于类似于numpy.repeat()
的操作,请参阅repeat_interleave()
。- 参数:
repeat (torch.Size, int..., tuple of int 或 list of 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, optional) – 重复值的维度。默认情况下,使用扁平化的输入数组,并返回扁平化的输出数组。
- 关键字参数:
output_size (int, optional) – 给定轴的总输出大小(例如,重复的总和)。如果给出,它将避免计算 tensordict 输出形状所需的流同步。
- 返回:
重复的 TensorDict,其形状与输入相同,除了在给定轴上。
示例
>>> import torch >>> >>> from tensordict import TensorDict >>> >>> td = TensorDict( ... { ... "a": torch.randn(3, 4, 5), ... "b": TensorDict({ ... "c": torch.randn(3, 4, 10, 1), ... "a string": "a string!", ... }, batch_size=[3, 4, 10]) ... }, batch_size=[3, 4], ... ) >>> print(td.repeat_interleave(2, dim=0)) TensorDict( fields={ a: Tensor(shape=torch.Size([6, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ a string: NonTensorData(data=a string!, batch_size=torch.Size([6, 4, 10]), device=None), c: Tensor(shape=torch.Size([6, 4, 10, 1]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([6, 4, 10]), device=None, is_shared=False)}, batch_size=torch.Size([6, 4]), device=None, is_shared=False)
- replace(*args, **kwargs)¶
创建 TensorDict 的浅拷贝,其中条目已被替换。
接受一个无名参数,该参数必须是
TensorDictBase
子类的字典。此外,一级条目可以用命名关键字参数进行更新。- 返回:
如果输入非空,则返回
self
的副本,其中包含已更新的条目。如果未提供空字典或未提供字典,且 kwargs 为空,则返回self
。
- requires_grad_(requires_grad=True) T ¶
更改 autograd 是否应记录此张量上的操作:就地设置此张量的 requires_grad 属性。
返回此 TensorDict。
- 参数:
requires_grad (bool, optional) – autograd 是否应记录此 tensordict 上的操作。默认为
True
。
- reshape(*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()
值。
- rsub(other: tensordict.base.TensorDictBase | torch.Tensor | float, *, alpha: float | None = None, default: str | torch.Tensor | None = None)¶
从
self
中减去self
与 other 的差值,并按alpha
进行缩放。\[\text{{out}}_i = \text{{input}}_i - \text{{alpha}} \times \text{{other}}_i\]支持广播、类型提升以及整数、浮点数和复数输入。
- 参数:
other (TensorDict, Tensor 或 Number) – 要从
self
中减去的张量或数字。- 关键字参数:
alpha (Number) –
other
的乘数。default (torch.Tensor or str, optional) – the default value to use for exclusive entries. If none is provided, the two tensordicts key list must match exactly. If
default="intersection"
is passed, only the intersecting key sets will be considered and other keys will be ignored. In all other cases,default
will be used for all missing entries on both sides of the operation.
- save(prefix: Optional[str] = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False) T ¶
将tensordict保存到磁盘。
This function is a proxy to
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都发生变化。
- 参数:
- 返回:
一个新的 tensordict(如果
inplace=True
则为同一 tensordict),仅包含选定的键。
注意
要选择 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) – 应将内容发送到的目标工作进程的 rank。
- 关键字参数:
示例
>>> 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://: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://: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, 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, 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
对象。返回: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 – 要查找的子模块的完全限定字符串名称。(要指定完全限定字符串,请参阅上面的示例。)
module – 要设置子模块的对象。
strict – 如果为
False
,则该方法将替换现有子模块,或在父模块存在时创建一个新的子模块。如果为True
,则该方法将只尝试替换现有子模块,如果子模块尚不存在,则会引发错误。
- 抛出:
ValueError – 如果
target
字符串为空,或module
不是nn.Module
的实例。AttributeError – 如果沿
target
字符串产生的路径中的任何一点,(子)路径解析为不存在的属性名或不是nn.Module
实例的对象。
- setdefault(key: NestedKey, default: Tensor, inplace: bool = False) Tensor ¶
如果
key
不在 tensordict 中,则使用default
值插入key
条目。如果
key
在 tensordict 中,则返回key
的值,否则返回default
。- 参数:
key (str 或 nested key) – 值的名称。
default (torch.Tensor or compatible type, TensorDictBase) – 如果键不存在,则存储在 tensordict 中的值。
- 返回:
tensordict 中 key 的值。如果 key 之前未设置,则为 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 或 int 元组) – 将在其上计算 softmax 的 tensordict 维度。
dtype (torch.dtype, optional) – 返回张量的所需数据类型。如果指定,将在执行操作之前将输入张量转换为 dtype。这有助于防止数据类型溢出。
- property sorted_keys: list[tensordict._nestedkey.NestedKey]¶
按字母顺序返回键。
不支持其他参数。
如果 TensorDict 被锁定,键将被缓存,直到 TensorDict 解锁以获得更快的执行。
- split(split_size: int | list[int], dim: int = 0) list[tensordict.base.TensorDictBase] ¶
像 torch.split 一样,使用指定的尺寸在给定维度上分割 TensorDict 中的每个张量。
返回一个包含分割块视图的
TensorDict
实例列表。- 参数:
- 返回:
一个具有给定维度中指定尺寸的 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, optional) – 如果为
True
,则键将就地从self
中移除。默认为False
。default (Any, 可选) – 当 key 丢失时要返回的值。如果未指定且
strict=True
,则会引发异常。strict (bool, optional) – 如果为
True
,则当键缺失时会引发异常。默认为True
。reproduce_struct (bool, optional) – 如果为
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: int = 0, *, out=None)¶
沿给定维度将 tensordicts 堆叠成一个单一的 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, optional) – 条目应堆叠的维度。
- 关键字参数:
sorted (bool or list of NestedKeys) – 如果为
True
,则条目将按字母顺序堆叠。如果为False
(默认),则使用字典顺序。或者,可以提供键名列表,并相应地堆叠张量。这会产生一些开销,因为键列表将与 tensordict 中的叶子名称列表进行检查。out (torch.Tensor, optional) – 用于堆叠操作的可选目标张量。
- 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, optional) – 如果提供,tensordict 的状态将更新到 dict 中,并返回相同的对象。否则,将创建一个
OrderedDict
并返回。默认值:None
。prefix (str, optional) – 添加到张量名称以构成 state_dict 中的键的前缀。默认值:
''
。keep_vars (bool, optional) – 默认情况下,state_dict 中返回的
torch.Tensor
项已与 autograd 分离。如果设置为True
,则不会进行分离。默认值:False
。flatten (bool, optional) – 是否应使用
"."
字符展平结构。默认为False
。
示例
>>> data = TensorDict({"1": 1, "2": 2, "3": {"3": 3}}, []) >>> sd = data.state_dict() >>> print(sd) OrderedDict([('1', tensor(1)), ('2', tensor(2)), ('3', OrderedDict([('3', tensor(3)), ('__batch_size', torch.Size([])), ('__device', None)])), ('__batch_size', torch.Size([])), ('__device', None)]) >>> sd = data.state_dict(flatten=True) OrderedDict([('1', tensor(1)), ('2', tensor(2)), ('3.3', tensor(3)), ('__batch_size', torch.Size([])), ('__device', None)])
- std(dim: Union[int, Tuple[int], Literal['feature']] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, correction: int = 1, reduce: Optional[bool] = None) tensordict.base.TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有元素的标准差值。
- 参数:
dim (int, tuple of int, optional) – 如果为
None
,则返回一个无量纲的 tensordict,其中包含所有叶子的总和值(如果可以计算)。如果为整数或整数元组,则在指定维度上调用 std,前提是该维度与 tensordict 的形状兼容。目前只允许 “feature” 字符串。使用 dim=”feature” 将在所有特征维度上进行约简。如果 reduce=True,则返回一个形状与 TensorDict 的 batch-size 相同的张量。否则,将返回一个与self
结构相同的新的 tensordict,但具有约简的特征维度。keepdim (bool) – 输出张量是否保留维度。
- 关键字参数:
示例
>>> 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)¶
将
other
乘以alpha
后,从self
中减去。\[\text{{out}}_i = \text{{input}}_i - \text{{alpha}} \times \text{{other}}_i\]支持广播、类型提升以及整数、浮点数和复数输入。
- 参数:
other (TensorDict, Tensor 或 Number) – 要从
self
中减去的张量或数字。- 关键字参数:
alpha (Number) –
other
的乘数。default (torch.Tensor or str, optional) – the default value to use for exclusive entries. If none is provided, the two tensordicts key list must match exactly. If
default="intersection"
is passed, only the intersecting key sets will be considered and other keys will be ignored. In all other cases,default
will be used for all missing entries on both sides of the operation.
- 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) – 输出张量是否保留维度。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回张量的所需数据类型。如果指定,将在执行操作之前将输入张量转换为 dtype。这对于防止数据类型溢出很有用。默认值:
None
。reduce (bool, optional) – if
True
, the reduction will occur across all TensorDict values and a single reduced tensor will be returned。Defaults toFalse
。
示例
>>> 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 不会绑定到只包含单一 tensor dtype。
- 参数:
device (torch.device, optional) – tensordict 的目标设备。
dtype (torch.dtype, optional) – tensordict 的所需的浮点或复数 dtype。
tensor (torch.Tensor, optional) – 其 dtype 和 device 是此 TensorDict 中所有张量所需 dtype 和 device 的张量。
- 关键字参数:
non_blocking (bool, optional) – 操作是否应该是阻塞的。
memory_format (torch.memory_format, optional) – 此 tensordict 中 4D 参数和缓冲区的所需内存格式。
batch_size (torch.Size, optional) – 输出 tensordict 的结果批次大小。
other (TensorDictBase, optional) –
TensorDict 实例,其 dtype 和 device 是该 TensorDict 中所有张量的目标 dtype 和 device。
注意
由于
TensorDictBase
实例没有 dtype,因此 dtype 从示例叶子中收集。如果存在多个 dtype,则不执行任何 dtype 转换。non_blocking_pin (bool, optional) –
如果为
True
,则张量在发送到设备之前会被 pinned。这将异步进行,但可以通过num_threads
参数进行控制。注意
调用
tensordict.pin_memory().to("cuda")
通常比tensordict.to("cuda", non_blocking_pin=True)
慢得多,因为在后一种情况下,pin_memory 是异步调用的。如果张量大且数量多,多线程pin_memory
通常会很有益:如果张量数量太少,以至于无法发送,则生成线程和收集数据的开销会超过多线程的好处,而如果张量很小,则遍历长列表的开销也过大。num_threads (int or None, optional) – 如果
non_blocking_pin=True
,则用于pin_memory
的线程数。默认情况下,将生成max(1, torch.get_num_threads())
个线程。num_threads=0
将取消 pin_memory() 调用中的任何多线程。inplace (bool, optional) – 如果为
True
,则数据将在同一 tensordict 中就地写入。当构建 tensordict 是 CPU 开销密集型时,这可以显著提高速度。默认为False
。
- 返回:
如果设备与 tensordict 设备不同和/或传递了 dtype,则为新的 tensordict 实例。否则,为相同的 tensordict。
batch_size
的修改是就地进行的。
注意
如果 TensorDict 是合并的,结果 TensorDict 也将是合并的。每个新张量都是映射到目标设备的合并存储的视图。
示例
>>> data = TensorDict({"a": 1.0}, [], device=None) >>> data_cuda = data.to("cuda:0") # casts to cuda >>> data_int = data.to(torch.int) # casts to int >>> data_cuda_int = data.to("cuda:0", torch.int) # multiple casting >>> data_cuda = data.to(torch.randn(3, device="cuda:0")) # using an example tensor >>> data_cuda = data.to(other=TensorDict({}, [], device="cuda:0")) # using a tensordict example
- to_dict(*, retain_none: bool = True, convert_tensors: bool = False, tolist_first: bool = False) dict[str, Any] ¶
返回一个键值对与 tensordict 匹配的字典。
- 参数:
- 返回:
tensordict 的字典表示。
另请参阅
示例
>>> import torch >>> from tensordict import TensorDict >>> >>> td = TensorDict( ... a=torch.arange(24).view(2, 3, 4), ... b=TensorDict(c=torch.arange(12).reshape(2, 3, 2), batch_size=(2, 3, 2)), ... batch_size=(2, 3) ... ) >>> print(td.to_dict()) {'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]]]), ‘b’: {‘c’: tensor([[[ 0, 1], [ 2, 3], [ 4, 5]],
- [[ 6, 7],
[ 8, 9], [10, 11]]])}}
>>> print(td.to_dict(convert_tensors=True)) {'a': [[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]], 'b': {'c': [[[0, 1], [2, 3], [4, 5]], [[6, 7], [8, 9], [10, 11]]]}}
- to_empty(*, device: Optional[Union[int, str, device]], recurse: bool = True) Self ¶
将参数和缓冲区移动到指定设备,而不复制存储。
- 参数:
device (
torch.device
) – 此模块中的参数和缓冲区的期望设备。recurse (布尔) – 子模块的参数和缓冲区是否应递归地移动到指定设备。
- 返回:
self
- 返回类型:
模块
- to_h5(filename, **kwargs)¶
将 tensordict 转换为具有 h5 后端的 PersistentTensorDict。
- 参数:
filename (str 或 path) – h5 文件的路径。
**kwargs – 传递给
h5py.File.create_dataset()
的其他参数。
- 返回:
指向新创建文件的
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_lazystack(dim: int = 0)¶
将 TensorDict 转换为 LazyStackedTensorDict 或等价物。
注意
此方法可用于更改 LazyStackedTensorDict 的堆叠维度。例如,如果您有一个 stack_dim=1 的 LazyStackedTensorDict,您可以使用此方法将其更改为 stack_dim=0。
>>> td = TensorDict({"a": torch.zeros(2, 3), "b": torch.ones(2, 3)}, batch_size=(2, 3)) >>> td2 = td.to_lazystack() >>> td2.batch_size torch.Size([2, 3]) >>> assert isinstance(td2, LazyStackedTensorDict) >>> assert td2.stack_dim == 0 >>> td3 = td2.to_lazystack(1) >>> assert td3.stack_dim == 1 >>> td3.batch_size torch.Size([2, 3])
- 参数:
dim (int, optional) – 要堆叠 tensordict 的维度。默认为
0
。- 返回:
LazyStackedTensorDict 实例。
示例
>>> from tensordict import TensorDict >>> td = TensorDict({"a": torch.zeros(2, 3), "b": torch.ones(2, 3)}, batch_size=(2, 3)) >>> td2 = td.to_lazystack() >>> td2.batch_size torch.Size([2, 3]) >>> assert isinstance(td2, LazyStackedTensorDict)
- 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 (布尔, optional) – 如果为
True
,则会就地更新模块中的参数或张量。默认值为False
。return_swap (布尔, optional) – 如果为
True
,则会返回旧的参数配置。默认值为False
。swap_dest (TensorDictBase, optional) – 如果
return_swap
为True
,则为写入交换的目标 tensordict。use_state_dict (布尔, optional) – 如果为
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 转换为命名元组。
- 参数:
dest_cls (Type, optional) – 一个可选的命名元组类。
示例
>>> 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 (布尔) – 如果为
True
,则 tensorclass 实例中的None
值将被写入 tensordict。否则,它们将被丢弃。默认值:True
。- 返回:
包含相同值的新 TensorDict 对象。
- tolist(*, convert_nodes: bool = True, convert_tensors: bool = False, tolist_first: bool = False) List[Any] ¶
返回 tensordict 的嵌套列表表示。
如果 tensordict 没有批次维度,则此方法返回单个列表或字典。否则,它返回一个嵌套列表,其中每个内部列表代表一个批次维度。
- 参数:
- 返回:
tensordict 的嵌套列表表示。
示例
>>> import torch >>> from tensordict import TensorDict >>> >>> td = TensorDict( ... a=torch.arange(24).view(2, 3, 4), ... b=TensorDict(c=torch.arange(12).reshape(2, 3, 2), batch_size=(2, 3, 2)), ... batch_size=(2, 3) ... ) >>> print(td.tolist(tolist_first=True)) [[{'a': tensor([0, 1, 2, 3]), 'b': [{'c': tensor(0)}, {'c': tensor(1)}]}, {'a': tensor([4, 5, 6, 7]), 'b': [{'c': tensor(2)}, {'c': tensor(3)}]}, {'a': tensor([ 8, 9, 10, 11]), 'b': [{'c': tensor(4)}, {'c': tensor(5)}]}], [{'a': tensor([12, 13, 14, 15]), 'b': [{'c': tensor(6)}, {'c': tensor(7)}]}, {'a': tensor([16, 17, 18, 19]), 'b': [{'c': tensor(8)}, {'c': tensor(9)}]}, {'a': tensor([20, 21, 22, 23]), 'b': [{'c': tensor(10)}, {'c': tensor(11)}]}]] >>> print(td.tolist(tolist_first=False)) [[{'a': tensor([0, 1, 2, 3]), 'b': {'c': tensor([0, 1])}}, {'a': tensor([4, 5, 6, 7]), 'b': {'c': tensor([2, 3])}}, {'a': tensor([ 8, 9, 10, 11]), 'b': {'c': tensor([4, 5])}}], [{'a': tensor([12, 13, 14, 15]), 'b': {'c': tensor([6, 7])}}, {'a': tensor([16, 17, 18, 19]), 'b': {'c': tensor([8, 9])}}, {'a': tensor([20, 21, 22, 23]), 'b': {'c': tensor([10, 11])}}]] >>> print(td.tolist(convert_tensors=False)) [[{'a': [0, 1, 2, 3], 'b': [{'c': 0}, {'c': 1}]}, {'a': [4, 5, 6, 7], 'b': [{'c': 2}, {'c': 3}]}, {'a': [8, 9, 10, 11], 'b': [{'c': 4}, {'c': 5}]}], [{'a': [12, 13, 14, 15], 'b': [{'c': 6}, {'c': 7}]}, {'a': [16, 17, 18, 19], 'b': [{'c': 8}, {'c': 9}]}, {'a': [20, 21, 22, 23], 'b': [{'c': 10}, {'c': 11}]}]] >>> print(td.tolist(convert_nodes=False)) [[[tensor([0, 1, 2, 3]), TensorDict( fields={ c: Tensor(shape=torch.Size([2]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([2]), device=None, is_shared=False)], [tensor([4, 5, 6, 7]), TensorDict( fields={ c: Tensor(shape=torch.Size([2]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([2]), device=None, is_shared=False)], [tensor([ 8, 9, 10, 11]), TensorDict( fields={ c: Tensor(shape=torch.Size([2]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([2]), device=None, is_shared=False)]], [[tensor([12, 13, 14, 15]), TensorDict( fields={ c: Tensor(shape=torch.Size([2]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([2]), device=None, is_shared=False)], [tensor([16, 17, 18, 19]), TensorDict( fields={ c: Tensor(shape=torch.Size([2]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([2]), device=None, is_shared=False)], [tensor([20, 21, 22, 23]), TensorDict( fields={ c: Tensor(shape=torch.Size([2]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([2]), device=None, is_shared=False)]]]
- train(mode: bool = True) Self ¶
将模块设置为训练模式。
这只对某些模块有影响。有关模块在训练/评估模式下的行为,即它们是否受影响,请参阅特定模块的文档,例如
Dropout
、BatchNorm
等。- 参数:
mode (布尔) – 设置为训练模式(
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 实例。嵌套 tensordicts 的元数据将从根推断:数据树中的所有实例将共享相同的批次大小、维度名称和设备。
- 参数:
示例
>>> 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)
This method and
unflatten_keys()
are particularly useful when handling state-dicts, as they make it possible to seamlessly convert flat dictionaries into data structures that mimic the structure of the model。示例
>>> 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 之间的维度扩展所有张量,并将它们返回到一个新的 tensordict 中。
- 参数:
dim (int) – 要扩展的维度
示例
>>> 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, update_batch_size: bool = False, ignore_lock: bool = False) TensorDictBase ¶
使用来自字典或其他 TensorDict 的值来更新 TensorDict。
警告
update 在 try/except 块中调用时会损坏数据。不要在这些块中使用此方法来尝试捕获和修补执行过程中发生的错误。
- 参数:
input_dict_or_td (TensorDictBase 或 dict) – 要写入 self 的输入数据。
clone (布尔, optional) – 在设置之前是否应克隆输入(张量)字典中的张量。默认为
False
。inplace (布尔, optional) – 如果为
True
且某个键与 tensordict 中的现有键匹配,则更新将在该键值对上就地进行。如果找不到该条目,则会将其添加。默认为False
。
- 关键字参数:
keys_to_update (NestedKeys 序列, optional) – 如果提供,则仅更新
key_to_update
中的键列表。此操作旨在避免调用data_dest.update(data_src.select(*keys_to_update))
。non_blocking (bool, optional) – 如果为
True
且此副本在不同设备之间,则复制可能相对于主机是异步的。is_leaf (Callable[[Type], bool], optional) –
一个指示对象类型是应被视为叶子节点并被交换,还是应被视为张量集合的可调用对象。
另请参阅
update_batch_size (布尔, optional) –
如果为
True
,则update
将尝试更新目标(self)的批处理大小,如果它与源的批处理大小不匹配。默认为False
。注意
当批处理大小不匹配时,
LazyStackTensorDict
实例将被清空其内容,并使用来自源的 tensordicts 的副本重新填充容器。注意
此参数假定 keys_to_update 为空,并且 inplace=False。如果目标(self)的键不是源键的子集,则会引发异常,因为 TensorDict 将无法推断如何处理额外的目标条目。
ignore_lock (布尔, optional) – 如果为
True
,则任何 tensordict 都可以更新,无论其锁定状态如何。默认为 False。
注意
当使用具有 N 个元素的
LazyStackedTensorDict
更新另一个具有 M 个元素的LazyStackedTensorDict
(沿堆叠维度)时,update
方法会将额外 tensordicts 的副本附加到目标(self)的 lazy stack。这允许用户依赖update
来渐进式地增加 lazy stacks。- 返回:
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 (布尔, optional) – 在设置之前是否应克隆输入(张量)字典中的张量。默认为
False
。
- 关键字参数:
keys_to_update (NestedKeys 序列, optional) – 如果提供,则仅更新
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 (布尔, optional) – 在设置之前是否应克隆输入(张量)字典中的张量。默认为
False
。
- 关键字参数:
keys_to_update (NestedKeys序列, 可选) – 如果提供,将仅更新
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 (布尔值, 可选) – 如果为
True
,则返回嵌套值。默认为False
。leaves_only (布尔值, 可选) – 如果为
False
,则仅返回叶子。默认为False
。is_leaf (callable, optional) –
一个作用于类类型的可调用对象,返回一个布尔值,指示该类是否应被视为叶子节点。
注意
The purpose of is_leaf is not to prevent recursive calls into nested tensordicts, but rather to mark certain types as “leaves” for the purpose of filtering when leaves_only=True。Even if is_leaf(cls) returns True, the nested structure of the tensordict will still be traversed if include_nested=True。In other words, is_leaf does not control the recursion depth, but rather provides a way to filter out certain types from the result when leaves_only=True。This means that a node in the tree can be both a leaf and a node with children。In practice, the default value of
is_leaf
does exclude tensordict and tensorclass instances from the leaf set。另请参阅
- 关键字参数:
sort (布尔值, 可选) – 键是否应排序。对于嵌套键,键根据其连接名称进行排序(即,
("a", "key")
在排序时将被计为"a.key"
)。请注意,排序可能会给处理大型 tensordicts 带来显著的开销。默认为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,其中包含所有叶子的总和值(如果可以计算)。如果为整数或整数元组,则在指定维度上调用 var,前提是该维度与 tensordict 的形状兼容。目前只允许 “feature” 字符串。使用 dim=”feature” 将实现跨所有特征维度的约简。如果 reduce=True,则返回一个与 TensorDict 的批处理大小形状相同的张量。否则,将返回一个结构与self
相同的、具有约简特征维度的新 tensordict。keepdim (bool) – 输出张量是否保留维度。
- 关键字参数:
示例
>>> 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,则可以使用此关键字参数重置批处理大小。如果
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: Tensor, other: torch.Tensor | tensordict.base.TensorDictBase, *, out: tensordict.base.TensorDictBase | None = None, pad: int | bool = None, update_batch_size: bool = False)¶
根据 condition 从 self 或 other 中选择元素,并返回一个
TensorDict
。- 参数:
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
,即不允许缺失的键。update_batch_size (布尔, optional) – 如果为
True
且提供了out
,则输出的批处理大小将更新为匹配条件的批处理大小。默认为False
。
- xpu(device: Optional[Union[device, int]] = None) Self ¶
将所有模型参数和缓冲区移动到 XPU。
这也会使关联的参数和缓冲区成为不同的对象。因此,如果模块在优化时将驻留在 XPU 上,则应在构建优化器之前调用它。
注意
此方法就地修改模块。
- 参数:
device (int, optional) – 如果指定,所有参数都将复制到该设备
- 返回:
self
- 返回类型:
模块
- zero_() T ¶
原地将 tensordict 中的所有张量清零。