# Codeblock 2 class Bottleneck(nn.Module): def __init__(self, in_channels): super().__init__() self.relu = nn.ReLU() self.dropout = nn.Dropout(p=0.2) self.bn0 = nn.BatchNorm2d(num_features=in_channels) self.conv0 = nn.Conv2d(in_channels=in_channels, out_channels=GROWTH*4, kernel_size=1, padding=0, bias=False) self.bn1 = nn.BatchNorm2d(num_features=GROWTH*4) self.conv1 = nn.Conv2d(in_channels=GROWTH*4, out_channels=GROWTH, kernel_size=3, padding=1, bias=False) def forward(self, x): print(f'original\t: {x.size()}') out = self.dropout(self.conv0(self.relu(self.bn0(x)))) print(f'after conv0\t: {out.size()}') out = self.dropout(self.conv1(self.relu(self.bn1(out)))) print(f'after conv1\t: {out.size()}') concatenated = torch.cat((out, x), dim=1) print(f'after concat\t: {concatenated.size()}') return concatenated