o
    QeB                     @   sN  d dl mZ d dl mZ d dl mZ d dlZd dlZd dlmZ d dlmZm	Z	m
Z
mZ d dlmZmZmZ d dlmZ d dlmZ d d	lmZ g Zd
dd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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)d#d$Z!d)d%d&Z"d)d'd(Z#dS )*    )absolute_import)division)print_functionN)Conv2D	BatchNormLinearDropout)AdaptiveAvgPool2D	MaxPool2D	AvgPool2D)Uniform)	ParamAttr)get_weights_path_from_url)zYhttps://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet121_pretrained.pdparamsZ db1b239ed80a905290fd8b01d3af08e4)zYhttps://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet161_pretrained.pdparamsZ 62158869cb315098bd25ddbfd308a853)zYhttps://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet169_pretrained.pdparamsZ 82cc7c635c3f19098c748850efb2d796)zYhttps://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet201_pretrained.pdparamsZ 16ca29565a7712329cf9e36e02caaf58)zYhttps://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet264_pretrained.pdparamsZ 3270ce516b85370bba88cfdd9f60bff4)densenet121densenet161densenet169densenet201densenet264c                       .   e Zd Z				d fdd	Zdd Z  ZS )	BNACConvLayer   r   reluc              
      s<   t t|   t||d| _t||||||t dd| _d S )NactFZin_channelsZout_channelskernel_sizestridepaddinggroupsweight_attr	bias_attr)superr   __init__r   _batch_normr   r   _convselfnum_channelsnum_filtersfilter_sizer   padr   r   	__class__ MD:\Projects\ConvertPro\env\Lib\site-packages\paddle/vision/models/densenet.pyr"   4   s   zBNACConvLayer.__init__c                 C      |  |}| |}|S N)r#   r$   r&   inputyr-   r-   r.   forwardH      

zBNACConvLayer.forwardr   r   r   r   __name__
__module____qualname__r"   r4   __classcell__r-   r-   r+   r.   r   2       r   c                       $   e Zd Z fddZdd Z  ZS )
DenseLayerc                    s^   t t|   || _t||| dddd| _t|| |dddd| _|r-t|dd| _d S d S )Nr   r   r'   r(   r)   r*   r      Zdownscale_in_infer)pmode)	r!   r>   r"   dropoutr   bn_ac_func1bn_ac_func2r   dropout_func)r&   r'   growth_ratebn_sizerC   r+   r-   r.   r"   P   s"   zDenseLayer.__init__c                 C   s:   |  |}| |}| jr| |}tj||gdd}|S )Nr   )Zaxis)rD   rE   rC   rF   paddleconcat)r&   r2   convr-   r-   r.   r4   c   s   


zDenseLayer.forwardr7   r-   r-   r+   r.   r>   N   s    r>   c                       s(   e Zd Z	d fdd	Zdd Z  ZS )
DenseBlockNc           	         sd   t t|   || _g | _|}t|D ]}| j| d||d t	||||d || }qd S )Nz{}_{}r   )r'   rG   rH   rC   )
r!   rL   r"   rC   dense_layer_funcrangeappendadd_sublayerformatr>   )	r&   r'   
num_layersrH   rG   rC   nameZpre_channellayerr+   r-   r.   r"   n   s"   
zDenseBlock.__init__c                 C   s   |}| j D ]}||}q|S r0   )rM   )r&   r2   rK   funcr-   r-   r.   r4      s   

zDenseBlock.forwardr0   r7   r-   r-   r+   r.   rL   l   s    rL   c                       r=   )TransitionLayerc                    s6   t t|   t||dddd| _tdddd| _d S )Nr   r   r?      r   r   r   )r!   rV   r"   r   conv_ac_funcr   
pool2d_avg)r&   r'   num_output_featuresr+   r-   r.   r"      s   zTransitionLayer.__init__c                 C   r/   r0   )rY   rZ   r1   r-   r-   r.   r4      r5   zTransitionLayer.forwardr7   r-   r-   r+   r.   rV      s    rV   c                       r   )	ConvBNLayerr   r   r   c              
      s<   t t|   t||||||t dd| _t||d| _d S )NFr   r   )r!   r\   r"   r   r   r$   r   r#   r%   r+   r-   r.   r"      s   zConvBNLayer.__init__c                 C   r/   r0   )r$   r#   r1   r-   r-   r.   r4      r5   zConvBNLayer.forwardr6   r7   r-   r-   r+   r.   r\      r<   r\   c                       s4   e Zd ZdZ					d fdd	Zd	d
 Z  ZS )DenseNeta  DenseNet model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.pdf>`_.

    Args:
        layers (int, optional): Layers of DenseNet. Default: 121.
        bn_size (int, optional): Expansion of growth rate in the middle layer. Default: 4.
        dropout (float, optional): Dropout rate. Default: :math:`0.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 DenseNet model.

    Examples:
        .. code-block:: python

            import paddle
            from paddle.vision.models import DenseNet

            # build model
            densenet = DenseNet()

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

            print(out.shape)
            # [1, 1000]
    y                Tc                    s  t t|   || _|| _g d}||v sJ d||ddg dfddg dfddg d	fddg d
fddg dfd}|| \}}	}
td|ddddd| _tdddd| _	|
| _
g | _g | _|}|}t|
D ]N\}}| j| d|d t||||	|dt|d  d |||	  }|}|t|
d kr| j| d|d t||d d |d }|d }qit|dd| _| jrtd| _| jdkrdt|d  }t||tt| |dt d| _d S d S )N)r^              z-supported layers are {} but input layer is {}@       )            `   0   )rh   ri   $   rj   )rh   ri   rg   rg   )rh   ri   rm   rg   )rh   ri   rf   rm   r@      rW   r   )r'   r(   r)   r   r*   r   r   rX   z
db_conv_{}rK   )r'   rR   rH   rG   rC   rS   ztr_conv{}_blk)r'   r[   r   r   g      ?)Zinitializer)r   r    )r!   r]   r"   num_classes	with_poolrQ   r\   
conv1_funcr
   
pool2d_maxblock_configdense_block_func_listtransition_func_list	enumeraterO   rP   rL   strlenrV   r   
batch_normr	   rZ   mathsqrtr   r   r   out)r&   layersrH   rC   rp   rq   Zsupported_layersZdensenet_specZnum_init_featuresrG   rt   Zpre_num_channelsZnum_featuresirR   Zstdvr+   r-   r.   r"      s   



zDenseNet.__init__c                 C   s   |  |}| |}t| jD ]\}}| j| |}|t| jd kr*| j| |}q| |}| jr8| 	|}| j
dkrJtj|ddd}| |}|S )Nr   r   )Z
start_axisZ	stop_axis)rr   rs   rw   rt   ru   ry   rv   rz   rq   rZ   rp   rI   flattenr}   )r&   r2   rK   r   rR   r3   r-   r-   r.   r4     s   





zDenseNet.forward)r^   r_   r`   ra   T)r8   r9   r:   __doc__r"   r4   r;   r-   r-   r+   r.   r]      s    Er]   c                 K   s^   t dd|i|}|r-| tv sJ d| tt|  d t|  d }t|}|| |S )Nr~   zL{} model do not have a pretrained model now, you should set pretrained=Falser   r   r-   )r]   
model_urlsrQ   r   rI   loadZset_dict)archr~   
pretrainedkwargsmodelZweight_pathparamr-   r-   r.   	_densenet3  s   


r   Fc                 K      t dd| fi |S )a  DenseNet 121-layer model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.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:`DenseNet <api_paddle_vision_DenseNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of DenseNet 121-layer model.

    Examples:
        .. code-block:: python

            import paddle
            from paddle.vision.models import densenet121

            # build model
            model = densenet121()

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

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

            print(out.shape)
            # [1, 1000]
    r   r^   r   r   r   r-   r-   r.   r   A     r   c                 K   r   )a'  DenseNet 161-layer model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.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:`DenseNet <api_paddle_vision_DenseNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of DenseNet 161-layer model.

    Examples:
        .. code-block:: python

            from paddle.vision.models import densenet161

            # build model
            model = densenet161()

            # build model and load imagenet pretrained weight
            # model = densenet161(pretrained=True)
    r   rb   r   r   r-   r-   r.   r   b  s   r   c                 K   r   )a  DenseNet 169-layer model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.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:`DenseNet <api_paddle_vision_DenseNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of DenseNet 169-layer model.

    Examples:
        .. code-block:: python

            import paddle
            from paddle.vision.models import densenet169

            # build model
            model = densenet169()

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

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

            print(out.shape)
            # [1, 1000]
    r   rc   r   r   r-   r-   r.   r   |  r   r   c                 K   r   )a  DenseNet 201-layer model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.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:`DenseNet <api_paddle_vision_DenseNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of DenseNet 201-layer model.

    Examples:
        .. code-block:: python

            import paddle
            from paddle.vision.models import densenet201

            # build model
            model = densenet201()

            # build model and load imagenet pretrained weight
            # model = densenet201(pretrained=True)
            x = paddle.rand([1, 3, 224, 224])
            out = model(x)

            print(out.shape)
            # [1, 1000]
    r   rd   r   r   r-   r-   r.   r     s   r   c                 K   r   )a  DenseNet 264-layer model from
    `"Densely Connected Convolutional Networks" <https://arxiv.org/pdf/1608.06993.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:`DenseNet <api_paddle_vision_DenseNet>`.

    Returns:
        :ref:`api_paddle_nn_Layer`. An instance of DenseNet 264-layer model.

    Examples:
        .. code-block:: python

            import paddle
            from paddle.vision.models import densenet264

            # build model
            model = densenet264()

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

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

            print(out.shape)
            # [1, 1000]
    r   re   r   r   r-   r-   r.   r     r   r   )F)$
__future__r   r   r   r{   rI   Z	paddle.nnnnr   r   r   r   r	   r
   r   Zpaddle.nn.initializerr   Zpaddle.fluid.param_attrr   Zpaddle.utils.downloadr   __all__r   ZLayerr   r>   rL   rV   r\   r]   r   r   r   r   r   r   r-   r-   r-   r.   <module>   s<   y

!

! 