
    |j'                    `   d dl mZ d dlmZmZ d dlmZmZ d dlZd dl	m
c mZ d dlm
Z
 d dlmZ d dlmZmZmZmZ d dlmZ erd d	lmZ d d
lmZ  G d de          Zg ZdddZ G d de
j                  Z G d de
j                  Z G d de
j                  Zd"dZ 	 d#d$d Z!	 d#d$d!Z"dS )%    )annotations)TYPE_CHECKING	TypedDict)NotRequiredUnpackN)nn)	ParamAttr)AdaptiveAvgPool2DConv2DDropout	MaxPool2D)get_weights_path_from_url)Tensor)Size2c                  $    e Zd ZU ded<   ded<   dS )_SqueezeNetOptionszNotRequired[int]num_classeszNotRequired[bool]	with_poolN)__name__
__module____qualname____annotations__     o/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/paddle/vision/models/squeezenet.pyr   r   #   s*         %%%%$$$$$$r   r   )z[https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SqueezeNet1_0_pretrained.pdparams 30b95af60a2178f03cf9b66cd77e1db1)z[https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SqueezeNet1_1_pretrained.pdparams a11250d3a1f91d7131fd095ebbf09eee)squeezenet1_0squeezenet1_1c                  ,     e Zd Z	 dd fd
ZddZ xZS )MakeFireConvr   input_channelsintoutput_channelsfilter_sizer   paddingreturnNonec           	         t                                                       t          ||||t                      t                                | _        d S )N)r&   weight_attr	bias_attr)super__init__r   r	   _conv)selfr"   r$   r%   r&   	__class__s        r   r-   zMakeFireConv.__init__7   sO     	!kk
 
 



r   xr   c                X    |                      |          }t          j        |          }|S )N)r.   Frelu)r/   r1   s     r   forwardzMakeFireConv.forwardH   s#    JJqMMF1IIr   )r   )
r"   r#   r$   r#   r%   r   r&   r   r'   r(   )r1   r   r'   r   r   r   r   r-   r5   __classcell__r0   s   @r   r!   r!   6   s[         
 
 
 
 
 
 
"       r   r!   c                  (     e Zd Zd fdZddZ xZS )MakeFirer"   r#   squeeze_channelsexpand1x1_channelsexpand3x3_channelsr'   r(   c                    t                                                       t          ||d          | _        t          ||d          | _        t          ||dd          | _        d S )N      )r&   )r,   r-   r!   r.   _conv_path1_conv_path2)r/   r"   r;   r<   r=   r0   s        r   r-   zMakeFire.__init__O   sl     	!.2BAFF
'(8:LaPP'0!Q
 
 
r   inputsr   c                    |                      |          }|                     |          }|                     |          }t          j        ||gd          S )Nr?   axis)r.   rA   rB   paddleconcat)r/   rC   r1   x1x2s        r   r5   zMakeFire.forward]   sR    JJva  a  }b"XA....r   )
r"   r#   r;   r#   r<   r#   r=   r#   r'   r(   rC   r   r'   r   r6   r8   s   @r   r:   r:   N   sQ        
 
 
 
 
 
/ / / / / / / /r   r:   c                  P     e Zd ZU dZded<   ded<   ded<   	 dd fdZddZ xZS )
SqueezeNeta  SqueezeNet model from
    `"SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size"
    <https://arxiv.org/pdf/1602.07360.pdf>`_.

    Args:
        version (str): Version of SqueezeNet, which can be "1.0" or "1.1".
        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 SqueezeNet model.

    Examples:
        .. code-block:: pycon

            >>> import paddle
            >>> from paddle.vision.models import SqueezeNet

            >>> # build v1.0 model
            >>> model = SqueezeNet(version='1.0')

            >>> # build v1.1 model
            >>> # model = SqueezeNet(version='1.1')

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

            >>> print(out.shape)
            paddle.Size([1, 1000])
    strversionr#   r   boolr     Tr'   r(   c           
     z   t                                                       || _        || _        || _        ddg}||v sJ d| d|             | j        dk    rt          ddddt                      t                      	          | _        t          ddd
          | _	        t          dddd          | _        t          dddd          | _        t          dddd          | _        t          dddd          | _        t          dddd          | _        t          dddd          | _        t          dddd          | _        t          dddd          | _        nt          dddddt                      t                                | _        t          ddd
          | _	        t          dddd          | _        t          dddd          | _        t          dddd          | _        t          dddd          | _        t          dddd          | _        t          dddd          | _        t          dddd          | _        t          dddd          | _        t'          dd          | _        t          d|dt                      t                                | _        t-          d          | _        d S )N1.01.1zsupported versions are z but input version is r@   `         )strider*   r+   r   )kernel_sizerX   r&      @             0      i  i   r?   )rX   r&   r*   r+   g      ?downscale_in_infer)pmode)r*   r+   )r,   r-   rO   r   r   r   r	   r.   r   _poolr:   _conv1_conv2_conv3_conv4_conv5_conv6_conv7_conv8r   _drop_conv9r
   	_avg_pool)r/   rO   r   r   supported_versionsr0   s        r   r-   zSqueezeNet.__init__   s    	&"#U^,,,,Y&8YYPWYY -,, <5  %KK#++  DJ #qAFFFDJ"2r2r22DK"3B33DK"3C55DK"3C55DK"3C55DK"3C55DK"3C55DK"3C55DKK%KK#++  DJ #qAFFFDJ"2r2r22DK"3B33DK"3C55DK"3C55DK"3C55DK"3C55DK"3C55DK"3C55DKs)=>>>
aY[[IKK
 
 
 +1--r   rC   r   c                   |                      |          }t          j        |          }|                     |          }| j        dk    r|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }| 	                    |          }| 
                    |          }|                     |          }|                     |          }|                     |          }n|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }| 	                    |          }| 
                    |          }|                     |          }|                     |          }| j        dk    r*|                     |          }|                     |          }| j        rAt          j        |          }|                     |          }t%          j        |ddg          }|S )NrS   r   rW   r@   rE   )r.   r3   r4   rd   rO   re   rf   rg   rh   ri   rj   rk   rl   r   rm   rn   r   ro   rG   squeeze)r/   rC   r1   s      r   r5   zSqueezeNet.forward   s   JJvF1IIJJqMM<5  AAAAAA

1AAAAAAAAA

1AAAAAAAA

1AAAAA

1AAAAAAAAAa

1AAA> 	/q		Aq!!Aq1v...Ar   )rQ   T)rO   rN   r   r#   r   rP   r'   r(   rK   )r   r   r   __doc__r   r-   r5   r7   r8   s   @r   rM   rM   d   s          @ LLLOOO HL7. 7. 7. 7. 7. 7. 7.r" " " " " " " "r   rM   archrN   rO   
pretrainedrP   kwargsUnpack[_SqueezeNetOptions]r'   c                   t          |f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?   )rM   
model_urlsr   rG   loadset_dict)rt   rO   ru   rv   modelweight_pathparams          r   _squeezenetr      s     w))&))E z!!!___ "!! 0tQD!1!!4
 
 K((uLr   Fc                     t          dd| fi |S )a(  SqueezeNet v1.0 model from
    `"SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size"
    <https://arxiv.org/pdf/1602.07360.pdf>`_.

    Args:
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`SqueezeNet <api_paddle_vision_models_SqueezeNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of SqueezeNet v1.0 model.

    Examples:
        .. code-block:: pycon

            >>> import paddle
            >>> from paddle.vision.models import squeezenet1_0

            >>> # build model
            >>> model = squeezenet1_0()

            >>> # build model and load imagenet pretrained weight
            >>> # model = squeezenet1_0(pretrained=True)

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

            >>> print(out.shape)
            paddle.Size([1, 1000])
    r   rS   r   ru   rv   s     r   r   r          B zDDVDDDr   c                     t          dd| fi |S )a(  SqueezeNet v1.1 model from
    `"SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size"
    <https://arxiv.org/pdf/1602.07360.pdf>`_.

    Args:
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`SqueezeNet <api_paddle_vision_models_SqueezeNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of SqueezeNet v1.1 model.

    Examples:
        .. code-block:: pycon

            >>> import paddle
            >>> from paddle.vision.models import squeezenet1_1

            >>> # build model
            >>> model = squeezenet1_1()

            >>> # build model and load imagenet pretrained weight
            >>> # model = squeezenet1_1(pretrained=True)

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

            >>> print(out.shape)
            paddle.Size([1, 1000])
    r   rT   r   r   s     r   r   r     r   r   )
rt   rN   rO   rN   ru   rP   rv   rw   r'   rM   )F)ru   rP   rv   rw   r'   rM   )#
__future__r   typingr   r   typing_extensionsr   r   rG   paddle.nn.functionalr   
functionalr3   paddle.base.param_attrr	   	paddle.nnr
   r   r   r   paddle.utils.downloadr   r   paddle._typingr   r   __all__ry   Layerr!   r:   rM   r   r   r   r   r   r   <module>r      s@   # " " " " "       
 2 1 1 1 1 1 1 1                          , , , , , , C C C C C C C C C C C C ; ; ; ; ; ; %$$$$$$% % % % %Y % % %
 	 	
    28   0/ / / / /rx / / /,@ @ @ @ @ @ @ @F   * !E !E !E !E !EJ !E !E !E !E !E !E !Er   