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.
SEResNetis very similar toResNet, 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.
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) ) )