# Codeblock 5 class DepthwiseSeparableConv(nn.Module): def __init__(self, in_channels, out_channels, downsample=False): #(1) super().__init__() in_channels = int(in_channels*ALPHA) #(2) out_channels = int(out_channels*ALPHA) #(3) if downsample: #(4) stride = 2 else: stride = 1 self.dwconv = nn.Conv2d(in_channels=in_channels, out_channels=in_channels, #(5) kernel_size=3, #(6) stride=stride, #(7) padding=1, groups=in_channels, #(8) bias=False) self.bn0 = nn.BatchNorm2d(num_features=in_channels) #(9) self.pwconv = nn.Conv2d(in_channels=in_channels, out_channels=out_channels, #(10) kernel_size=1, #(11) stride=1, #(12) padding=0, #(13) groups=1, #(14) bias=False) self.bn1 = nn.BatchNorm2d(num_features=out_channels) #(15) self.relu = nn.ReLU() #(16) def forward(self, x): print(f'original\t: {x.size()}') x = self.relu(self.bn0(self.dwconv(x))) print(f'after dw conv\t: {x.size()}') x = self.relu(self.bn1(self.pwconv(x))) print(f'after pw conv\t: {x.size()}') return x