Ë
    –\;jË@  ã                   ó¦  — d dl 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 g Zddd	d
ddœ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 G d„ dej&                  «      Zd„ Zdd„Zdd„Zdd„Zdd„Zdd„Zy) é    N)Únn)Ú	ParamAttr)ÚAdaptiveAvgPool2DÚ	AvgPool2DÚ	BatchNormÚConv2DÚDropoutÚLinearÚ	MaxPool2D)ÚUniform)Úget_weights_path_from_url)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Ú 3270ce516b85370bba88cfdd9f60bff4)Údensenet121Údensenet161Údensenet169Údensenet201Údensenet264c                   ó.   ‡ — e Zd Z	 	 	 	 dˆ fd„	Zd„ Zˆ xZS )ÚBNACConvLayerc           
      ó†   •— t         ‰| �  «        t        ||¬«      | _        t	        ||||||t        «       d¬«      | _        y )N©ÚactF©Úin_channelsÚout_channelsÚkernel_sizeÚstrideÚpaddingÚgroupsÚweight_attrÚ	bias_attr)ÚsuperÚ__init__r   Ú_batch_normr   r   Ú_conv©	ÚselfÚnum_channelsÚnum_filtersÚfilter_sizer!   Úpadr#   r   Ú	__class__s	           €úfG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\paddle/vision/models/densenet.pyr'   zBNACConvLayer.__init__;   sE   ø€ ô 	‰ÑÔÜ$ \°sÔ;ˆÔäØ$Ø$Ø#ØØØÜ!›Øô	
ˆ�
ó    c                 óJ   — | j                  |«      }| j                  |«      }|S ©N)r(   r)   ©r+   ÚinputÚys      r1   ÚforwardzBNACConvLayer.forwardS   s$   € Ø×Ñ˜UÓ#ˆØ�J‰J�q‹MˆØˆr2   ©é   r   r:   Úrelu©Ú__name__Ú
__module__Ú__qualname__r'   r8   Ú__classcell__©r0   s   @r1   r   r   :   s   ø„ ð ØØØõ
ö0r2   r   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )Ú
DenseLayerc                 óº   •— t         ‰| �  «        || _        t        |||z  ddd¬«      | _        t        ||z  |ddd¬«      | _        |rt        |d¬«      | _        y y )Nr:   r   ©r,   r-   r.   r/   r!   é   Údownscale_in_infer)ÚpÚmode)r&   r'   Údropoutr   Úbn_ac_func1Úbn_ac_func2r	   Údropout_func)r+   r,   Úgrowth_rateÚbn_sizerJ   r0   s        €r1   r'   zDenseLayer.__init__Z   ss   ø€ Ü‰ÑÔØˆŒä(Ø%Ø +Ñ-ØØØô
ˆÔô )Ø  ;Ñ.Ø#ØØØô
ˆÔñ Ü '¨'Ð8LÔ MˆDÕð r2   c                 ó¶   — | j                  |«      }| j                  |«      }| j                  r| j                  |«      }t	        j
                  ||gd¬«      }|S )Nr:   )Úaxis)rK   rL   rJ   rM   ÚpaddleÚconcat)r+   r6   Úconvs      r1   r8   zDenseLayer.forwardq   sR   € Ø×Ñ Ó&ˆØ×Ñ Ó%ˆØ�<Š<Ø×$Ñ$ TÓ*ˆDÜ�}‰}˜e T˜]°Ô3ˆØˆr2   r<   rA   s   @r1   rC   rC   Y   s   ø„ ôNö.r2   rC   c                   ó(   ‡ — e Zd Z	 dˆ fd„	Zd„ Zˆ xZS )Ú
DenseBlockc                 óì   •— t         ‰	| �  «        || _        g | _        |}t	        |«      D ]G  }| j                  j                  | j                  |› d|dz   › �t        ||||¬«      «      «       ||z   }ŒI y )NÚ_r:   )r,   rN   rO   rJ   )r&   r'   rJ   Údense_layer_funcÚrangeÚappendÚadd_sublayerrC   )
r+   r,   Ú
num_layersrO   rN   rJ   ÚnameÚpre_channelÚlayerr0   s
            €r1   r'   zDenseBlock.__init__{   s‡   ø€ ô 	‰ÑÔØˆŒØ "ˆÔà"ˆÜ˜:Ö&ˆEØ×!Ñ!×(Ñ(Ø×!Ñ!Ø�f˜A˜e a™i˜[Ð)ÜØ%0Ø$/Ø 'Ø 'ô	óô
ð &¨Ñ3‰Kñ 'r2   c                 ó<   — |}| j                   D ]
  } ||«      }Œ |S r4   )rY   )r+   r6   rT   Úfuncs       r1   r8   zDenseBlock.forward‘   s%   € ØˆØ×)Ô)ˆDÙ˜“:‰Dð *àˆr2   r4   r<   rA   s   @r1   rV   rV   z   s   ø„ àLPõ4ö,r2   rV   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚTransitionLayerc                 ór   •— t         ‰| �  «        t        ||ddd¬«      | _        t	        ddd¬«      | _        y )Nr:   r   rE   é   ©r    r!   r"   )r&   r'   r   Úconv_ac_funcr   Ú
pool2d_avg)r+   r,   Únum_output_featuresr0   s      €r1   r'   zTransitionLayer.__init__™   s<   ø€ Ü‰ÑÔä)Ø%Ø+ØØØô
ˆÔô $°¸!ÀQÔGˆ�r2   c                 óJ   — | j                  |«      }| j                  |«      }|S r4   )rh   ri   r5   s      r1   r8   zTransitionLayer.forward¦   s%   € Ø×Ñ˜eÓ$ˆØ�O‰O˜AÓˆØˆr2   r<   rA   s   @r1   rd   rd   ˜   s   ø„ ôHör2   rd   c                   ó.   ‡ — e Zd Z	 	 	 	 dˆ fd„	Zd„ Zˆ xZS )ÚConvBNLayerc           
      ó†   •— t         ‰| �  «        t        ||||||t        «       d¬«      | _        t        ||¬«      | _        y )NFr   r   )r&   r'   r   r   r)   r   r(   r*   s	           €r1   r'   zConvBNLayer.__init__­   sG   ø€ ô 	‰ÑÔäØ$Ø$Ø#ØØØÜ!›Øô	
ˆŒ
ô % [°cÔ:ˆÕr2   c                 óJ   — | j                  |«      }| j                  |«      }|S r4   )r)   r(   r5   s      r1   r8   zConvBNLayer.forwardÅ   s%   € Ø�J‰J�uÓˆØ×Ñ˜QÓˆØˆr2   r9   r<   rA   s   @r1   rm   rm   ¬   s   ø„ ð ØØØõ;ö0r2   rm   c                   ó4   ‡ — e Zd ZdZ	 	 	 	 	 dˆ fd„	Z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:: 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]
    c                 óä  •— 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                  j                  | j                  d|dz   › �t        ||||	|dt        |dz   «      z   ¬«      «      «       |||	z  z   }|}|t!        |
«      dz
  k7  sŒq| j                  j                  | j                  d|dz   › d�t#        ||dz  ¬«      «      «       |dz  }|dz  }Œ¼ t%        |d¬«      | _        | j                  rt)        d«      | _        | j                  dkD  rMdt-        j.                  |dz  «      z  }t1        ||t3        t5        | |«      ¬«      t3        «       ¬«      | _        y y )N)éy   é¡   é©   éÉ   é  zsupported layers are z but input layer is é@   é    )é   é   é   é   é`   é0   )rz   r{   é$   r|   )rz   r{   ry   ry   )rz   r{   r   ry   )rz   r{   rx   r   rF   é   rf   r;   )r,   r-   r.   r!   r/   r   r:   rg   Údb_conv_rT   )r,   r]   rO   rN   rJ   r^   Útr_convÚ_blk)r,   rj   r   r   g      ð?)Úinitializer)r$   r%   )r&   r'   Únum_classesÚ	with_poolrm   Ú
conv1_funcr   Ú
pool2d_maxÚblock_configÚdense_block_func_listÚtransition_func_listÚ	enumerater[   r\   rV   ÚstrÚlenrd   r   Ú
batch_normr   ri   ÚmathÚsqrtr
   r   r   Úout)r+   ÚlayersrO   rJ   r†   r‡   Úsupported_layersÚdensenet_specÚnum_init_featuresrN   rŠ   Úpre_num_channelsÚnum_featuresÚir]   Ústdvr0   s                   €r1   r'   zDenseNet.__init__ê   sX  ø€ ô 	‰ÑÔØ&ˆÔØ"ˆŒÚ4ÐàÐ&Ñ&ð	Rà"Ð#3Ð"4Ð4HÈÈÐQó	RØ&ð �bš/Ð*Ø�bš/Ð*Ø�bš/Ð*Ø�bš/Ð*Ø�bš/Ð*ñ
ˆð 8EÀVÑ7LÑ4Ð˜;¨ä%ØØ)ØØØØô
ˆŒô $°¸!ÀQÔGˆŒØ(ˆÔØ%'ˆÔ"Ø$&ˆÔ!Ø,ÐØ(ˆÜ& |Ö4‰MˆAˆzØ×&Ñ&×-Ñ-Ø×!Ñ!Ø˜q 1™u˜gÐ&ÜØ%5Ø#-Ø 'Ø$/Ø 'Ø#¤c¨!¨a©%£jÑ0ôó
ôð (¨*°{Ñ*BÑBˆLØ+Ðà”C˜Ó%¨Ñ)Ó)Ø×)Ñ)×0Ñ0Ø×%Ñ%Ø! ! a¡% ¨Ð-Ü'Ø)9Ø0<ÀÑ0Aôóôð $0°1Ñ#4Ð Ø+¨qÑ0‘ð; 5ô> $ L°fÔ=ˆŒØ�>Š>Ü/°Ó2ˆDŒOà×Ñ˜aÒØœŸ™ <°#Ñ#5Ó6Ñ6ˆDÜØØÜ%´'¸4¸%ÀÓ2FÔGÜ#›+ô	ˆD�Hð  r2   c                 óÜ  — | j                  |«      }| j                  |«      }t        | j                  «      D ]K  \  }} | j                  |   |«      }|t        | j                  «      dz
  k7  sŒ7 | j                  |   |«      }ŒM | j                  |«      }| j                  r| j                  |«      }| j                  dkD  r)t        j                  dd¬«      }| j                  |«      }S )Nr:   r   éÿÿÿÿ)Ú
start_axisÚ	stop_axis)rˆ   r‰   r�   rŠ   r‹   r�   rŒ   r�   r‡   ri   r†   rR   Úflattenr“   )r+   r6   rT   rš   r]   r7   s         r1   r8   zDenseNet.forward<  sÔ   € Ø�‰˜uÓ%ˆØ�‰˜tÓ$ˆä& t×'8Ñ'8Ö9‰MˆAˆzØ0�4×-Ñ-¨aÑ0°Ó6ˆDØ”C˜×)Ñ)Ó*¨QÑ.Ó.Ø3�t×0Ñ0°Ñ3°DÓ9‘ð :ð
 �‰˜tÓ$ˆà�>Š>Ø—‘ Ó%ˆAà×Ñ˜aÒÜ—‘˜q¨Q¸"Ô=ˆAØ—‘˜“ˆAàˆr2   )rs   é   g        iè  T)r=   r>   r?   Ú__doc__r'   r8   r@   rA   s   @r1   rq   rq   Ë   s&   ø„ ñð@ ØØØØõPödr2   rq   c                 óÔ   — t        dd|i|¤Ž}|rX| t        v s
J | › d�«       ‚t        t        |    d   t        |    d   «      }t        j                  |«      }|j                  |«       |S )Nr”   zJ model do not have a pretrained model now, you should set pretrained=Falser   r:   © )rq   Ú
model_urlsr   rR   ÚloadÚset_dict)Úarchr”   Ú
pretrainedÚkwargsÚmodelÚweight_pathÚparams          r1   Ú	_densenetr®   Q  s}   € ÜÑ-˜FÐ- fÑ-€EÙà”JÑð	_àˆVÐ]Ð^ó	_Øä/Ü�tÑ˜QÑ¤¨DÑ!1°!Ñ!4ó
ˆô —‘˜KÓ(ˆØ�‰�uÔà€Lr2   c                 ó   — 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:: 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   rs   ©r®   ©r©   rª   s     r1   r   r   a  ó   € ô< �] C¨Ñ>°vÑ>Ð>r2   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:: python

            >>> 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)
            [1, 1000]
    r   rt   r°   r±   s     r1   r   r   ‚  r²   r2   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:: 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   ru   r°   r±   s     r1   r   r   £  r²   r2   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:: 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   rv   r°   r±   s     r1   r   r   Ä  s   € ô: �] C¨Ñ>°vÑ>Ð>r2   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:: 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   rw   r°   r±   s     r1   r   r   ä  r²   r2   )F) r‘   rR   r   Úpaddle.base.param_attrr   Ú	paddle.nnr   r   r   r   r	   r
   r   Úpaddle.nn.initializerr   Úpaddle.utils.downloadr   Ú__all__r¥   ÚLayerr   rC   rV   rd   rm   rq   r®   r   r   r   r   r   r¤   r2   r1   Ú<module>r½      sÕ   ðó ã Ý Ý ,÷÷ ñ õ *Ý ;à
€ðððððñ#€
ô0�B—H‘Hô ô>�—‘ô ôB�—‘ô ô<�b—h‘hô ô(�"—(‘(ô ô>Cˆr�x‰xô CòLó ?óB?óB?óB?ô@?r2   