def __init__( self, spatial_dims: int, in_channels: int, out_channels: int, strides: Union[Sequence[int], int] = 1, kernel_size: Union[Sequence[int], int] = 3, adn_ordering: str = "NDA", act: Optional[Union[Tuple, str]] = "PRELU", norm: Optional[Union[Tuple, str]] = "INSTANCE", dropout: Optional[Union[Tuple, str, float]] = None, dropout_dim: Optional[int] = 1, dilation: Union[Sequence[int], int] = 1, groups: int = 1, bias: bool = True, conv_only: bool = False, is_transposed: bool = False, padding: Optional[Union[Sequence[int], int]] = None, output_padding: Optional[Union[Sequence[int], int]] = None, dimensions: Optional[int] = None, ) -> None: super().__init__() self.dimensions = spatial_dims if dimensions is None else dimensions self.in_channels = in_channels self.out_channels = out_channels self.is_transposed = is_transposed if padding is None: padding = same_padding(kernel_size, dilation) conv_type = Conv[Conv.CONVTRANS if is_transposed else Conv.CONV, self.dimensions] conv: nn.Module if is_transposed: if output_padding is None: output_padding = stride_minus_kernel_padding(1, strides) conv = conv_type( in_channels, out_channels, kernel_size=kernel_size, stride=strides, padding=padding, output_padding=output_padding, groups=groups, bias=bias, dilation=dilation, ) else: conv = conv_type( in_channels, out_channels, kernel_size=kernel_size, stride=strides, padding=padding, dilation=dilation, groups=groups, bias=bias, ) self.add_module("conv", conv) if not conv_only: self.add_module( "adn", ADN( ordering=adn_ordering, in_channels=out_channels, act=act, norm=norm, norm_dim=self.dimensions, dropout=dropout, dropout_dim=dropout_dim, ), )
def __init__( self, dimensions: int, in_channels: int, out_channels: int, strides: Union[Sequence[int], int] = 1, kernel_size: Union[Sequence[int], int] = 3, act: Optional[Union[Tuple, str]] = Act.PRELU, norm: Union[Tuple, str] = Norm.INSTANCE, dropout: Optional[Union[Tuple, str, float]] = None, dropout_dim: int = 1, dilation: Union[Sequence[int], int] = 1, groups: int = 1, bias: bool = True, conv_only: bool = False, is_transposed: bool = False, padding: Optional[Union[Sequence[int], int]] = None, output_padding: Optional[Union[Sequence[int], int]] = None, ) -> None: super().__init__() self.dimensions = dimensions self.in_channels = in_channels self.out_channels = out_channels self.is_transposed = is_transposed if not padding: padding = same_padding(kernel_size, dilation) conv_type = Conv[Conv.CONVTRANS if is_transposed else Conv.CONV, dimensions] # define the normalisation type and the arguments to the constructor if norm is not None: norm_name, norm_args = split_args(norm) norm_type = Norm[norm_name, dimensions] else: norm_type = norm_args = None # define the activation type and the arguments to the constructor if act is not None: act_name, act_args = split_args(act) act_type = Act[act_name] else: act_type = act_args = None if dropout: # if dropout was specified simply as a p value, use default name and make a keyword map with the value if isinstance(dropout, (int, float)): drop_name = Dropout.DROPOUT drop_args = {"p": dropout} else: drop_name, drop_args = split_args(dropout) if dropout_dim > dimensions: raise ValueError( f"dropout_dim should be no larger than dimensions, got dropout_dim={dropout_dim} and dimensions={dimensions}." ) drop_type = Dropout[drop_name, dropout_dim] if is_transposed: if not output_padding: output_padding = stride_minus_kernel_padding(1, strides) conv = conv_type( in_channels, out_channels, kernel_size=kernel_size, stride=strides, padding=padding, output_padding=output_padding, groups=groups, bias=bias, dilation=dilation, ) else: conv = conv_type( in_channels, out_channels, kernel_size=kernel_size, stride=strides, padding=padding, dilation=dilation, groups=groups, bias=bias, ) self.add_module("conv", conv) if not conv_only: if norm is not None: self.add_module("norm", norm_type(out_channels, **norm_args)) if dropout: self.add_module("dropout", drop_type(**drop_args)) if act is not None: self.add_module("act", act_type(**act_args))