def __init__()

in cvnets/models/classification/mobilenetv2.py [0:0]


    def __init__(self, opts, *args, **kwargs) -> None:

        width_mult = getattr(opts, "model.classification.mobilenetv2.width-multiplier", 1.0)
        num_classes = getattr(opts, "model.classification.n_classes", 1000)

        # Segmentation architectures like Deeplab and PSPNet modifies the strides of the classification backbones
        # We allow that using `output_stride` and `replace_stride_with_dilation` arguments
        output_stride = kwargs.get("output_stride", None)
        dilate_l4 = dilate_l5 = False
        if output_stride == 8:
            dilate_l4 = True
            dilate_l5 = True
        elif output_stride == 16:
            dilate_l5 = True

        cfg = get_configuration(opts=opts)

        image_channels = 3
        input_channels = 32
        last_channel = 1280
        classifier_dropout = getattr(opts, "model.classification.classifier_dropout", 0.2)
        super(MobileNetV2, self).__init__()
        last_channel = make_divisible(last_channel * max(1.0, width_mult), self.round_nearest)
        self.dilation = 1
        self.model_conf_dict = dict()

        self.conv_1 = ConvLayer(opts=opts, in_channels=image_channels, out_channels=input_channels,
                                kernel_size=3, stride=2, use_norm=True, use_act=True)
        self.model_conf_dict['conv1'] = {'in': image_channels, 'out': input_channels}

        self.layer_1, out_channels = self._make_layer(opts=opts,
                                                      mv2_config=cfg['layer1'],
                                                      width_mult=width_mult,
                                                      input_channel=input_channels,
                                                      round_nearest=self.round_nearest)
        self.model_conf_dict['layer1'] = {'in': input_channels, 'out': out_channels}
        input_channels = out_channels

        self.layer_2, out_channels = self._make_layer(opts=opts,
                                                      mv2_config=cfg['layer2'],
                                                      width_mult=width_mult,
                                                      input_channel=input_channels,
                                                      round_nearest=self.round_nearest)
        self.model_conf_dict['layer2'] = {'in': input_channels, 'out': out_channels}
        input_channels = out_channels

        self.layer_3, out_channels = self._make_layer(opts=opts,
                                                      mv2_config=cfg['layer3'],
                                                      width_mult=width_mult,
                                                      input_channel=input_channels,
                                                      round_nearest=self.round_nearest)
        self.model_conf_dict['layer3'] = {'in': input_channels, 'out': out_channels}
        input_channels = out_channels

        self.layer_4, out_channels = self._make_layer(opts=opts,
                                                      mv2_config=[cfg['layer4'], cfg['layer4_a']],
                                                      width_mult=width_mult,
                                                      input_channel=input_channels,
                                                      round_nearest=self.round_nearest,
                                                      dilate=dilate_l4)
        self.model_conf_dict['layer4'] = {'in': input_channels, 'out': out_channels}
        input_channels = out_channels

        self.layer_5, out_channels = self._make_layer(opts=opts,
                                                      mv2_config=[cfg['layer5'], cfg['layer5_a']],
                                                      width_mult=width_mult,
                                                      input_channel=input_channels,
                                                      round_nearest=self.round_nearest,
                                                      dilate=dilate_l5)
        self.model_conf_dict['layer5'] = {'in': input_channels, 'out': out_channels}
        input_channels = out_channels

        self.conv_1x1_exp = ConvLayer(opts=opts, in_channels=input_channels, out_channels=last_channel,
                                      kernel_size=1, stride=1, use_act=True, use_norm=True)
        self.model_conf_dict['exp_before_cls'] = {'in': input_channels, 'out': last_channel}

        pool_type = getattr(opts, "model.layer.global_pool", "mean")

        self.classifier = nn.Sequential()
        self.classifier.add_module(
            name="global_pool",
            module=GlobalPool(pool_type=pool_type, keep_dim=False)
        )
        if 0.0 < classifier_dropout < 1.0:
            self.classifier.add_module(
                name="classifier_dropout",
                module=Dropout(p=classifier_dropout)
            )
        self.classifier.add_module(
            name="classifier_fc",
            module=LinearLayer(in_features=last_channel, out_features=num_classes, bias=True)
        )

        self.model_conf_dict['cls'] = {'in': last_channel, 'out': num_classes}

        # check model
        self.check_model()

        # weight initialization
        self.reset_parameters(opts=opts)