o
    #j$                     @   s   d dl Z d dlm  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 g ZdddZG d	d
 d
ejZG dd dejZG dd dejZdd ZdddZdddZdS )    N)nn)	ParamAttr)AdaptiveAvgPool2DConv2DDropout	MaxPool2D)get_weights_path_from_url)z[https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SqueezeNet1_0_pretrained.pdparamsZ 30b95af60a2178f03cf9b66cd77e1db1)z[https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/SqueezeNet1_1_pretrained.pdparamsZ a11250d3a1f91d7131fd095ebbf09eee)squeezenet1_0squeezenet1_1c                       s&   e Zd Zd fdd	Zdd Z  ZS )MakeFireConvr   c                    s(   t    t||||t t d| _d S )N)paddingweight_attr	bias_attr)super__init__r   r   _conv)selfinput_channelsZoutput_channelsZfilter_sizer   	__class__ `/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/vision/models/squeezenet.pyr   %   s   
zMakeFireConv.__init__c                 C   s   |  |}t|}|S )N)r   Frelu)r   xr   r   r   forward0   s   

zMakeFireConv.forward)r   __name__
__module____qualname__r   r   __classcell__r   r   r   r   r   $   s    r   c                       s$   e Zd Z fddZdd Z  ZS )MakeFirec                    s<   t    t||d| _t||d| _t||ddd| _d S )N      )r   )r   r   r   r   _conv_path1_conv_path2)r   r   Zsqueeze_channelsZexpand1x1_channelsZexpand3x3_channelsr   r   r   r   7   s   
zMakeFire.__init__c                 C   s0   |  |}| |}| |}tj||gddS )Nr"   Zaxis)r   r$   r%   paddleconcat)r   inputsr   x1Zx2r   r   r   r   E   s   


zMakeFire.forwardr   r   r   r   r   r!   6   s    r!   c                       s*   e Zd ZdZd fdd	Zdd Z  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:: python

            >>> 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)
            [1, 1000]
      Tc              	      s  t    || _|| _|| _ddg}||v s J d| d| | jdkr{tddddt t 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dd| _nVtdddddt t 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dd| _tddd| _td|dt t d| _td| _d S )N1.01.1zsupported versions are z but input version is r#   `         )strider   r   r   )Zkernel_sizer2   r      @             0      i  i   r"   )r2   r   r   r   g      ?Zdownscale_in_infer)pmode)r   r   )r   r   versionnum_classes	with_poolr   r   r   r   _poolr!   _conv1_conv2_conv3_conv4_conv5_conv6_conv7_conv8r   _drop_conv9r   	_avg_pool)r   r<   r=   r>   Zsupported_versionsr   r   r   r   m   sb   


	zSqueezeNet.__init__c                 C   s@  |  |}t|}| |}| jdkrG| |}| |}| |}| |}| |}| 	|}| 
|}| |}| |}| |}n2| |}| |}| |}| |}| |}| |}| 	|}| 
|}| |}| |}| jdkr| |}| |}| jrt|}| |}tj|ddgd}|S )Nr-   r   r1   r#   r&   )r   r   r   r?   r<   r@   rA   rB   rC   rD   rE   rF   rG   r=   rH   rI   r>   rJ   r'   Zsqueeze)r   r)   r   r   r   r   r      s@   



























zSqueezeNet.forward)r,   T)r   r   r   __doc__r   r   r    r   r   r   r   r+   L   s     7r+   c                 K   s\   t |fi |}|r,| tv sJ |  dtt|  d t|  d }t|}|| |S )NzJ model do not have a pretrained model now, you should set pretrained=Falser   r"   )r+   
model_urlsr   r'   loadZset_dict)archr<   
pretrainedkwargsmodelZweight_pathparamr   r   r   _squeezenet   s   


rS   Fc                 K      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:: python

            >>> 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)
            [1, 1000]
    r	   r-   rS   rO   rP   r   r   r   r	         r	   c                 K   rT   )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:: python

            >>> 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)
            [1, 1000]
    r
   r.   rU   rV   r   r   r   r
      rW   r
   )F)r'   Zpaddle.nn.functionalr   Z
functionalr   Zpaddle.base.param_attrr   Z	paddle.nnr   r   r   r   Zpaddle.utils.downloadr   __all__rL   ZLayerr   r!   r+   rS   r	   r
   r   r   r   r   <module>   s    }
"