Hello sir,
My sincere apologies for the late reply. I had some issues with my computer. Based on your suggestion consisting of replacing my ConvBlock with the DenseLayer,  I have been trying to read more about DenseNet and its implementation. I have designed a basic DenseBlock based on some online resources. The block is as follows
class BasicBlock(nn.Module):
    def __init__(self, n_stages, n_filters_in, n_filters_out, normalization='none', dropRate=0.0):
        super(BasicBlock, self).__init__()
        
        ops = []
        for i in range(n_stages):
            if i==0:
                input_channel = n_filters_in
            else:
                input_channel = n_filters_out

            if normalization == 'batchnorm':
                ops.append(nn.BatchNorm3d(n_filters_out))
            elif normalization == 'groupnorm':
                ops.append(nn.GroupNorm(num_groups=16, num_channels=n_filters_out))
            elif normalization == 'instancenorm':
                ops.append(nn.InstanceNorm3d(n_filters_out))
            elif normalization != 'none':
                assert False
            ops.append(nn.LeakyReLU(0.2,inplace=True))
            ops.append(nn.Conv3d(input_channel, n_filters_out, 3, padding=1))
        
        self.dense = nn.Sequential(*ops)
        self.droprate = dropRate
    def forward(self, x):
        out = self.dense(x)
        if self.droprate > 0:
            out = F.dropout(out, p=self.droprate, training=self.training)
        return torch.cat([x, out], 1)

I have designed it this way so that It could look similar to my initial ConvBlock. Please, what is the difference between this BasicBlock and the DenseLayer which is given above? How does it differ from the ConvBlock? Please, I would like to get a better picture of the whole thing.
I am very grateful for your help and patience.