快捷方式

Composite

class torchrl.data.Composite(*args, **kwargs)[來源]

TensorSpecs 的組合。

如果 TensorSpec 是 Tensor 類別的集合描述,則 Composite 類別類似於 TensorDict 類別。 就像 TensorDict 一樣,它有一個 shape(類似於 TensorDictbatch_size)和一個可選的 device

參數:
  • *args – 如果傳遞了未命名的參數,它必須是一個字典,其鍵與 Composite 物件中預期找到的鍵相符。 這對於使用元組索引建立巢狀 CompositeSpecs 非常有用。

  • **kwargs (key (str) – value (TensorSpec)): 儲存的 tensorspecs 字典。 值可以為 None,在這種情況下,對於相應的張量,is_in 將被假定為 True,並且 project() 將不起作用。 spec.encode 不能用於遺失的值。

變數:
  • device (torch.device or None) – 如果未指定,composite spec 的裝置為 None(與 TensorDicts 的情況一樣)。 非 None 裝置約束所有葉節點必須為相同的裝置。 另一方面,None 裝置允許葉節點具有不同的裝置。 預設為 None

  • shape (torch.Size) – 所有葉節點的前導 shape。 相當於相應 tensordicts 的 batch-size。

範例

>>> pixels_spec = Bounded(
...     low=torch.zeros(4, 3, 32, 32),
...     high=torch.ones(4, 3, 32, 32),
...     dtype=torch.uint8
... )
>>> observation_vector_spec = Bounded(
...     low=torch.zeros(4, 33),
...     high=torch.ones(4, 33),
...     dtype=torch.float)
>>> composite_spec = Composite(
...     pixels=pixels_spec,
...     observation_vector=observation_vector_spec,
...     shape=(4,)
... )
>>> composite_spec
Composite(
    pixels: BoundedDiscrete(
        shape=torch.Size([4, 3, 32, 32]),
        space=ContinuousBox(
            low=Tensor(shape=torch.Size([4, 3, 32, 32]), device=cpu, dtype=torch.uint8, contiguous=True),
            high=Tensor(shape=torch.Size([4, 3, 32, 32]), device=cpu, dtype=torch.uint8, contiguous=True)),
        device=cpu,
        dtype=torch.uint8,
        domain=discrete),
    observation_vector: BoundedContinuous(
        shape=torch.Size([4, 33]),
        space=ContinuousBox(
            low=Tensor(shape=torch.Size([4, 33]), device=cpu, dtype=torch.float32, contiguous=True),
            high=Tensor(shape=torch.Size([4, 33]), device=cpu, dtype=torch.float32, contiguous=True)),
        device=cpu,
        dtype=torch.float32,
        domain=continuous),
    device=None,
    shape=torch.Size([4]))
>>> td = composite_spec.rand()
>>> td
TensorDict(
    fields={
        observation_vector: Tensor(shape=torch.Size([4, 33]), device=cpu, dtype=torch.float32, is_shared=False),
        pixels: Tensor(shape=torch.Size([4, 3, 32, 32]), device=cpu, dtype=torch.uint8, is_shared=False)},
    batch_size=torch.Size([4]),
    device=None,
    is_shared=False)
>>> # we can build a nested composite spec using unnamed arguments
>>> print(Composite({("a", "b"): None, ("a", "c"): None}))
Composite(
    a: Composite(
        b: None,
        c: None,
        device=None,
        shape=torch.Size([])),
    device=None,
    shape=torch.Size([]))
assert_is_in(value: Tensor) None

斷言張量是否屬於該範圍,否則引發例外。

參數:

value (torch.Tensor) – 要檢查的值。

clear_device_()[原始碼]

清除 Composite 的裝置。

clone() Composite[原始碼]

建立 TensorSpec 的副本。

contains(item: torch.Tensor | tensordict.base.TensorDictBase) bool

如果值 val 可能由 TensorSpec 產生,則傳回 True,否則傳回 False

有關更多資訊,請參閱 is_in()

cpu()

將 TensorSpec 轉換為 ‘cpu’ 裝置。

cuda(device=None)

將 TensorSpec 轉換為 ‘cuda’ 裝置。

property device: Union[device, str, int]

Spec 的裝置。

只有 Composite spec 可以具有 None 裝置。所有葉節點都必須具有非空的裝置。

empty()[原始碼]

建立一個類似 self 的 spec,但沒有任何條目。

encode(vals: Dict[str, Any], *, ignore_device: bool = False) Dict[str, Tensor][原始碼]

根據指定的 spec 編碼一個值,並傳回對應的張量。

此方法用於環境中,這些環境傳回一個可以輕鬆映射到 TorchRL 所需域的值(例如,一個 numpy 陣列)。如果該值已經是一個張量,則 spec 不會更改其值並按原樣傳回它。

參數:

val (np.ndarraytorch.Tensor) – 要編碼為張量的值。

關鍵字參數:

ignore_device (bool, optional) – 如果 True,則將忽略 spec 裝置。 這用於在呼叫 TensorDict(..., device="cuda") 中對張量轉換進行分組,這樣會更快。

傳回:

符合所需張量 specs 的 torch.Tensor。

expand(*shape)[原始碼]

傳回具有展開形狀的新 Spec。

參數:

*shape (tupleint 的可迭代物件) – Spec 的新形狀。必須與目前形狀可廣播:其長度必須至少與目前形狀長度一樣長,並且其最後的值也必須相容;也就是說,只有在目前的維度是單例時,它們才可以與之不同。

flatten(start_dim: int, end_dim: int) T

扁平化 TensorSpec

有關此方法的更多資訊,請檢查 flatten()

get(item, default=_NoDefault.ZERO)[原始碼]

從 Composite 取得一個項目。

如果該項目不存在,可以傳遞一個預設值。

classmethod implements_for_spec(torch_function: Callable) Callable

為 TensorSpec 註冊一個 torch function override。

abstract index(index: Union[int, Tensor, ndarray, slice, List], tensor_to_index: torch.Tensor | tensordict.base.TensorDictBase) torch.Tensor | tensordict.base.TensorDictBase

為輸入的 tensor 建立索引。

參數:
  • index (int, torch.Tensor, slicelist) – tensor 的索引

  • tensor_to_index – 要建立索引的 tensor

傳回:

已建立索引的 tensor

is_empty()[source]

確認 composite spec 是否包含 specs。

is_in(val: Union[dict, TensorDictBase]) bool[source]

如果值 val 可能由 TensorSpec 產生,則傳回 True,否則傳回 False

更精確地說,is_in 方法會檢查數值 val 是否在 space 屬性(這個框)定義的範圍內,以及 dtypedeviceshape 和可能的其他中繼資料是否與 spec 的中繼資料相符。如果任何一項檢查失敗,is_in 方法將會傳回 False

參數:

val (torch.Tensor) – 要檢查的值。

傳回:

布林值,表示值是否屬於 TensorSpec 框。

items(include_nested: bool = False, leaves_only: bool = False, *, is_leaf: Optional[Callable[[type], bool]] = None) _CompositeSpecItemsView[source]

Composite 的項目。

參數:
  • include_nested (bool, optional) – 如果 False,則傳回的鍵將不會是巢狀的。它們只會表示根目錄的直屬子系,而不是整個巢狀序列,也就是說,Composite(next=Composite(obs=None)) 將會產生鍵 ["next"]。預設值為 ``False`,也就是說,不會傳回巢狀鍵。

  • leaves_only (bool, optional) – 如果 False,則傳回的值將包含每個巢狀層級,也就是說,Composite(next=Composite(obs=None)) 將會產生鍵 ["next", ("next", "obs")]。預設值為 False

關鍵字參數:

is_leaf (callable, optional) – 讀取類型,並傳回一個布林值,表示該類型是否應視為葉節點。依預設,所有非 Composite 節點都會被視為葉節點。

keys(include_nested: bool = False, leaves_only: bool = False, *, is_leaf: Optional[Callable[[type], bool]] = None) _CompositeSpecKeysView[原始碼]

Composite 的鍵 (Keys)。

keys 參數反映了 tensordict.TensorDict 的鍵。

參數:
  • include_nested (bool, optional) – 如果 False,則傳回的鍵將不會是巢狀的。它們只會表示根目錄的直屬子系,而不是整個巢狀序列,也就是說,Composite(next=Composite(obs=None)) 將會產生鍵 ["next"]。預設值為 ``False`,也就是說,不會傳回巢狀鍵。

  • leaves_only (bool, optional) – 如果 False,則傳回的值將包含每個巢狀層級,也就是說,Composite(next=Composite(obs=None)) 將會產生鍵 ["next", ("next", "obs")]。預設值為 False

關鍵字參數:

is_leaf (callable, optional) – 讀取類型,並傳回一個布林值,表示該類型是否應視為葉節點。依預設,所有非 Composite 節點都會被視為葉節點。

lock_(recurse=False)[原始碼]

鎖定 Composite 並防止修改其內容。

除非透過 recurse 參數另行指定,否則這只是一個第一層級的鎖定。

葉節點 spec 始終可以在原地修改,但不能在其 Composite 父節點中被替換。

範例

>>> shape = [3, 4, 5]
>>> spec = Composite(
...         a=Composite(
...         b=Composite(shape=shape[:3], device="cpu"), shape=shape[:2]
...     ),
...     shape=shape[:1],
... )
>>> spec["a"] = spec["a"].clone()
>>> recurse = False
>>> spec.lock_(recurse=recurse)
>>> try:
...     spec["a"] = spec["a"].clone()
... except RuntimeError:
...     print("failed!")
failed!
>>> try:
...     spec["a", "b"] = spec["a", "b"].clone()
...     print("succeeded!")
... except RuntimeError:
...     print("failed!")
succeeded!
>>> recurse = True
>>> spec.lock_(recurse=recurse)
>>> try:
...     spec["a", "b"] = spec["a", "b"].clone()
...     print("succeeded!")
... except RuntimeError:
...     print("failed!")
failed!
make_neg_dim(dim: int) T

將特定維度轉換為 -1

property ndim

spec 形狀的維度數量。

len(spec.shape) 的快捷方式。

ndimension()[原始碼]

spec 形狀的維度數量。

len(spec.shape) 的快捷方式。

one(shape: Optional[Size] = None) torch.Tensor | tensordict.base.TensorDictBase

在盒 (box) 中返回一個填滿 1 的 tensor。

注意

即使不能保證 1 屬於 spec 域,當違反此條件時,此方法也不會引發異常。one 的主要用例是生成空的資料緩衝區,而不是有意義的資料。

參數:

shape (torch.Size) – one-tensor 的形狀

傳回:

一個在 TensorSpec 盒 (box) 中採樣,填滿 1 的 tensor。

ones(shape: Optional[Size] = None) torch.Tensor | tensordict.base.TensorDictBase

代理到 one()

project(val: TensorDictBase) TensorDictBase[原始碼]

如果輸入 tensor 不在 TensorSpec 盒 (box) 中,它會根據某些定義的啟發法將其映射回盒 (box) 中。

參數:

val (torch.Tensor) – 要映射到盒 (box) 的 tensor。

傳回:

屬於 TensorSpec 盒 (box) 的 torch.Tensor。

rand(shape: Optional[Size] = None) TensorDictBase[source]

傳回由規格 (spec) 定義的空間中的隨機張量。

除非空間是無界的,在這種情況下將繪製常態值,否則抽樣將在空間上均勻完成。

參數:

shape (torch.Size) – 隨機張量的形狀

傳回:

在 TensorSpec box 中抽樣的隨機張量。

reshape(*shape) T

重新塑形一個 TensorSpec

有關此方法的更多資訊,請參閱 reshape()

sample(shape: Optional[Size] = None) torch.Tensor | tensordict.base.TensorDictBase

傳回由規格 (spec) 定義的空間中的隨機張量。

有關詳細資訊,請參閱 rand()

squeeze(dim: Optional[int] = None)[source]

傳回一個新的 Spec,其中所有尺寸為 1 的維度都已被移除。

當給定 dim 時,squeeze 運算只會在該維度上執行。

參數:

dim (intNone) – 要將 squeeze 運算應用於的維度

to(dest: Union[dtype, device, str, int]) Composite[source]

將 TensorSpec 轉換為裝置 (device) 或資料類型 (dtype)。

如果未進行任何變更,則傳回相同的 spec。

to_numpy(val: TensorDict, safe: Optional[bool] = None) dict[source]

傳回輸入張量對應的 np.ndarray

這應該是 encode() 的反向操作。

參數:
  • val (torch.Tensor) – 要轉換為 numpy 的張量。

  • safe (bool) – 指示是否應根據 spec 的域對值執行檢查的布林值。預設為 CHECK_SPEC_ENCODE 環境變數的值。

傳回:

一個 np.ndarray。

type_check(value: Union[Tensor, TensorDictBase], selected_keys: Optional[Union[str, Sequence[str]]] = None)[source]

檢查輸入值 dtype 是否符合 TensorSpecdtype,如果不符合則引發例外。

參數:
  • value (torch.Tensor) – 需要檢查 dtype 的張量。

  • key (str, optional) – 如果 TensorSpec 有鍵,則會根據指定鍵所指向的 spec 來檢查 value 的 dtype。

unflatten(dim: int, sizes: Tuple[int]) T

TensorSpec 展開。

請檢查 unflatten() 以取得有關此方法的更多資訊。

unlock_(recurse=False)[source]

解鎖 Composite 並允許修改其內容。

這只是一個第一層的鎖定修改,除非通過 recurse 參數另行指定。

unsqueeze(dim: int)[source]

返回一個新的 Spec,其中包含一個額外的單例維度(位於 dim 指示的位置)。

參數:

dim (intNone) – 要將 unsqueeze 運算應用於的維度。

values(include_nested: bool = False, leaves_only: bool = False, *, is_leaf: Optional[Callable[[type], bool]] = None) _CompositeSpecValuesView[source]

Composite 的值。

參數:
  • include_nested (bool, optional) – 如果 False,則傳回的鍵將不會是巢狀的。它們只會表示根目錄的直屬子系,而不是整個巢狀序列,也就是說,Composite(next=Composite(obs=None)) 將會產生鍵 ["next"]。預設值為 ``False`,也就是說,不會傳回巢狀鍵。

  • leaves_only (bool, optional) – 如果 False,則傳回的值將包含每個巢狀層級,也就是說,Composite(next=Composite(obs=None)) 將會產生鍵 ["next", ("next", "obs")]。預設值為 False

關鍵字參數:

is_leaf (callable, optional) – 讀取類型,並傳回一個布林值,表示該類型是否應視為葉節點。依預設,所有非 Composite 節點都會被視為葉節點。

view(*shape) T

重新塑形一個 TensorSpec

有關此方法的更多資訊,請參閱 reshape()

zero(shape: Optional[Size] = None) TensorDictBase[source]

返回 box 中填滿零的張量。

注意

即使無法保證 0 屬於 spec 域,但當違反此條件時,此方法也不會引發例外。 zero 的主要用例是生成空的數據緩衝區,而不是有意義的數據。

參數:

shape (torch.Size) – 零張量的形狀

傳回:

在 TensorSpec box 中採樣的填滿零的張量。

zeros(shape: Optional[Size] = None) torch.Tensor | tensordict.base.TensorDictBase

Proxy to zero().

文件

存取 PyTorch 的綜合開發人員文件

檢視文件

教學課程

取得初學者和進階開發人員的深入教學課程

檢視教學課程

資源

尋找開發資源並獲得您問題的解答

檢視資源