§
    ù²Åjò&  ã                   ó”  — 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ej        ¦  «        Z G d„ dej        ¦  «        ZddedœZ G d„ de¦  «        Z e¦   «          edej         f¬¦  «        dddœdee         de!dedef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                   ór   ‡ — 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	„Zd
e	de	fd„Z
ˆ xZS )ÚInvertedResidualNÚinpÚoupÚstrideÚexpand_ratioÚ
norm_layer.Úreturnc                 óp  •— t          ¦   «                              ¦   «          || _        |dvrt          d|› �¦  «        ‚|€t          j        }t          t          ||z  ¦  «        ¦  «        }| j        dk    o||k    | _        g }|dk    r1| 	                    t          ||d|t          j        ¬¦  «        ¦  «         |                     t          |||||t          j        ¬¦  «        t	          j        ||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__s	           €úOC:\Projects\Historical\venv\Lib\site-packages\torchvision/models/mobilenetv2.pyr(   zInvertedResidual.__init__   sW  ø€ õ 	‰Œ×ÒÑÔÐØˆŒØ˜ÐÐÝÐKÀ6ÐKÐKÑLÔLÐLàÐÝœˆJå�˜s \Ñ1Ñ2Ô2Ñ3Ô3ˆ
Ø#œ{¨aÒ/Ð>°C¸3²JˆÔà"$ˆØ˜1ÒÐà�MŠMÝ$ S¨*À!ÐPZÕmoÔmuÐvÑvÔvñô ð ð 	�Šõ %ØØØ!Ø%Ø)Ý%'¤Xðñ ô õ ”	˜* c¨1¨a°¸Ð?Ñ?Ô?Ø�
˜3‘”ðñ	
ô 	
ð 	
õ  ”M 6Ð*ˆŒ	ØˆÔØ˜q’jˆŒˆˆó    Úxc                 ój   — | j         r||                      |¦  «        z   S |                      |¦  «        S ©N)r-   r3   ©r6   r<   s     r:   ÚforwardzInvertedResidual.forward<   s2   € ØÔð 	 Ø�t—y’y ‘|”|Ñ#Ð#à—9’9˜Q‘<”<Ðr;   r>   )Ú__name__Ú
__module__Ú__qualname__r+   r   r   r   ÚModuler(   r	   r@   Ú__classcell__©r9   s   @r:   r   r      s­   ø€ € € € € àswð&!ð &!Øð&!Ø ð&!Ø*-ð&!Ø=@ð&!ØNVÐW_Ð`cÐegÔenÐ`nÔWoÔNpð&!à	ð&!ð &!ð &!ð &!ð &!ð &!ðP ˜ð   Fð  ð  ð  ð  ð  ð  ð  ð  r;   r   c                   óà   ‡ — 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„Z
dedefd„Zdedefd„Zˆ xZS )r   éè  ç      ð?Né   çš™™™™™É?Únum_classesÚ
width_multÚinverted_residual_settingÚround_nearestÚblock.r   Údropoutr    c                 ó‚  •— t          ¦   «                              ¦   «          t          | ¦  «         |€t          }|€t          j        }d}d}	|€g d¢g d¢g d¢g d¢g d¢g d	¢g d
¢g}t          |¦  «        dk    st          |d         ¦  «        dk    rt          d|› �¦  «        ‚t          ||z  |¦  «        }t          |	t          d|¦  «        z  |¦  «        | _
        t          d|d|t          j        ¬¦  «        g}
|D ][\  }}}}t          ||z  |¦  «        }t          |¦  «        D ]1}|dk    r|nd}|
                      ||||||¬¦  «        ¦  «         |}Œ2Œ\|
                     t          || j
        d|t          j        ¬¦  «        ¦  «         t	          j        |
Ž | _        t	          j        t	          j        |¬¦  «        t	          j        | j
        |¦  «        ¦  «        | _        |                      ¦   «         D �]B}t+          |t          j        ¦  «        rRt          j                             |j        d¬¦  «         |j        �$t          j                             |j        ¦  «         Œot+          |t          j        t          j        f¦  «        rIt          j                             |j        ¦  «         t          j                             |j        ¦  «         ŒÞt+          |t          j        ¦  «        rJt          j                             |j        dd¦  «         t          j                             |j        ¦  «         �ŒDd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
   )rU   rS   é   r
   )rU   é@   é   r
   )rU   é`   rW   r   )rU   é    rW   r
   )rU   i@  r   r   r   rY   zGinverted_residual_setting should be non-empty or a 4-element list, got rI   rW   r
   )r   r   r$   r   )r   r   r"   )ÚpÚfan_out)Úmodeg{®Gáz„?)r'   r(   r   r   r   r*   Úlenr)   r   ÚmaxÚlast_channelr   r/   Úranger.   r2   ÚfeaturesÚDropoutÚLinearÚ
classifierÚmodulesÚ
isinstancer1   ÚinitÚkaiming_normal_Úweightr&   Úzeros_Ú	GroupNormÚones_Únormal_)r6   rL   rM   rN   rO   rP   r   rQ   Úinput_channelra   rc   ÚtÚcÚnÚsÚoutput_channelÚir   Úmr9   s                      €r:   r(   zMobileNetV2.__init__D   s>  ø€ õ0 	‰Œ×ÒÑÔÐÝ˜DÑ!Ô!Ð!àˆ=Ý$ˆEàÐÝœˆJàˆØˆà$Ð,ð ��Ø��Ø��Ø��Ø��Ø��Ø��ð	)Ð%õ Ð(Ñ)Ô)¨QÒ.Ð.µ#Ð6OÐPQÔ6RÑ2SÔ2SÐWXÒ2XÐ2XÝØuÐZsÐuÐuñô ð õ
 (¨¸
Ñ(BÀMÑRÔRˆÝ+¨L½3¸sÀJÑ;OÔ;OÑ,OÐQ^Ñ_Ô_ˆÔå   M¸!È
ÕegÔemÐnÑnÔnð%
ˆð 4ð 	/ð 	/‰JˆAˆq�!�QÝ,¨Q°©^¸]ÑKÔKˆNÝ˜1‘X”Xð /ð /�Ø 1šf˜f˜˜¨!�Ø—’   m°^ÀVÐZ[ÐhrÐ sÑ sÔ sÑtÔtÐtØ .��ð/ð
 	�ŠÝ Ø˜tÔ0¸aÈJÕikÔiqðñ ô ñ	
ô 	
ð 	
õ œ xÐ0ˆŒõ œ-ÝŒJ˜Ð!Ñ!Ô!ÝŒI�dÔ'¨Ñ5Ô5ñ
ô 
ˆŒð —’‘”ð 
	'ñ 
	'ˆAÝ˜!�RœYÑ'Ô'ð 	'Ý”×'Ò'¨¬°yÐ'ÑAÔAÐAØ”6Ð%Ý”G—N’N 1¤6Ñ*Ô*Ð*øÝ˜A¥¤µ´Ð=Ñ>Ô>ð 'Ý”—’˜aœhÑ'Ô'Ð'Ý”—’˜qœvÑ&Ô&Ð&Ð&Ý˜A�rœyÑ)Ô)ð 'Ý”—’ ¤¨!¨TÑ2Ô2Ð2Ý”—’˜qœvÑ&Ô&Ð&ùð
	'ð 
	'r;   r<   c                 óÄ   — |                       |¦  «        }t          j                             |d¦  «        }t	          j        |d¦  «        }|                      |¦  «        }|S )N©r   r   r   )rc   r   Ú
functionalÚadaptive_avg_pool2dÚtorchÚflattenrf   r?   s     r:   Ú_forward_implzMobileNetV2._forward_impl£   sS   € ð �MŠM˜!ÑÔˆåŒM×-Ò-¨a°Ñ8Ô8ˆÝŒM˜!˜QÑÔˆØ�OŠO˜AÑÔˆØˆr;   c                 ó,   — |                       |¦  «        S r>   )r~   r?   s     r:   r@   zMobileNetV2.forward­   s   € Ø×!Ò! !Ñ$Ô$Ð$r;   )rH   rI   NrJ   NNrK   )rA   rB   rC   r+   Úfloatr   r   r   r   rD   r(   r	   r~   r@   rE   rF   s   @r:   r   r   C   s(  ø€ € € € € ð  ØØ?CØØ48Ø9=Øð]'ð ]'àð]'ð ð]'ð $,¨D°°c´¬OÔ#<ð	]'ð
 ð]'ð ˜  b¤i Ô0Ô1ð]'ð ˜X c¨2¬9 nÔ5Ô6ð]'ð ð]'ð 
ð]'ð ]'ð ]'ð ]'ð ]'ð ]'ð~˜vð ¨&ð ð ð ð ð%˜ð % Fð %ð %ð %ð %ð %ð %ð %ð %r;   r   ièz5 ry   )Ú
num_paramsÚmin_sizeÚ
categoriesc                   ó´   — e Zd Z ed eed¬¦  «        i e¥dddddœid	d
ddœ¥¬¦  «        Z ed eedd¬¦  «        i e¥dddddœi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-1KgÕxé&1øQ@gü©ñÒM’V@)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@gøSã¥›´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)
rA   rB   rC   r   r   r   Ú_COMMON_METAÚIMAGENET1K_V1ÚIMAGENET1K_V2ÚDEFAULT© r;   r:   r   r   ¸   s÷   € € € € € Ø�GØKØ�7Ð.¸#Ð>Ñ>Ô>ð
Øð
àiàØ#Ø#ð ð  ðð Ø Øsð
ð 
ð 
ðñ ô €Mð" �GØKØ�7Ð.¸#È3ÐOÑOÔOð
Øð
à`àØ#Ø#ð ð  ðð Ø ðð
ð 
ð 
ðñ ô €Mð* €G€G€Gr;   r   Ú
pretrained)ÚweightsT)r—   Úprogressr—   r˜   Úkwargsr    c                 ó   — t                                | ¦  «        } | �)t          |dt          | j        d         ¦  «        ¦  «         t          di |¤Ž}| �*|                     |                      |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:
    NrL   rƒ   T)r˜   Ú
check_hashr•   )r   Úverifyr   r_   rŽ   r   Úload_state_dictÚget_state_dict)r—   r˜   r™   Úmodels       r:   r   r   â   s„   € õ0 #×)Ò)¨'Ñ2Ô2€GàÐÝ˜f mµS¸¼ÀlÔ9SÑ5TÔ5TÑUÔUÐUåÐ!Ð!˜&Ð!Ð!€EàÐØ×Ò˜g×4Ò4¸hÐSWÐ4ÑXÔXÑYÔYÐYà€Lr;   )#Ú	functoolsr   Útypingr   r   r   r   r|   r   r	   Úops.miscr   Útransforms._presetsr   Úutilsr   Ú_apir   r   r   Ú_metar   Ú_utilsr   r   r   Ú__all__rD   r   r   r‘   r   r’   Úboolr   r•   r;   r:   ú<module>rª      s  ðØ Ð Ð Ð Ð Ð Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0à €€€Ø Ð Ð Ð Ð Ð Ð Ð à +Ð +Ð +Ð +Ð +Ð +Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ Sð BÐ
AÐ
A€ð- ð - ð - ð - ð - �r”yñ - ô - ð - ð`k%ð k%ð k%ð k%ð k%�"”)ñ k%ô k%ð k%ð^ ØØ&ðð €ð'ð 'ð 'ð 'ð '˜;ñ 'ô 'ð 'ðT €ÑÔØÐ ,Ð0DÔ0RÐ!SÐTÑTÔTà15Èð ð  ð  ØÐ-Ô.ð ØAEð ØX[ð àð ð  ð  ñ UÔTñ Ôð ð  ð  r;   