# Codeblock 12a class MobileNetV3(nn.Module): def __init__(self): super().__init__() self.first_conv = ConvBlock(in_channels=3, #(1) out_channels=int(WIDTH_MULTIPLIER*16), kernel_size=3, stride=2, padding=1, activation=nn.Hardswish()) self.blocks = nn.ModuleList([]) #(2) for config in BOTTLENECKS: #(3) in_channels, out_channels, kernel_size, exp_size, se, activation, stride, padding = config self.blocks.append(Bottleneck(in_channels=int(WIDTH_MULTIPLIER*in_channels), out_channels=int(WIDTH_MULTIPLIER*out_channels), kernel_size=kernel_size, exp_size=int(WIDTH_MULTIPLIER*exp_size), stride=stride, padding=padding, se=se, activation=activation)) self.second_conv = ConvBlock(in_channels=int(WIDTH_MULTIPLIER*160), #(4) out_channels=int(WIDTH_MULTIPLIER*960), kernel_size=1, stride=1, padding=0, activation=nn.Hardswish()) self.avgpool = nn.AdaptiveAvgPool2d(output_size=(1,1)) #(5) self.third_conv = ConvBlock(in_channels=int(WIDTH_MULTIPLIER*960), #(6) out_channels=int(WIDTH_MULTIPLIER*1280), kernel_size=1, stride=1, padding=0, batchnorm=False, activation=nn.Hardswish()) self.dropout = nn.Dropout(p=0.8) #(7) self.output = ConvBlock(in_channels=int(WIDTH_MULTIPLIER*1280), #(8) out_channels=int(NUM_CLASSES), #(9) kernel_size=1, stride=1, padding=0, batchnorm=False, activation=nn.Identity())