o
    Vh%                     @   s  d dl mZ d dlmZmZmZmZ d dlZd dlmZm	Z	 ddl
mZ ddlmZ ddlmZ d	d
lmZmZmZ d	dlmZ d	dlmZmZmZ g dZG dd dejZG dd dejZddedZG dd deZe edej fdddddee de!dedefdd Z"dS )!    )partial)AnyCallableListOptionalN)nnTensor   )Conv2dNormActivation)ImageClassification)_log_api_usage_once   )register_modelWeightsWeightsEnum)_IMAGENET_CATEGORIES)_make_divisible_ovewrite_named_paramhandle_legacy_interface)MobileNetV2MobileNet_V2_Weightsmobilenet_v2c                       sZ   e Zd Z	ddededededeedejf  ddf fd	d
Zde	de	fddZ
  ZS )InvertedResidualNinpoupstrideexpand_ratio
norm_layer.returnc                    s   t    || _|dvrtd| |d u rtj}tt|| }| jdko*||k| _g }|dkr?|	t
||d|tjd |t
|||||tjdtj||ddddd||g tj| | _|| _|dk| _d S )	N)r   r	   z#stride should be 1 or 2 instead of r   kernel_sizer   activation_layer)r   groupsr   r!   r   F)bias)super__init__r   
ValueErrorr   BatchNorm2dintrounduse_res_connectappendr
   ReLU6extendConv2d
Sequentialconvout_channels_is_cn)selfr   r   r   r   r   
hidden_dimlayers	__class__ R/var/www/vscode/kcb/lib/python3.10/site-packages/torchvision/models/mobilenetv2.pyr%      s:   
	zInvertedResidual.__init__xc                 C   s   | j r
|| | S | |S N)r*   r0   r3   r:   r8   r8   r9   forward<   s   
zInvertedResidual.forwardr;   )__name__
__module____qualname__r(   r   r   r   Moduler%   r   r=   __classcell__r8   r8   r6   r9   r      s     (r   c                       s   e Zd Z							ddededeeee   d	ed
eedej	f  deedej	f  deddf fddZ
dedefddZdedefddZ  ZS )r           ?N   皙?num_classes
width_multinverted_residual_settinground_nearestblock.r   dropoutr   c                    s  t    t|  |du rt}|du rtj}d}d}	|du r5g dg dg dg dg dg d	g d
g}t|dksCt|d dkrJtd| t|| |}t|	t	d| || _
td|d|tjdg}
|D ]*\}}}}t|| |}t|D ]}|dkr|nd}|
||||||d |}qzqi|
t|| j
d|tjd tj|
 | _ttj|dt| j
|| _|  D ]M}t|tjrtjj|jdd |jdurtj|j qt|tjtjfrtj|j tj|j qt|tjr	tj|jdd tj|j qdS )aw  
        MobileNet V2 main class

        Args:
            num_classes (int): Number of classes
            width_mult (float): Width multiplier - adjusts number of channels in each layer by this amount
            inverted_residual_setting: Network structure
            round_nearest (int): Round the number of channels in each layer to be a multiple of this number
            Set to 1 to turn off rounding
            block: Module specifying inverted residual building block for mobilenet
            norm_layer: Module specifying the normalization layer to use
            dropout (float): The droupout probability

        N    i   )r      r   r   )      r	   r	   )rO   rM      r	   )rO   @      r	   )rO   `   rQ   r   )rO      rQ   r	   )rO   i@  r   r   r   rS   zGinverted_residual_setting should be non-empty or a 4-element list, got rD   rQ   r	   )r   r   r!   r   )r   r   r   )pfan_out)modeg{Gz?)r$   r%   r   r   r   r'   lenr&   r   maxlast_channelr
   r,   ranger+   r/   featuresDropoutLinear
classifiermodules
isinstancer.   initkaiming_normal_weightr#   zeros_	GroupNormones_normal_)r3   rG   rH   rI   rJ   rK   r   rL   input_channelr[   r]   tcnsoutput_channelir   mr6   r8   r9   r%   D   sp   


zMobileNetV2.__init__r:   c                 C   s2   |  |}tj|d}t|d}| |}|S )Nr   r   r   )r]   r   
functionaladaptive_avg_pool2dtorchflattenr`   r<   r8   r8   r9   _forward_impl   s
   

zMobileNetV2._forward_implc                 C   s
   |  |S r;   )rw   r<   r8   r8   r9   r=      s   
zMobileNetV2.forward)rC   rD   NrE   NNrF   )r>   r?   r@   r(   floatr   r   r   r   rA   r%   r   rw   r=   rB   r8   r8   r6   r9   r   C   s6    	_
r   iz5 rr   )
num_paramsmin_size
categoriesc                
   @   sz   e Zd Zedeeddi edddddid	d
dddZedeedddi edddddid	ddddZeZ	dS )r   z=https://download.pytorch.org/models/mobilenet_v2-b0353104.pth   )	crop_sizezQhttps://github.com/pytorch/vision/tree/main/references/classification#mobilenetv2zImageNet-1Kgx&1Q@gMV@)zacc@1zacc@5g$C?g\(+@zXThese weights reproduce closely the results of the paper using a simple training recipe.)recipe_metrics_ops
_file_size_docs)url
transformsmetaz=https://download.pytorch.org/models/mobilenet_v2-7ebf99e0.pth   )r}   resize_sizezHhttps://github.com/pytorch/vision/issues/3995#new-recipe-with-reg-tuningg`"	R@gS㥛V@gV-2+@a$  
                These weights improve upon the results of the original paper by using a modified version of TorchVision's
                `new training recipe
                <https://pytorch.org/blog/how-to-train-state-of-the-art-models-using-torchvision-latest-primitives/>`_.
            N)
r>   r?   r@   r   r   r   _COMMON_METAIMAGENET1K_V1IMAGENET1K_V2DEFAULTr8   r8   r8   r9   r      sH    
r   
pretrained)weightsT)r   progressr   r   kwargsr   c                 K   sV   t | } | durt|dt| jd  tdi |}| dur)|| j|dd |S )a  MobileNetV2 architecture from the `MobileNetV2: Inverted Residuals and Linear
    Bottlenecks <https://arxiv.org/abs/1801.04381>`_ paper.

    Args:
        weights (:class:`~torchvision.models.MobileNet_V2_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.MobileNet_V2_Weights` below for
            more details, and possible values. By default, no pre-trained
            weights are used.
        progress (bool, optional): If True, displays a progress bar of the
            download to stderr. Default is True.
        **kwargs: parameters passed to the ``torchvision.models.mobilenetv2.MobileNetV2``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/mobilenetv2.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.MobileNet_V2_Weights
        :members:
    NrG   r{   T)r   
check_hashr8   )r   verifyr   rY   r   r   load_state_dictget_state_dict)r   r   r   modelr8   r8   r9   r      s   
r   )#	functoolsr   typingr   r   r   r   ru   r   r   ops.miscr
   transforms._presetsr   utilsr   _apir   r   r   _metar   _utilsr   r   r   __all__rA   r   r   r   r   r   boolr   r8   r8   r8   r9   <module>   s<    0o*