clinicadl.networks.nn.SEResNet

class clinicadl.networks.nn.SEResNet(spatial_dims: int, in_channels: int, num_outputs: int | None, se_reduction: int = 16, **kwargs: Any) None[source]

Squeeze-and-Excitation ResNet, based on Squeeze-and-Excitation Networks.

SEResNet is very similar to ResNet, except that Squeeze-and-Excitation blocks are added before residual connections.

Works with 2D or 3D images (with additional batch and channel dimensions).

Parameters:
  • spatial_dims (int) – Number of spatial dimensions of the input image.

  • in_channels (int) – Number of channels in the input image.

  • num_outputs (Optional[int]) – Number of output variables after the last linear layer. If None, the feature map before the last fully connected layer will be returned.

  • se_reduction (int, default=16) – Reduction ratio in the bottelneck layer of the excitation modules. Default to 16, as in the original paper.

  • kwargs (Any) – Any optional argument accepted by ResNet.

See also

torch.nn.Module

To see all the methods of this neural network.

ResNet

Examples

>>> SEResNet(
        spatial_dims=2,
        in_channels=1,
        num_outputs=2,
        block_type="basic",
        se_reduction=2,
        n_features=(8,),
        n_res_blocks=(2,),
        output_act="softmax",
        init_conv_size=5,
    )
SEResNet(
    (conv0): Conv2d(1, 8, kernel_size=(5, 5), stride=(2, 2), padding=(2, 2), bias=False)
    (norm0): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (act0): ReLU(inplace=True)
    (pool0): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    (layer1): Sequential(
        (0): SEResNetBlock(
            (conv1): Conv2d(8, 8, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
            (norm1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
            (act1): ReLU(inplace=True)
            (conv2): Conv2d(8, 8, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
            (norm2): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
            (se_layer): ChannelSELayer(
                (avg_pool): AdaptiveAvgPool2d(output_size=1)
                (fc): Sequential(
                    (0): Linear(in_features=8, out_features=4, bias=True)
                    (1): ReLU(inplace=True)
                    (2): Linear(in_features=4, out_features=8, bias=True)
                    (3): Sigmoid()
                )
            )
            (act2): ReLU(inplace=True)
        )
        (1): SEResNetBlock(
            (conv1): Conv2d(8, 8, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
            (norm1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
            (act1): ReLU(inplace=True)
            (conv2): Conv2d(8, 8, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
            (norm2): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
            (se_layer): ChannelSELayer(
                (avg_pool): AdaptiveAvgPool2d(output_size=1)
                (fc): Sequential(
                    (0): Linear(in_features=8, out_features=4, bias=True)
                    (1): ReLU(inplace=True)
                    (2): Linear(in_features=4, out_features=8, bias=True)
                    (3): Sigmoid()
                )
            )
            (act2): ReLU(inplace=True)
        )
    )
    (fc): Sequential(
        (pool): AdaptiveAvgPool2d(output_size=(1, 1))
        (flatten): Flatten(start_dim=1, end_dim=-1)
        (out): Linear(in_features=8, out_features=2, bias=True)
        (output_act): Softmax(dim=None)
    )
)