Conv3dNet¶
- class torchrl.modules.Conv3dNet(in_features: int | None = None, depth: int | None = None, num_cells: Sequence[int] | int = None, kernel_sizes: Sequence[int] | int = 3, strides: Sequence[int] | int = 1, paddings: Sequence[int] | int = 0, activation_class: Type[nn.Module] | Callable = <class 'torch.nn.modules.activation.ELU'>, activation_kwargs: dict | List[dict] | None = None, norm_class: Type[nn.Module] | Callable | None = None, norm_kwargs: dict | List[dict] | None = None, bias_last_layer: bool = True, aggregator_class: Type[nn.Module] | Callable | None = <class 'torchrl.modules.models.utils.SquashDims'>, aggregator_kwargs: dict | None = None, squeeze_output: bool = False, device: DEVICE_TYPING | None = None)[source]¶
一个 3D 卷积神经网络。
- 参数:
in_features (int, 可选) – 输入特征的数量。如果未提供,将使用自动检索输入大小的懒惰实现。
depth (int, 可选) – 网络的深度。深度为
1
将产生一个具有所需输入大小的单个线性层网络,其输出大小等于num_cells
参数的最后一个元素。如果未指定depth
,则depth
信息应包含在num_cells
参数中(见下文)。如果num_cells
是一个可迭代对象并且指定了depth
,则两者必须匹配:len(num_cells)
必须等于depth
。num_cells (int 或 int 的序列, 可选) – 输入和输出之间每一层单元的数量。如果提供了一个整数,则每一层将具有相同的单元数量,深度将从
depth
中检索。如果提供了一个可迭代对象,则线性层out_features
将匹配 num_cells 的内容。默认为[32, 32, 32]
或[32] * depth` is depth is not ``None
。kernel_sizes (int, int 的序列, 可选) – 卷积网络的内核大小。如果可迭代,则长度必须匹配深度,由
num_cells
或 depth 参数定义。默认为3
。strides (int 或 int 的序列) – 卷积网络的步长。如果可迭代,则长度必须匹配深度,由
num_cells
或 depth 参数定义。默认为1
。activation_class (Type[nn.Module] or callable) – 要使用的激活类或构造函数。默认为
Tanh
.activation_kwargs (dict 或 dict 列表, 可选) – 要与激活类一起使用的 kwargs。还可以提供长度为
depth
的 kwargs 列表,每层一个元素。norm_class (Type 或 callable, 可选) – 如果有的话,归一化类。
norm_kwargs (dict 或 dict 列表, 可选) – 要与归一化层一起使用的 kwargs。还可以提供长度为
depth
的 kwargs 列表,每层一个元素。bias_last_layer (bool) – 如果
True
,则最后一个线性层将具有一个偏差参数。默认为True
。aggregator_class (Type[nn.Module] or callable) – 在链末尾要使用的聚合器类或构造函数。默认为
SquashDims
。aggregator_kwargs (dict, 可选) –
aggregator_class
构造函数的 kwargs。squeeze_output (bool) – 输出是否应该压缩其单例维度。默认为
False
。device (torch.device, 可选) – 创建模块的设备。
示例
>>> # All of the following examples provide valid, working MLPs >>> cnet = Conv3dNet(in_features=3, depth=1, num_cells=[32,]) >>> print(cnet) Conv3dNet( (0): Conv3d(3, 32, kernel_size=(3, 3, 3), stride=(1, 1, 1)) (1): ELU(alpha=1.0) (2): SquashDims() ) >>> cnet = Conv3dNet(in_features=3, depth=4, num_cells=32) >>> print(cnet) Conv3dNet( (0): Conv3d(3, 32, kernel_size=(3, 3, 3), stride=(1, 1, 1)) (1): ELU(alpha=1.0) (2): Conv3d(32, 32, kernel_size=(3, 3, 3), stride=(1, 1, 1)) (3): ELU(alpha=1.0) (4): Conv3d(32, 32, kernel_size=(3, 3, 3), stride=(1, 1, 1)) (5): ELU(alpha=1.0) (6): Conv3d(32, 32, kernel_size=(3, 3, 3), stride=(1, 1, 1)) (7): ELU(alpha=1.0) (8): SquashDims() ) >>> cnet = Conv3dNet(in_features=3, num_cells=[32, 33, 34, 35]) # defines the depth by the num_cells arg >>> print(cnet) Conv3dNet( (0): Conv3d(3, 32, kernel_size=(3, 3, 3), stride=(1, 1, 1)) (1): ELU(alpha=1.0) (2): Conv3d(32, 33, kernel_size=(3, 3, 3), stride=(1, 1, 1)) (3): ELU(alpha=1.0) (4): Conv3d(33, 34, kernel_size=(3, 3, 3), stride=(1, 1, 1)) (5): ELU(alpha=1.0) (6): Conv3d(34, 35, kernel_size=(3, 3, 3), stride=(1, 1, 1)) (7): ELU(alpha=1.0) (8): SquashDims() ) >>> cnet = Conv3dNet(in_features=3, num_cells=[32, 33, 34, 35], kernel_sizes=[3, 4, 5, (2, 3, 4)]) # defines kernels, possibly rectangular >>> print(cnet) Conv3dNet( (0): Conv3d(3, 32, kernel_size=(3, 3, 3), stride=(1, 1, 1)) (1): ELU(alpha=1.0) (2): Conv3d(32, 33, kernel_size=(4, 4, 4), stride=(1, 1, 1)) (3): ELU(alpha=1.0) (4): Conv3d(33, 34, kernel_size=(5, 5, 5), stride=(1, 1, 1)) (5): ELU(alpha=1.0) (6): Conv3d(34, 35, kernel_size=(2, 3, 4), stride=(1, 1, 1)) (7): ELU(alpha=1.0) (8): SquashDims() )