def __init__( self, in_shape: Sequence[int], out_shape: Sequence[int], channels: Sequence[int], strides: Sequence[int], kernel_size: Union[Sequence[int], int] = 3, num_res_units: int = 2, act=Act.PRELU, norm=Norm.INSTANCE, dropout: Optional[float] = None, bias: bool = True, ): """ Construct the regressor network with the number of layers defined by `channels` and `strides`. Inputs are first passed through the convolutional layers in the forward pass, the output from this is then pass through a fully connected layer to relate them to the final output tensor. Args: in_shape: tuple of integers stating the dimension of the input tensor (minus batch dimension) out_shape: tuple of integers stating the dimension of the final output tensor channels: tuple of integers stating the output channels of each convolutional layer strides: tuple of integers stating the stride (downscale factor) of each convolutional layer kernel_size: integer or tuple of integers stating size of convolutional kernels num_res_units: integer stating number of convolutions in residual units, 0 means no residual units act: name or type defining activation layers norm: name or type defining normalization layers dropout: optional float value in range [0, 1] stating dropout probability for layers, None for no dropout bias: boolean stating if convolution layers should have a bias component """ super().__init__() self.in_channels, *self.in_shape = ensure_tuple(in_shape) self.dimensions = len(self.in_shape) self.channels = ensure_tuple(channels) self.strides = ensure_tuple(strides) self.out_shape = ensure_tuple(out_shape) self.kernel_size = ensure_tuple_rep(kernel_size, self.dimensions) self.num_res_units = num_res_units self.act = act self.norm = norm self.dropout = dropout self.bias = bias self.net = nn.Sequential() echannel = self.in_channels padding = same_padding(kernel_size) self.final_size = np.asarray(self.in_shape, np.int) self.reshape = Reshape(*self.out_shape) # encode stage for i, (c, s) in enumerate(zip(self.channels, self.strides)): layer = self._get_layer(echannel, c, s, i == len(channels) - 1) echannel = c # use the output channel number as the input for the next loop self.net.add_module("layer_%i" % i, layer) self.final_size = calculate_out_shape(self.final_size, kernel_size, s, padding) self.final = self._get_final_layer((echannel,) + self.final_size)
def __init__( self, in_shape: Sequence[int], out_shape: Sequence[int], channels: Sequence[int], strides: Sequence[int], kernel_size: Union[Sequence[int], int] = 3, num_res_units: int = 2, act=Act.PRELU, norm=Norm.INSTANCE, dropout: Optional[float] = None, bias: bool = True, ) -> None: super().__init__() self.in_channels, *self.in_shape = ensure_tuple(in_shape) self.dimensions = len(self.in_shape) self.channels = ensure_tuple(channels) self.strides = ensure_tuple(strides) self.out_shape = ensure_tuple(out_shape) self.kernel_size = ensure_tuple_rep(kernel_size, self.dimensions) self.num_res_units = num_res_units self.act = act self.norm = norm self.dropout = dropout self.bias = bias self.net = nn.Sequential() echannel = self.in_channels padding = same_padding(kernel_size) self.final_size = np.asarray(self.in_shape, dtype=int) self.reshape = Reshape(*self.out_shape) # encode stage for i, (c, s) in enumerate(zip(self.channels, self.strides)): layer = self._get_layer(echannel, c, s, i == len(channels) - 1) echannel = c # use the output channel number as the input for the next loop self.net.add_module("layer_%i" % i, layer) self.final_size = calculate_out_shape(self.final_size, kernel_size, s, padding) # type: ignore self.final = self._get_final_layer((echannel, ) + self.final_size)
def __init__( self, latent_shape: Sequence[int], start_shape: Sequence[int], channels: Sequence[int], strides: Sequence[int], kernel_size: Union[Sequence[int], int] = 3, num_res_units: int = 2, act=Act.PRELU, norm=Norm.INSTANCE, dropout: Optional[float] = None, bias: bool = True, ) -> None: super().__init__() self.in_channels, *self.start_shape = ensure_tuple(start_shape) self.dimensions = len(self.start_shape) self.latent_shape = ensure_tuple(latent_shape) self.channels = ensure_tuple(channels) self.strides = ensure_tuple(strides) self.kernel_size = ensure_tuple_rep(kernel_size, self.dimensions) self.num_res_units = num_res_units self.act = act self.norm = norm self.dropout = dropout self.bias = bias self.flatten = nn.Flatten() self.linear = nn.Linear(int(np.prod(self.latent_shape)), int(np.prod(start_shape))) self.reshape = Reshape(*start_shape) self.conv = nn.Sequential() echannel = self.in_channels # transform tensor of shape `start_shape' into output shape through transposed convolutions and residual units for i, (c, s) in enumerate(zip(channels, strides)): is_last = i == len(channels) - 1 layer = self._get_layer(echannel, c, s, is_last) self.conv.add_module("layer_%i" % i, layer) echannel = c
def __init__( self, latent_shape: Sequence[int], start_shape: Sequence[int], channels: Sequence[int], strides: Sequence[int], kernel_size: Union[Sequence[int], int] = 3, num_res_units: int = 2, act=Act.PRELU, norm=Norm.INSTANCE, dropout: Optional[float] = None, bias: bool = True, ) -> None: """ Construct the generator network with the number of layers defined by `channels` and `strides`. In the forward pass a `nn.Linear` layer relates the input latent vector to a tensor of dimensions `start_shape`, this is then fed forward through the sequence of convolutional layers. The number of layers is defined by the length of `channels` and `strides` which must match, each layer having the number of output channels given in `channels` and an upsample factor given in `strides` (ie. a transpose convolution with that stride size). Args: latent_shape: tuple of integers stating the dimension of the input latent vector (minus batch dimension) start_shape: tuple of integers stating the dimension of the tensor to pass to convolution subnetwork channels: tuple of integers stating the output channels of each convolutional layer strides: tuple of integers stating the stride (upscale factor) of each convolutional layer kernel_size: integer or tuple of integers stating size of convolutional kernels num_res_units: integer stating number of convolutions in residual units, 0 means no residual units act: name or type defining activation layers norm: name or type defining normalization layers dropout: optional float value in range [0, 1] stating dropout probability for layers, None for no dropout bias: boolean stating if convolution layers should have a bias component """ super().__init__() self.in_channels, *self.start_shape = ensure_tuple(start_shape) self.dimensions = len(self.start_shape) self.latent_shape = ensure_tuple(latent_shape) self.channels = ensure_tuple(channels) self.strides = ensure_tuple(strides) self.kernel_size = ensure_tuple_rep(kernel_size, self.dimensions) self.num_res_units = num_res_units self.act = act self.norm = norm self.dropout = dropout self.bias = bias self.flatten = nn.Flatten() self.linear = nn.Linear(int(np.prod(self.latent_shape)), int(np.prod(start_shape))) self.reshape = Reshape(*start_shape) self.conv = nn.Sequential() echannel = self.in_channels # transform tensor of shape `start_shape' into output shape through transposed convolutions and residual units for i, (c, s) in enumerate(zip(channels, strides)): is_last = i == len(channels) - 1 layer = self._get_layer(echannel, c, s, is_last) self.conv.add_module("layer_%i" % i, layer) echannel = c