
    {-jZ                       d dl mZ d dlmZmZmZ d dlmZmZ d dl	Z	d dl	m
Z
 d dlmZ ddlmZ d	d
lmZ erd dl	mZ  G d de          Zg ZddiZ G d de
j                  Z G d de
j                  Z	 d!d"dZ	 	 d#d$d ZdS )%    )annotations)TYPE_CHECKINGCallable	TypedDict)NotRequiredUnpackN)nn)get_weights_path_from_url   )ConvNormActivation   )_make_divisible)Tensorc                  $    e Zd ZU ded<   ded<   dS )_MobileNetV2OptionszNotRequired[int]num_classeszNotRequired[bool]	with_poolN)__name__
__module____qualname____annotations__     `/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/paddle/vision/models/mobilenetv2.pyr   r   #   s*         %%%%$$$$$$r   r   zmobilenetv2_1.0)zChttps://paddle-hapi.bj.bcebos.com/models/mobilenet_v2_x1.0.pdparams 0340af0a901346c8d46f4529882fb63dc                  6     e Zd Zej        fd fdZddZ xZS )InvertedResidualinpintoupstrideexpand_ratiofloat
norm_layerCallable[..., nn.Layer]returnNonec                   t                                                       || _        |dv s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 S )N)r   r   r   kernel_sizer$   activation_layer)r!   groupsr$   r+   r   F)	bias_attr)super__init__r!   r   rounduse_res_connectappendr   r	   ReLU6extendConv2D
Sequentialconv)	selfr   r    r!   r"   r$   
hidden_dimlayers	__class__s	           r   r/   zInvertedResidual.__init__3   s,    	s\12233
#{a/>C3J1MM" !)%'X     	"!%)%'X   	*c1aeDDD
3	
 	
 	
 M6*			r   xr   c                j    | j         r||                     |          z   S |                     |          S )N)r1   r7   r8   r<   s     r   forwardzInvertedResidual.forward]   s2     	 tyy||##99Q<<r   )r   r   r    r   r!   r   r"   r#   r$   r%   r&   r'   r<   r   r&   r   )r   r   r   r	   BatchNorm2Dr/   r?   __classcell__r;   s   @r   r   r   2   s^         /1n(+ (+ (+ (+ (+ (+ (+T               r   r   c                  J     e Zd ZU dZded<   ded<   	 	 	 dd fdZddZ xZS )MobileNetV2ag  MobileNetV2 model from
    `"MobileNetV2: Inverted Residuals and Linear Bottlenecks" <https://arxiv.org/abs/1801.04381>`_.

    Args:
        scale (float, optional): Scale of channels in each layer. Default: 1.0.
        num_classes (int, optional): Output dim of last fc layer. If num_classes <= 0, last fc layer
            will not be defined. Default: 1000.
        with_pool (bool, optional): Use pool before the last fc layer or not. Default: True.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of MobileNetV2 model.

    Examples:
        .. code-block:: pycon

            >>> import paddle
            >>> from paddle.vision.models import MobileNetV2

            >>> model = MobileNetV2()

            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)

            >>> print(out.shape)
            paddle.Size([1, 1000])
    r   r   boolr         ?  Tscaler#   r&   r'   c                   t                                                       || _        || _        d}d}t          }d}t
          j        }g dg dg dg dg dg d	g d
g}	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        |
 | _        |rt          j        d          | _        | j        dk    rFt          j        t          j        d          t          j        | j	        |                    | _        d S d S )N    i      )r      r   r   )      r   r   )rN   rK      r   )rN   @      r   )rN   `   rP   r   )rN      rP   r   )rN   i@  r   r   rG   rP   r   )r!   r$   r+   r   r   )r"   r$   r)   g?)r.   r/   r   r   r   r	   rA   r   maxlast_channelr   r3   ranger2   r6   featuresAdaptiveAvgPool2D
pool2d_avgDropoutLinear
classifier)r8   rI   r   r   input_channelrV   blockround_nearestr$   inverted_residual_settingrX   tcnsoutput_channelir!   r;   s                     r   r/   zMobileNetV2.__init__   s.    	&" ^
MMMMMMMMMMNNNN%
! ((=}MM+3sE??*M
 
 %!#  
 4 	/ 	/JAq!Q,QYFFN1XX / /1ff!E%&%&#-     !// 	!%!#  	
 	
 	
 x0 	6 2155DOa m
34+<k!J!J DOOO  r   r<   r   c                    |                      |          }| j        r|                     |          }| j        dk    r*t	          j        |d          }|                     |          }|S )Nr   r   )rX   r   rZ   r   paddleflattenr]   r>   s     r   r?   zMobileNetV2.forward   sc    MM!> 	#""Aaq!$$A""Ar   )rG   rH   T)rI   r#   r   r   r   rF   r&   r'   r@   )r   r   r   __doc__r   r/   r?   rB   rC   s   @r   rE   rE   d   s          6 OOO 	H H H H H H HT	 	 	 	 	 	 	 	r   rE   Farchstr
pretrainedrF   kwargsUnpack[_MobileNetV2Options]r&   c                   t          di |}|rq| t          v sJ |  d            t          t          |          d         t          |          d                   }t          j        |          }|                    |           |S )NzJ model do not have a pretrained model now, you should set pretrained=Falser   r   r   )rE   
model_urlsr
   ri   load	load_dict)rl   rn   ro   modelweight_pathparams         r   
_mobilenetrx      s     !!&!!E 	z!!!___ "!! 0tQD!1!!4
 
 K((Lr   rG   rI   r#   c                F    t          dt          |          z   | fd|i|}|S )a  MobileNetV2 from
    `"MobileNetV2: Inverted Residuals and Linear Bottlenecks" <https://arxiv.org/abs/1801.04381>`_.

    Args:
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained on ImageNet. Default: False.
        scale (float, optional): Scale of channels in each layer. Default: 1.0.
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`MobileNetV2 <api_paddle_vision_models_MobileNetV2>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of MobileNetV2 model.

    Examples:
        .. code-block:: pycon

            >>> import paddle
            >>> from paddle.vision.models import mobilenet_v2

            >>> # Build model
            >>> model = mobilenet_v2()

            >>> # Build model and load imagenet pretrained weight
            >>> # model = mobilenet_v2(pretrained=True)

            >>> # Build mobilenet v2 with scale=0.5
            >>> model = mobilenet_v2(scale=0.5)

            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)

            >>> print(out.shape)
            paddle.Size([1, 1000])
    mobilenetv2_rI   )rx   rm   )rn   rI   ro   ru   s       r   mobilenet_v2r{      s@    J U#Z 7<@F E Lr   )F)rl   rm   rn   rF   ro   rp   r&   rE   )FrG   )rn   rF   rI   r#   ro   rp   r&   rE   )
__future__r   typingr   r   r   typing_extensionsr   r   ri   r	   paddle.utils.downloadr
   opsr   _utilsr   r   r   __all__rr   Layerr   rE   rx   r{   r   r   r   <module>r      s   # " " " " "          2 1 1 1 1 1 1 1        ; ; ; ; ; ; $ $ $ $ $ $ # # # # # # %% % % % %i % % %
   
/  /  /  /  / rx /  /  / dr r r r r"( r r rl #(    & ( ( ( ( ( ( (r   