TensorDictBase.flatten_keys#
- TensorDictBase.flatten_keys(separator: str = '.', inplace: bool = False, is_leaf: Callable[[Type], bool] | None = None) Self#
Converts a nested tensordict into a flat one, recursively.
The TensorDict type will be lost and the result will be a simple TensorDict instance.
- Parameters:
separator (str, optional) – the separator between the nested items.
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) – a function that takes a class and returns
Trueif values of that class count as leaves. Here it stops the flattening: a sub-tensordict whose class is a leaf is kept as one value under its key. By default, tensordicts and tensorclasses are not leaves. Seeis_leaf_nontensor()anddefault_is_leaf().
Examples
>>> import torch >>> from tensordict import TensorDict >>> 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.Examples
>>> 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(".")))
Every tensordict class and every tensorclass has this method. For the other methods, see Methods by task.