U
    ­Ê¹j—?  ã                   @   s®  d dl mZ d dlmZmZmZmZmZ d dlZd dlm	Z	m
Z
 ddlmZ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 dddddgZG dd„ dƒZG dd„ de	jƒZ G dd„ de	jƒZ!d*e"e#e$e$edœdd„Z%ee e&ee e$ee!dœdd„Z'ded œZ(G d!d„ deƒZ)G d"d„ deƒZ*eƒ ed#e)j+fd$�dd%d&œee) e$ee!d'œd(d„ƒƒZ,eƒ ed#e*j+fd$�dd%d&œee* e$ee!d'œd)d„ƒƒZ-dS )+é    )Úpartial)ÚAnyÚCallableÚListÚOptionalÚSequenceN)ÚnnÚTensoré   )ÚConv2dNormActivationÚSqueezeExcitation)ÚImageClassification)Ú_log_api_usage_onceé   )Úregister_modelÚWeightsÚWeightsEnum)Ú_IMAGENET_CATEGORIES)Ú_make_divisibleÚ_ovewrite_named_paramÚhandle_legacy_interfaceÚMobileNetV3ÚMobileNet_V3_Large_WeightsÚMobileNet_V3_Small_WeightsÚmobilenet_v3_largeÚmobilenet_v3_smallc                
   @   s>   e Zd Zeeeeeeeeedœ	dd„Zeeedœdd„ƒZ	dS )ÚInvertedResidualConfig)	Úinput_channelsÚkernelÚexpanded_channelsÚout_channelsÚuse_seÚ
activationÚstrideÚdilationÚ
width_multc
           
      C   sP   |   ||	¡| _|| _|   ||	¡| _|   ||	¡| _|| _|dk| _|| _|| _d S )NÚHS)	Úadjust_channelsr   r   r   r    r!   Úuse_hsr#   r$   )
Úselfr   r   r   r    r!   r"   r#   r$   r%   © r*   ú]/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torchvision/models/mobilenetv3.pyÚ__init__   s    
zInvertedResidualConfig.__init__©Zchannelsr%   c                 C   s   t | | dƒS )Né   )r   r-   r*   r*   r+   r'   /   s    z&InvertedResidualConfig.adjust_channelsN)
Ú__name__Ú
__module__Ú__qualname__ÚintÚboolÚstrÚfloatr,   Ústaticmethodr'   r*   r*   r*   r+   r      s   ör   c                       sX   e Zd Zeeejd�feedej	f edej	f dœ‡ fdd„Z
eedœdd„Z‡  ZS )	ÚInvertedResidual)Zscale_activation.)ÚcnfÚ
norm_layerÚse_layerc                    s$  t ƒ  ¡  d|j  kr dks*n tdƒ‚|jdko>|j|jk| _g }|jrRtj	ntj
}|j|jkr€| t|j|jd||d�¡ |jdkrŽdn|j}| t|j|j|j||j|j||d�¡ |jrät|jd dƒ}| ||j|ƒ¡ | t|j|jd|d d�¡ tj|Ž | _|j| _|jdk| _d S )Nr   r
   zillegal stride value©Úkernel_sizer9   Úactivation_layer)r<   r#   r$   Úgroupsr9   r=   é   r.   )Úsuperr,   r#   Ú
ValueErrorr   r    Úuse_res_connectr(   r   Ú	HardswishZReLUr   Úappendr   r$   r   r!   r   Ú
SequentialÚblockZ_is_cn)r)   r8   r9   r:   Úlayersr=   r#   Zsqueeze_channels©Ú	__class__r*   r+   r,   6   sX    
ûÿøÿ    ÿÿzInvertedResidual.__init__)ÚinputÚreturnc                 C   s   |   |¡}| jr||7 }|S ©N)rF   rB   )r)   rJ   Úresultr*   r*   r+   Úforwardn   s    
zInvertedResidual.forward)r/   r0   r1   r   ÚSElayerr   ZHardsigmoidr   r   ÚModuler,   r	   rN   Ú__classcell__r*   r*   rH   r+   r7   4   s   üü8r7   c                
       sr   e Zd Zdee eeeedej	f  eedej	f  e
eddœ‡ fdd„Zeedœd	d
„Zeedœdd„Z‡  ZS )r   éè  Nçš™™™™™É?.)Úinverted_residual_settingÚlast_channelÚnum_classesrF   r9   ÚdropoutÚkwargsrK   c              
      sÔ  t ƒ  ¡  t| ƒ |s tdƒ‚n$t|tƒr<tdd„ |D ƒƒsDtdƒ‚|dkrPt}|dkrht	t
jddd�}g }|d	 j}	| td
|	d
d|t
jd�¡ |D ]}
| ||
|ƒ¡ q–|d j}d| }| t||d|t
jd�¡ t
j|Ž | _t
 d¡| _t
 t
 ||¡t
jdd�t
j|dd�t
 ||¡¡| _|  ¡ D ]¢}t|t
jƒ�rlt
jj|jdd� |jdk	�rÌt
j |j¡ n`t|t
jt
jfƒ�ržt
j  |j¡ t
j |j¡ n.t|t
jƒ�r,t
j !|jd	d¡ t
j |j¡ �q,dS )a.  
        MobileNet V3 main class

        Args:
            inverted_residual_setting (List[InvertedResidualConfig]): Network structure
            last_channel (int): The number of channels on the penultimate layer
            num_classes (int): Number of classes
            block (Optional[Callable[..., nn.Module]]): Module specifying inverted residual building block for mobilenet
            norm_layer (Optional[Callable[..., nn.Module]]): Module specifying the normalization layer to use
            dropout (float): The droupout probability
        z1The inverted_residual_setting should not be emptyc                 S   s   g | ]}t |tƒ‘qS r*   )Ú
isinstancer   )Ú.0Úsr*   r*   r+   Ú
<listcomp>’   s     z(MobileNetV3.__init__.<locals>.<listcomp>zDThe inverted_residual_setting should be List[InvertedResidualConfig]Ngü©ñÒMbP?g{®Gáz„?)ÚepsZmomentumr   é   r
   )r<   r#   r9   r=   éÿÿÿÿé   r   r;   T)Úinplace)Úpra   Zfan_out)Úmode)"r@   r,   r   rA   rY   r   ÚallÚ	TypeErrorr7   r   r   ZBatchNorm2dr   rD   r   rC   r    rE   ÚfeaturesZAdaptiveAvgPool2dÚavgpoolZLinearZDropoutÚ
classifierÚmodulesZConv2dÚinitZkaiming_normal_ÚweightZbiasZzeros_Z	GroupNormZones_Znormal_)r)   rT   rU   rV   rF   r9   rW   rX   rG   Zfirstconv_output_channelsr8   Zlastconv_input_channelsZlastconv_output_channelsÚmrH   r*   r+   r,   v   sr    

ÿþ
úÿ
ûÿ



üzMobileNetV3.__init__)ÚxrK   c                 C   s.   |   |¡}|  |¡}t |d¡}|  |¡}|S )Nr   )rf   rg   ÚtorchÚflattenrh   ©r)   rm   r*   r*   r+   Ú_forward_implÑ   s
    


zMobileNetV3._forward_implc                 C   s
   |   |¡S rL   )rq   rp   r*   r*   r+   rN   Û   s    zMobileNetV3.forward)rR   NNrS   )r/   r0   r1   r   r   r2   r   r   r   rP   r5   r   r,   r	   rq   rN   rQ   r*   r*   rH   r+   r   u   s        ù÷[
ç      ð?F)Úarchr%   Úreduced_tailÚdilatedrX   c                 K   sÂ  |rdnd}|rdnd}t t|d�}t tj|d�}| dk�r˜|ddddddddƒ|ddd	d
ddddƒ|d
ddd
ddddƒ|d
dddddddƒ|ddddddddƒ|ddddddddƒ|ddddddddƒ|ddddddddƒ|ddddddddƒ|ddddddddƒ|ddddddddƒ|ddddddddƒ|dddd| ddd|ƒ|d| dd| d| ddd|ƒ|d| dd| d| ddd|ƒg}	|d| ƒ}
�n"| dk�r¬|ddddddddƒ|dddd
ddddƒ|d
ddd
ddddƒ|d
dddddddƒ|ddddddddƒ|ddddddddƒ|ddddddddƒ|ddddddddƒ|ddd d| ddd|ƒ|d| dd!| d| ddd|ƒ|d| dd!| d| ddd|ƒg}	|d"| ƒ}
ntd#| › �ƒ‚|	|
fS )$Nr
   r   )r%   r   é   r^   FZREé@   é   éH   é   é(   Téx   éð   éP   r&   éÈ   é¸   ià  ép   i   é    iÀ  i   r   éX   é`   é0   é�   i   i@  i   zUnsupported model type )r   r   r'   rA   )rs   r%   rt   ru   rX   Zreduce_dividerr$   Z
bneck_confr'   rT   rU   r*   r*   r+   Ú_mobilenet_v3_confß   sL    
  ñ
  õr‡   )rT   rU   ÚweightsÚprogressrX   rK   c                 K   sL   |d k	rt |dt|jd ƒƒ t| |f|Ž}|d k	rH| |j|dd�¡ |S )NrV   Ú
categoriesT)r‰   Z
check_hash)r   ÚlenÚmetar   Zload_state_dictZget_state_dict)rT   rU   rˆ   r‰   rX   Úmodelr*   r*   r+   Ú_mobilenet_v3  s    rŽ   )r   r   )Zmin_sizerŠ   c                   @   sv   e Zd Zedeedd�edddddd	œid
dddœ–d�Zedeeddd�edddddd	œid
dddœ–d�ZeZ	dS )r   zChttps://download.pytorch.org/models/mobilenet_v3_large-8738ca79.pthéà   ©Ú	crop_sizeiªS ú^https://github.com/pytorch/vision/tree/main/references/classification#mobilenetv3-large--smallúImageNet-1Kg¦›Ä °‚R@gö(\�ÂÕV@©zacc@1zacc@5g-²�ï§ÆË?gw¾Ÿ/5@zJThese weights were trained from scratch by using a simple training recipe.©Z
num_paramsZrecipeZ_metricsZ_opsÚ
_file_sizeZ_docs©ÚurlZ
transformsrŒ   zChttps://download.pytorch.org/models/mobilenet_v3_large-5c1a4163.pthéè   )r‘   Zresize_sizezHhttps://github.com/pytorch/vision/issues/3995#new-recipe-with-reg-tuningg¨ÆK7‰ÑR@gNbX9$W@g¬Zd5@a/  
                These weights improve marginally 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/   r0   r1   r   r   r   Ú_COMMON_METAÚIMAGENET1K_V1ZIMAGENET1K_V2ÚDEFAULTr*   r*   r*   r+   r   (  sB   
þÿôýþÿôýc                   @   sB   e Zd Zedeedd�edddddd	œid
dddœ–d�ZeZdS )r   zChttps://download.pytorch.org/models/mobilenet_v3_small-047dcff4.pthr�   r�   iÍ& r’   r“   g˜nƒÀêP@g}?5^ºÙU@r”   gÉv¾Ÿ/­?gœÄ °r¨#@z}
                These weights improve upon the results of the original paper by using a simple training recipe.
            r•   r—   N)	r/   r0   r1   r   r   r   rš   r›   rœ   r*   r*   r*   r+   r   T  s"   
þÿôýZ
pretrained)rˆ   T)rˆ   r‰   )rˆ   r‰   rX   rK   c                 K   s*   t  | ¡} td|Ž\}}t||| |f|ŽS )a³  
    Constructs a large MobileNetV3 architecture from
    `Searching for MobileNetV3 <https://arxiv.org/abs/1905.02244>`__.

    Args:
        weights (:class:`~torchvision.models.MobileNet_V3_Large_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.MobileNet_V3_Large_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.mobilenet.MobileNetV3``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/mobilenetv3.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.MobileNet_V3_Large_Weights
        :members:
    r   )r   )r   Úverifyr‡   rŽ   ©rˆ   r‰   rX   rT   rU   r*   r*   r+   r   l  s    
c                 K   s*   t  | ¡} td|Ž\}}t||| |f|ŽS )a³  
    Constructs a small MobileNetV3 architecture from
    `Searching for MobileNetV3 <https://arxiv.org/abs/1905.02244>`__.

    Args:
        weights (:class:`~torchvision.models.MobileNet_V3_Small_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.MobileNet_V3_Small_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.mobilenet.MobileNetV3``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/mobilenetv3.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.MobileNet_V3_Small_Weights
        :members:
    r   )r   )r   r�   r‡   rŽ   rž   r*   r*   r+   r   ‹  s    
)rr   FF).Ú	functoolsr   Útypingr   r   r   r   r   rn   r   r	   Zops.miscr   r   rO   Ztransforms._presetsr   Úutilsr   Z_apir   r   r   Ú_metar   Z_utilsr   r   r   Ú__all__r   rP   r7   r   r4   r5   r3   r‡   r2   rŽ   rš   r   r   r›   r   r   r*   r*   r*   r+   Ú<module>   sx   û	Ak     ÿ    ÿ2úþ, ÿ  þ ÿ  þ