ó
    Eñiè%  ã                   óz  • S SK Jr  S SKJrJrJr  S SKrS SKJrJr  SSK	J
r
  SSKJr  SSKJr  S	S
KJrJrJr  S	SKJr  S	SKJrJrJr  / SQr " S S\R4                  5      r " S S\R4                  5      rSS\S.r " S S\5      r\" 5       \" S\R>                  4S9SSS.S\\   S\ S\S\4S jj5       5       r!g) é    )Úpartial)ÚAnyÚCallableÚ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S rSr SS\S\S\S\S\\S\R                  4      S	S4U 4S
 jjjr	S\
S	\
4S jrSrU =r$ )ÚInvertedResidualé   NÚinpÚoupÚstrideÚexpand_ratioÚ
norm_layer.Úreturnc                 ó,  >• [         TU ]  5         X0l        US;  a  [        SU 35      eUc  [        R
                  n[        [        X-  5      5      nU R                  S:H  =(       a    X:H  U l        / nUS:w  a)  UR                  [        XSU[        R                  S95        UR                  [        UUUUU[        R                  S9[        R                  " XbSSSSS9U" U5      /5        [        R                  " U6 U l        X l        US:„  U l        g )	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	           €Ú[/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torchvision/models/mobilenetv2.pyr(   ÚInvertedResidual.__init__   s  ø€ ô 	‰ÑÔØŒØ˜ÓÜÐBÀ6À(ÐKÓLÐLàÑÜŸ™ˆJäœ˜sÑ1Ó2Ó3ˆ
Ø#Ÿ{™{¨aÑ/×>°C±JˆÔà"$ˆØ˜1Óà�M‰MÜ$ SÀ!ÐPZÔmo×muÑmuÑvôð 	�‰ô %ØØØ!Ø%Ø)Ü%'§X¡Xñô —	’	˜*¨1¨a°¸Ñ?Ù˜3“ðô	
ô  —M’M 6Ð*ˆŒ	ØÔØ˜q‘jˆ�ó    Úxc                 ól   • U R                   (       a  XR                  U5      -   $ U R                  U5      $ ©N)r-   r3   ©r6   r=   s     r:   ÚforwardÚInvertedResidual.forward<   s*   € Ø××Ø—y‘y “|Ñ#Ð#à—9‘9˜Q“<Ðr<   )r5   r3   r4   r   r-   r?   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r+   r   r   r   ÚModuler(   r   rA   Ú__static_attributes__Ú__classcell__©r9   s   @r:   r   r      sq   ø† àswñ&!Øð&!Ø ð&!Ø*-ð&!Ø=@ð&!ØNVÐW_Ð`cÐeg×enÑenÐ`nÑWoÑNpð&!à	÷&!ð &!ðP ˜ð   F÷  ò  r<   r   c                   óÜ   ^ • \ rS rSr       SS\S\S\\\\         S\S\\S\	R                  4      S	\\S\	R                  4      S
\SS4U 4S jjjrS\S\4S jrS\S\4S jrSrU =r$ )r   éC   NÚnum_classesÚ
width_multÚinverted_residual_settingÚround_nearestÚblock.r   Údropoutr    c                 ó�  >• [         TU ]  5         [        U 5        Uc  [        nUc  [        R
                  nSnSn	Uc  / SQ/ SQ/ SQ/ SQ/ SQ/ S	Q/ S
Q/n[        U5      S:X  d  [        US   5      S:w  a  [        SU 35      e[        X‚-  U5      n[        U	[        SU5      -  U5      U l
        [        SUSU[        R                  S9/n
U HI  u  p¼pÞ[        XÂ-  U5      n[        U5       H&  nUS:X  a  UOSnU
R                  U" X�UX¶S95        UnM(     MK     U
R                  [        X€R                  SU[        R                  S95        [        R                  " U
6 U l        [        R                  " [        R"                  " US9[        R$                  " U R                  U5      5      U l        U R)                  5        GH  n[+        U[        R,                  5      (       ab  [        R.                  R1                  UR2                  SS9  UR4                  b+  [        R.                  R7                  UR4                  5        Mƒ  M…  [+        U[        R
                  [        R8                  45      (       aU  [        R.                  R;                  UR2                  5        [        R.                  R7                  UR4                  5        GM	  [+        U[        R$                  5      (       d  GM+  [        R.                  R=                  UR2                  SS5        [        R.                  R7                  UR4                  5        GM‚     g)a  
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	   )rV   rT   é   r	   )rV   é@   é   r	   )rV   é`   rX   r   )rV   é    rX   r	   )rV   i@  r   r   r   rZ   zGinverted_residual_setting should be non-empty or a 4-element list, got ç      ð?rX   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   rM   rN   rO   rP   rQ   r   rR   Úinput_channelrc   re   ÚtÚcÚnÚsÚoutput_channelÚir   Úmr9   s                      €r:   r(   ÚMobileNetV2.__init__D   sŒ  ø€ ô0 	‰ÑÔÜ˜DÔ!à‰=Ü$ˆEàÑÜŸ™ˆJàˆØˆà$Ñ,ò ÚÚÚÚÚÚð	)Ð%ô Ð(Ó)¨QÓ.´#Ð6OÐPQÑ6RÓ2SÐWXÓ2XÜØYÐZsÐYtÐuóð ô
 (¨Ñ(BÀMÓRˆÜ+¨L¼3¸sÀJÓ;OÑ,OÐQ^Ó_ˆÔä   M¸!È
Ôeg×emÑemÑnð%
ˆó 4‰JˆA�!Ü,¨Q©^¸]ÓKˆNÜ˜1–X�Ø 1›f™¨!�Ø—‘¡ mÀVÐZ[Ñ sÔtØ .’ó ñ 4ð 	�‰Ü Ø×0Ñ0¸aÈJÔik×iqÑiqñô	
ô Ÿš xÐ0ˆŒô Ÿ-š-Ü�JŠJ˜Ñ!Ü�IŠI�d×'Ñ'¨Ó5ó
ˆŒð —‘—ˆAÜ˜!œRŸY™Y×'Ñ'Ü—‘×'Ñ'¨¯©°yÐ'ÑAØ—6‘6Ñ%Ü—G‘G—N‘N 1§6¡6Ö*ñ &ä˜A¤§¡´·±Ð=×>Ñ>Ü—‘—‘˜aŸh™hÔ'Ü—‘—‘˜qŸv™v×&Ü˜AœrŸy™y×)Ô)Ü—‘—‘ §¡¨!¨TÔ2Ü—‘—‘˜qŸv™v×&ò  r<   r=   c                 ó¸   • U R                  U5      n[        R                  R                  US5      n[        R
                  " US5      nU R                  U5      nU$ )N©r   r   r   )re   r   Ú
functionalÚadaptive_avg_pool2dÚtorchÚflattenrh   r@   s     r:   Ú_forward_implÚMobileNetV2._forward_impl£   sK   € ð �M‰M˜!Óˆä�M‰M×-Ñ-¨a°Ó8ˆÜ�MŠM˜!˜QÓˆØ�O‰O˜AÓˆØˆr<   c                 ó$   • U R                  U5      $ r?   )r�   r@   s     r:   rA   ÚMobileNetV2.forward­   s   € Ø×!Ñ! !Ó$Ð$r<   )rh   re   rc   )iè  r]   Né   NNgš™™™™™É?)rC   rD   rE   rF   r+   Úfloatr   Úlistr   r   rG   r(   r   r�   rA   rH   rI   rJ   s   @r:   r   r   C   sÙ   ø† ð  ØØ?CØØ48Ø9=Øñ]'àð]'ð ð]'ð $,¨D°°c±©OÑ#<ð	]'ð
 ð]'ð ˜  b§i¡i Ñ0Ñ1ð]'ð ˜X c¨2¯9©9 nÑ5Ñ6ð]'ð ð]'ð 
÷]'ð ]'ð~˜vð ¨&ô ð%˜ð % F÷ %ò %r<   r   ièz5 r|   )Ú
num_paramsÚmin_sizeÚ
categoriesc                   óŠ   • \ rS rSr\" S\" \SS90 \ESSSSS	.0S
SSS.ES9r\" S\" \SSS90 \ESSSSS	.0S
SSS.ES9r	\	r
Srg)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)rC   rD   rE   rF   r   r   r   Ú_COMMON_METAÚIMAGENET1K_V1ÚIMAGENET1K_V2ÚDEFAULTrH   r™   r<   r:   r   r   ¸   s¥   † ÙØKÙÐ.¸#Ñ>ð
Øð
àiàØ#Ø#ñ ðð Ø Øsò
ñ€Mñ" ØKÙÐ.¸#È3ÑOð
Øð
à`àØ#Ø#ñ ðð Ø ðò
ñ€Mð* ƒGr<   r   Ú
pretrained)ÚweightsT)rŸ   ÚprogressrŸ   r    Úkwargsr    c                 óÖ   • [         R                  U 5      n U b#  [        US[        U R                  S   5      5        [        S0 UD6nU b  UR                  U R                  USS95        U$ )aq  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:
rM   rŠ   T)r    Ú
check_hashr™   )r   Úverifyr   ra   r–   r   Úload_state_dictÚget_state_dict)rŸ   r    r¡   Úmodels       r:   r   r   â   sk   € ô0 #×)Ñ)¨'Ó2€GàÑÜ˜f m´S¸¿¹ÀlÑ9SÓ5TÔUäÑ!˜&Ñ!€EàÑØ×Ñ˜g×4Ñ4¸hÐSWÐ4ÐXÔYà€Lr<   )"Ú	functoolsr   Útypingr   r   r   r   r   r   Úops.miscr
   Útransforms._presetsr   Úutilsr   Ú_apir   r   r   Ú_metar   Ú_utilsr   r   r   Ú__all__rG   r   r   rš   r   r›   Úboolr   r™   r<   r:   Ú<module>r²      sÓ   ðÝ ß *Ñ *ã ß å +Ý 5Ý 'ß 6Ñ 6Ý 'ß SÑ Sò B€ô- �r—y‘yô - ô`k%�"—)‘)ô k%ð^ ØØ&ñ€ô'˜;ô 'ñT ÓÙ ,Ð0D×0RÑ0RÐ!SÑTà15Èò ØÐ-Ñ.ð ØAEð ØX[ð àô ó Uó ñ r<   