def METHOD_NAME(self):
    # The start number of hidden channels
    c_hidden = self.hparams.growth_rate * self.hparams.bn_size
    # A first convolution on the original image to scale up the channel size
    self.input_net = nn.Sequential(
        # No batch norm or activation function as done inside the Dense layers
        nn.Conv2d(3, c_hidden, kernel_size=3, padding=1)
    )
    # Creating the dense blocks, eventually including transition layers
    blocks = []
    for block_idx, num_layers in enumerate(self.hparams.num_layers):
        blocks.append(
            DenseBlock(c_in=c_hidden,
                       num_layers=num_layers,
                       bn_size=self.hparams.bn_size,
                       growth_rate=self.hparams.growth_rate,
                       act_fn=self.hparams.act_fn)
        )
        # Overall output of the dense block
        c_hidden = c_hidden + num_layers * self.hparams.growth_rate
        # Don't apply transition layer on last block
        if block_idx < len(self.hparams.num_layers) - 1:
            blocks.append(
                TransitionLayer(c_in=c_hidden,
                                c_out=c_hidden // 2,
                                act_fn=self.hparams.act_fn))
            c_hidden = c_hidden // 2
    self.blocks = nn.Sequential(*blocks)
    # Mapping to classification output
    self.output_net = nn.Sequential(
        # The features have not passed a non-linearity until here.
        nn.BatchNorm2d(c_hidden),
        self.hparams.act_fn(),
        nn.AdaptiveAvgPool2d((1, 1)),
        nn.Flatten(),
        nn.Linear(c_hidden, self.hparams.num_classes)
    )