
    |jD                    :   U d dl mZ d dlZd dlmZ d dlmZ d dlZd dlmZ d dl	m
Z
 d dlmZmZmZmZmZmZmZ d dlmZ d d	lmZ er0d d
lmZmZ d dlmZ d dlmZ d dlmZ ed         Z G d de          Zg ZddddddZ de!d<    G d dej"                  Z# G d dej"                  Z$ G d dej"                  Z% G d dej"                  Z& G d  d!ej"                  Z' G d" d#ej"                  Z(d4d-Z)	 d5d6d/Z*	 d5d6d0Z+	 d5d6d1Z,	 d5d6d2Z-	 d5d6d3Z.dS )7    )annotationsN)TYPE_CHECKING)Unpack)nn)	ParamAttr)AdaptiveAvgPool2D	AvgPool2D	BatchNormConv2DDropoutLinear	MaxPool2D)Uniform)get_weights_path_from_url)Literal	TypedDict)NotRequired)Tensor)Size2)densenet121densenet161densenet169densenet201densenet264c                  8    e Zd ZU ded<   ded<   ded<   ded<   dS )	_DenseNetOptionszNotRequired[int]bn_sizezNotRequired[float]dropoutnum_classeszNotRequired[bool]	with_poolN)__name__
__module____qualname____annotations__     m/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/paddle/vision/models/densenet.pyr   r   4   sB         !!!!####%%%%$$$$$$r&   r   )zYhttps://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet121_pretrained.pdparams db1b239ed80a905290fd8b01d3af08e4)zYhttps://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet161_pretrained.pdparams 62158869cb315098bd25ddbfd308a853)zYhttps://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet169_pretrained.pdparams 82cc7c635c3f19098c748850efb2d796)zYhttps://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet201_pretrained.pdparams 16ca29565a7712329cf9e36e02caaf58)zYhttps://paddle-imagenet-models-name.bj.bcebos.com/dygraph/DenseNet264_pretrained.pdparams 3270ce516b85370bba88cfdd9f60bff4zdict[str, tuple[str, str]]
model_urlsc                  2     e Zd Z	 	 	 	 dd fdZddZ xZS )BNACConvLayer   r   relunum_channelsintnum_filtersfilter_sizer   stridepadgroupsactstrreturnNonec           
         t                                                       t          ||          | _        t	          ||||||t                      d          | _        d S )Nr9   Fin_channelsout_channelskernel_sizer6   paddingr8   weight_attr	bias_attr)super__init__r
   _batch_normr   r   _conv	selfr2   r4   r5   r6   r7   r8   r9   	__class__s	           r'   rG   zBNACConvLayer.__init__V   sf     	$\s;;;$$#!	
 	
 	



r&   inputr   c                Z    |                      |          }|                     |          }|S N)rH   rI   rK   rM   ys      r'   forwardzBNACConvLayer.forwardn   s)    U##JJqMMr&   r0   r   r0   r1   r2   r3   r4   r3   r5   r   r6   r   r7   r   r8   r3   r9   r:   r;   r<   rM   r   r;   r   r!   r"   r#   rG   rR   __classcell__rL   s   @r'   r/   r/   U   sd         
 
 
 
 
 
 
0       r&   r/   c                  4     e Zd ZU ded<   d fd	ZddZ xZS )
DenseLayerfloatr   r2   r3   growth_rater   r;   r<   c                    t                                                       || _        t          |||z  ddd          | _        t          ||z  |ddd          | _        |rt          |d          | _        d S d S )Nr0   r   r2   r4   r5   r7   r6      downscale_in_infer)pmode)rF   rG   r   r/   bn_ac_func1bn_ac_func2r   dropout_func)rK   r2   r\   r   r   rL   s        r'   rG   zDenseLayer.__init__w   s     	(%+-
 
 
 ) ;.#
 
 
  	N ''8L M M MD	N 	Nr&   rM   r   c                    |                      |          }|                     |          }| j        r|                     |          }t	          j        ||gd          }|S )Nr0   )axis)rc   rd   r   re   paddleconcat)rK   rM   convs      r'   rR   zDenseLayer.forward   sb    &&%%< 	+$$T**D}eT]333r&   )
r2   r3   r\   r3   r   r3   r   r[   r;   r<   rU   r!   r"   r#   r$   rG   rR   rW   rX   s   @r'   rZ   rZ   t   sb         NNNN N N N N N2       r&   rZ   c                  8     e Zd ZU ded<   	 dd fdZddZ xZS )
DenseBlockr[   r   Nr2   r3   
num_layersr   r\   name
str | Noner;   r<   c                $   t                                                       || _        g | _        |}t	          |          D ]N}| j                            |                     | d|dz    t          ||||                               ||z   }Od S )N_r0   )r2   r\   r   r   )rF   rG   r   dense_layer_funcrangeappendadd_sublayerrZ   )
rK   r2   rn   r   r\   r   ro   pre_channellayerrL   s
            r'   rG   zDenseBlock.__init__   s     	 "":&& 	4 	4E!((!!))eai))%0$/ ' '	   
 
 
 &3KK	4 	4r&   rM   r   c                4    |}| j         D ]} ||          }|S rO   )rs   )rK   rM   rj   funcs       r'   rR   zDenseBlock.forward   s-    ) 	 	D4::DDr&   rO   )r2   r3   rn   r3   r   r3   r\   r3   r   r[   ro   rp   r;   r<   rU   rk   rX   s   @r'   rm   rm      sf         NNN  4 4 4 4 4 4 48       r&   rm   c                  (     e Zd Zd
 fdZdd	Z xZS )TransitionLayerr2   r3   num_output_featuresr;   r<   c                    t                                                       t          ||ddd          | _        t	          ddd          | _        d S )Nr0   r   r^      rB   r6   rC   )rF   rG   r/   conv_ac_funcr	   
pool2d_avg)rK   r2   r}   rL   s      r'   rG   zTransitionLayer.__init__   s[    )%+
 
 
 $!QGGGr&   rM   r   c                Z    |                      |          }|                     |          }|S rO   )r   r   rP   s      r'   rR   zTransitionLayer.forward   s+    e$$OOAr&   )r2   r3   r}   r3   r;   r<   rU   rV   rX   s   @r'   r|   r|      sW        H H H H H H       r&   r|   c                  2     e Zd Z	 	 	 	 dd fdZddZ xZS )ConvBNLayerr0   r   r1   r2   r3   r4   r5   r   r6   r7   r8   r9   r:   r;   r<   c           
         t                                                       t          ||||||t                      d          | _        t          ||          | _        d S )NFr?   r>   )rF   rG   r   r   rI   r
   rH   rJ   s	           r'   rG   zConvBNLayer.__init__   sj     	$$#!	
 	
 	

 %[c:::r&   rM   r   c                Z    |                      |          }|                     |          }|S rO   )rI   rH   rP   s      r'   rR   zConvBNLayer.forward   s+    JJuQr&   rS   rT   rU   rV   rX   s   @r'   r   r      sd         ; ; ; ; ; ; ;0       r&   r   c                  N     e Zd ZU dZded<   ded<   	 	 	 	 	 dd fdZddZ x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:: pycon

            >>> 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)
            paddle.Size([1, 1000])
    r3   r   boolr    y                Tlayersr   r   r[   r;   r<   c                t   t                                                       || _        || _        g d}||v sJ d| 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          | _        t          ddd          | _        |
| _        g | _	        g | _
        |}|}t          |
          D ]\  }}| j	                            |                     d|dz    t          ||||	|dt          |dz             z                                  |||	z  z   }|}|t!          |
          dz
  k    rQ| j
                            |                     d|dz    dt#          ||dz                                 |dz  }|dz  }t%          |d          | _        | j        rt)          d          | _        | j        dk    r]dt-          j        |dz            z  }t1          ||t3          t5          | |                    t3                                | _        d S d S )N)r              zsupported layers are z but input layer is @       )            `   0   )r   r   $   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   r_      r   r1   )r2   r4   r5   r6   r7   r9   r0   r   db_conv_rj   )r2   rn   r   r\   r   ro   tr_conv_blk)r2   r}   r>   r   g      ?)initializer)rD   rE   )rF   rG   r   r    r   
conv1_funcr   
pool2d_maxblock_configdense_block_func_listtransition_func_list	enumerateru   rv   rm   r:   lenr|   r
   
batch_normr   r   mathsqrtr   r   r   out)rK   r   r   r   r   r    supported_layersdensenet_specnum_init_featuresr\   r   pre_num_channelsnum_featuresirn   stdvrL   s                   r'   rG   zDenseNet.__init__  s    	&"444))))R$4RR&RR *)) b///*b///*b///*b///*b///*
 
 8EV7L4;%)
 
 
 $!QGGG(%'"$&!,(&|44 	1 	1MAz&--!!&q1u&&%5#- '$/ '#c!a%jj0  
 
   (*{*BBL+C%%))))00%%-!a%---')90<0A      $01#4 +q0#Lf===> 	3/22DOa<##5666D%'4%2F2FGGG#++	  DHHH  r&   rM   r   c                   |                      |          }|                     |          }t          | j                  D ]L\  }} | j        |         |          }|t          | j                  dz
  k    r | j        |         |          }M|                     |          }| j        r| 	                    |          }| j
        dk    r,t          j        |dd          }|                     |          }|S )Nr0   r   )
start_axis	stop_axis)r   r   r   r   r   r   r   r   r    r   r   rh   flattenr   )rK   rM   rj   r   rn   rQ   s         r'   rR   zDenseNet.forwardf  s    u%%t$$&t'899 	: 	:MAz04-a066DC)**Q...3t03D99t$$> 	&%%AaqQ"===AAr&   )r   r   r   r   T)r   r3   r   r3   r   r[   r   r3   r    r   r;   r<   rU   )r!   r"   r#   __doc__r$   rG   rR   rW   rX   s   @r'   r   r      s          < OOO P P P P P P Pd       r&   r   arch_DenseNetArchr   r3   
pretrainedr   kwargsUnpack[_DenseNetOptions]r;   c                   t          dd|i|}|rq| t          v sJ |  d            t          t          |          d         t          |          d                   }t          j        |          }|                    |           |S )Nr   zJ model do not have a pretrained model now, you should set pretrained=Falser   r0   r%   )r   r-   r   rh   loadset_dict)r   r   r   r   modelweight_pathparams          r'   	_densenetr   {  s     --F-f--E 	z!!!___ "!! 0tQD!1!!4
 
 K((uLr&   Fc                     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_models_DenseNet>`.

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

    Examples:
        .. code-block:: pycon

            >>> 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)
            paddle.Size([1, 1000])
    r   r   r   r   r   s     r'   r   r         @ ]C>>v>>>r&   c                     t          dd| fi |S )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_models_DenseNet>`.

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

    Examples:
        .. code-block:: pycon

            >>> import paddle
            >>> from paddle.vision.models import densenet161

            >>> # Build model
            >>> model = densenet161()

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

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

            >>> print(out.shape)
            paddle.Size([1, 1000])
    r   r   r   r   s     r'   r   r     r   r&   c                     t          dd| fi |S )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_models_DenseNet>`.

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

    Examples:
        .. code-block:: pycon

            >>> 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)
            paddle.Size([1, 1000])
    r   r   r   r   s     r'   r   r     r   r&   c                     t          dd| fi |S )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_models_DenseNet>`.

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

    Examples:
        .. code-block:: pycon

            >>> 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)
            paddle.Size([1, 1000])
    r   r   r   r   s     r'   r   r     s    > ]C>>v>>>r&   c                     t          dd| fi |S )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_models_DenseNet>`.

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

    Examples:
        .. code-block:: pycon

            >>> 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)
            paddle.Size([1, 1000])
    r   r   r   r   s     r'   r   r     r   r&   )
r   r   r   r3   r   r   r   r   r;   r   )F)r   r   r   r   r;   r   )/
__future__r   r   typingr   typing_extensionsr   rh   r   paddle.base.param_attrr   	paddle.nnr   r	   r
   r   r   r   r   paddle.nn.initializerr   paddle.utils.downloadr   r   r   r   r   paddle._typingr   r   r   __all__r-   r$   Layerr/   rZ   rm   r|   r   r   r   r   r   r   r   r   r%   r&   r'   <module>r      s   # " " " " " "              $ $ $ $ $ $        , , , , , ,                  * ) ) ) ) ) ; ; ; ; ; ; %))))))))------$$$$$$	M% % % % %9 % % % #* *
    0    BH   >" " " " " " " "J# # # # # # # #L    bh   (    "(   >F F F F Frx F F FR   ,  ?  ?  ?  ?  ?H  ?  ?  ?  ?  ?H  ?  ?  ?  ?  ?H ? ? ? ? ?F  ?  ?  ?  ?  ?  ?  ?r&   