U
    (d{:                  	   @   s8  d dl mZ d dlmZmZmZmZmZ d dlZd dlm	Z	m
Z
 d dlmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZ ddlmZ ddlmZmZ dddddddddg	ZG dd de	j Z!G dd de	j"Z#G dd dZ$G dd de	j"Z%ee$ e&ee e'ee%dd d!Z(d"ed#d$d%Z)G d&d deZ*G d'd deZ+G d(d deZ,G d)d deZ-ed*e*j.fd+dd,d-ee* e'ee%d.d/dZ/ed*e+j.fd+dd,d-ee+ e'ee%d.d0dZ0ed*e,j.fd+dd,d-ee, e'ee%d.d1dZ1ed*e-j.fd+dd,d-ee- e'ee%d.d2dZ2dS )3    )partial)AnyCallableListOptionalSequenceN)nnTensor)
functional   )Conv2dNormActivationPermute)StochasticDepth)ImageClassification)_log_api_usage_once   )WeightsEnumWeights)_IMAGENET_CATEGORIES)handle_legacy_interface_ovewrite_named_paramConvNeXtConvNeXt_Tiny_WeightsConvNeXt_Small_WeightsConvNeXt_Base_WeightsConvNeXt_Large_Weightsconvnext_tinyconvnext_smallconvnext_baseconvnext_largec                   @   s   e Zd ZeedddZdS )LayerNorm2dxreturnc                 C   s>   | dddd}t|| j| j| j| j}| dddd}|S )Nr   r      r   )ZpermuteFZ
layer_normZnormalized_shapeweightbiasepsselfr"    r+   ?/tmp/pip-unpacked-wheel-vx7f76es/torchvision/models/convnext.pyforward   s    zLayerNorm2d.forwardN)__name__
__module____qualname__r	   r-   r+   r+   r+   r,   r       s   r    c                       sH   e Zd Zd	eeeedejf  dd fddZe	e	dddZ
  ZS )
CNBlockN.)layer_scalestochastic_depth_prob
norm_layerr#   c                    s   t    |d kr ttjdd}ttj||dd|ddtdddd	g||tj|d
| ddt	 tjd
| |ddtddd	dg| _
tt|d	d	| | _t|d| _d S )Nư>r(      r$   T)kernel_sizepaddinggroupsr'   r   r   r      )Zin_featuresZout_featuresr'   row)super__init__r   r   	LayerNorm
SequentialConv2dr   LinearZGELUblock	ParametertorchZonesr2   r   stochastic_depth)r*   Zdimr2   r3   r4   	__class__r+   r,   r>   '   s    
	zCNBlock.__init__)inputr#   c                 C   s&   | j | | }| |}||7 }|S N)r2   rC   rF   )r*   rI   resultr+   r+   r,   r-   >   s    
zCNBlock.forward)N)r.   r/   r0   floatr   r   r   Moduler>   r	   r-   __classcell__r+   r+   rG   r,   r1   &   s    r1   c                   @   s2   e Zd Zeee eddddZedddZdS )CNBlockConfigN)input_channelsout_channels
num_layersr#   c                 C   s   || _ || _|| _d S rJ   )rP   rQ   rR   )r*   rP   rQ   rR   r+   r+   r,   r>   G   s    zCNBlockConfig.__init__)r#   c                 C   s:   | j jd }|d7 }|d7 }|d7 }|d7 }|jf | jS )N(zinput_channels={input_channels}z, out_channels={out_channels}z, num_layers={num_layers}))rH   r.   format__dict__)r*   sr+   r+   r,   __repr__Q   s    zCNBlockConfig.__repr__)r.   r/   r0   intr   r>   strrX   r+   r+   r+   r,   rO   E   s   
rO   c                
       sr   e Zd Zdee eeeeede	j
f  eede	j
f  edd fddZeed	d
dZeed	ddZ  ZS )r           r5     N.)block_settingr3   r2   num_classesrC   r4   kwargsr#   c                    s  t    t|  |s tdn$t|tr<tdd |D sDtd|d krPt}|d krdt	t
dd}g }|d j}	|td|	d	d	d|d d
d tdd |D }
d}|D ]}g }t|jD ]0}|| |
d  }|||j|| |d7 }q|tj|  |jd k	r|t||jtj|j|jddd qtj| | _td| _|d }|jd k	rf|jn|j}t||tdt||| _|  D ]F}t|tjtjfrtjj|jdd |jd k	rtj |j qd S )Nz%The block_setting should not be emptyc                 S   s   g | ]}t |tqS r+   )
isinstancerO   ).0rW   r+   r+   r,   
<listcomp>j   s     z%ConvNeXt.__init__.<locals>.<listcomp>z/The block_setting should be List[CNBlockConfig]r5   r6   r   r$   r;   T)r8   strider9   r4   Zactivation_layerr'   c                 s   s   | ]}|j V  qd S rJ   )rR   )ra   cnfr+   r+   r,   	<genexpr>   s     z$ConvNeXt.__init__.<locals>.<genexpr>g      ?r   r   )r8   rc   g{Gz?)Zstd)!r=   r>   r   
ValueErrorr`   r   all	TypeErrorr1   r   r    rP   appendr   sumrangerR   r   r@   rQ   rA   featuresZAdaptiveAvgPool2davgpoolZFlattenrB   
classifiermodulesinitZtrunc_normal_r&   r'   Zzeros_)r*   r]   r3   r2   r^   rC   r4   r_   ZlayersZfirstconv_output_channelsZtotal_stage_blocksZstage_block_idrd   Zstage_Zsd_probZ	lastblockZlastconv_output_channelsmrG   r+   r,   r>   [   sn    





  
zConvNeXt.__init__r!   c                 C   s"   |  |}| |}| |}|S rJ   )rm   rn   ro   r)   r+   r+   r,   _forward_impl   s    


zConvNeXt._forward_implc                 C   s
   |  |S rJ   )rt   r)   r+   r+   r,   r-      s    zConvNeXt.forward)r[   r5   r\   NN)r.   r/   r0   r   rO   rL   rY   r   r   r   rM   r   r>   r	   rt   r-   rN   r+   r+   rG   r,   r   Z   s"        N)r]   r3   weightsprogressr_   r#   c                 K   sP   |d k	rt |dt|jd  t| fd|i|}|d k	rL||j|d |S )Nr^   
categoriesr3   )rv   )r   lenmetar   Zload_state_dictZget_state_dict)r]   r3   ru   rv   r_   modelr+   r+   r,   	_convnext   s    r{   )    r|   zNhttps://github.com/pytorch/vision/tree/main/references/classification#convnexta  
        These weights improve upon the results of the original paper by using a modified version of TorchVision's
        `new training recipe
        <https://pytorch.org/blog/how-to-train-state-of-the-art-models-using-torchvision-latest-primitives/>`_.
    )Zmin_sizerw   ZrecipeZ_docsc                	   @   s<   e Zd Zedeedddeddddd	id
dZeZdS )r   z>https://download.pytorch.org/models/convnext_tiny-983f1562.pth      Z	crop_sizeZresize_sizeiH<ImageNet-1KgzGT@gMbX	X@zacc@1zacc@5Z
num_paramsZ_metricsurlZ
transformsry   N	r.   r/   r0   r   r   r   _COMMON_METAIMAGENET1K_V1DEFAULTr+   r+   r+   r,   r      s   c                	   @   s<   e Zd Zedeedddeddddd	id
dZeZdS )r   z?https://download.pytorch.org/models/convnext_small-0c510722.pthr}      r   iHZr   gClT@g)X@r   r   r   Nr   r+   r+   r+   r,   r      s   c                	   @   s<   e Zd Zedeedddeddddd	id
dZeZdS )r   z>https://download.pytorch.org/models/convnext_base-6075fbad.pthr}      r   ihGr   gU@gHz7X@r   r   r   Nr   r+   r+   r+   r,   r      s   c                	   @   s<   e Zd Zedeedddeddddd	id
dZeZdS )r   z?https://download.pytorch.org/models/convnext_large-ea097f82.pthr}   r   r   ir   g"~U@gX9v>X@r   r   r   Nr   r+   r+   r+   r,   r     s   Z
pretrained)ru   T)ru   rv   )ru   rv   r_   r#   c                 K   sT   t | } tdddtdddtdddtdddg}|dd	}t||| |f|S )
a  ConvNeXt Tiny model architecture from the
    `A ConvNet for the 2020s <https://arxiv.org/abs/2201.03545>`_ paper.

    Args:
        weights (:class:`~torchvision.models.convnext.ConvNeXt_Tiny_Weights`, optional): The pretrained
            weights to use. See :class:`~torchvision.models.convnext.ConvNeXt_Tiny_Weights`
            below for more details and possible values. By default, no pre-trained weights are used.
        progress (bool, optional): If True, displays a progress bar of the download to stderr. Default is True.
        **kwargs: parameters passed to the ``torchvision.models.convnext.ConvNext``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/convnext.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ConvNeXt_Tiny_Weights
        :members:
    `      r$        	   Nr3   g?)r   verifyrO   popr{   ru   rv   r_   r]   r3   r+   r+   r,   r     s    




c                 K   sT   t | } tdddtdddtdddtdddg}|dd	}t||| |f|S )
a  ConvNeXt Small model architecture from the
    `A ConvNet for the 2020s <https://arxiv.org/abs/2201.03545>`_ paper.

    Args:
        weights (:class:`~torchvision.models.convnext.ConvNeXt_Small_Weights`, optional): The pretrained
            weights to use. See :class:`~torchvision.models.convnext.ConvNeXt_Small_Weights`
            below for more details and possible values. By default, no pre-trained weights are used.
        progress (bool, optional): If True, displays a progress bar of the download to stderr. Default is True.
        **kwargs: parameters passed to the ``torchvision.models.convnext.ConvNext``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/convnext.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ConvNeXt_Small_Weights
        :members:
    r   r   r$   r   r      Nr3   g?)r   r   rO   r   r{   r   r+   r+   r,   r   7  s    




c                 K   sT   t | } tdddtdddtdddtdddg}|dd	}t||| |f|S )
a  ConvNeXt Base model architecture from the
    `A ConvNet for the 2020s <https://arxiv.org/abs/2201.03545>`_ paper.

    Args:
        weights (:class:`~torchvision.models.convnext.ConvNeXt_Base_Weights`, optional): The pretrained
            weights to use. See :class:`~torchvision.models.convnext.ConvNeXt_Base_Weights`
            below for more details and possible values. By default, no pre-trained weights are used.
        progress (bool, optional): If True, displays a progress bar of the download to stderr. Default is True.
        **kwargs: parameters passed to the ``torchvision.models.convnext.ConvNext``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/convnext.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ConvNeXt_Base_Weights
        :members:
          r$   i   i   r   Nr3         ?)r   r   rO   r   r{   r   r+   r+   r,   r   W  s    




c                 K   sT   t | } tdddtdddtdddtdddg}|dd	}t||| |f|S )
a  ConvNeXt Large model architecture from the
    `A ConvNet for the 2020s <https://arxiv.org/abs/2201.03545>`_ paper.

    Args:
        weights (:class:`~torchvision.models.convnext.ConvNeXt_Large_Weights`, optional): The pretrained
            weights to use. See :class:`~torchvision.models.convnext.ConvNeXt_Large_Weights`
            below for more details and possible values. By default, no pre-trained weights are used.
        progress (bool, optional): If True, displays a progress bar of the download to stderr. Default is True.
        **kwargs: parameters passed to the ``torchvision.models.convnext.ConvNext``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/convnext.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.ConvNeXt_Large_Weights
        :members:
    r   r   r$   r   i   r   Nr3   r   )r   r   rO   r   r{   r   r+   r+   r,   r   u  s    




)3	functoolsr   typingr   r   r   r   r   rE   r   r	   Ztorch.nnr
   r%   Zops.miscr   r   Zops.stochastic_depthr   Ztransforms._presetsr   utilsr   Z_apir   r   Z_metar   _utilsr   r   __all__r?   r    rM   r1   rO   r   rL   boolr{   r   r   r   r   r   r   r   r   r   r   r+   r+   r+   r,   <module>   s~   Z"   "   