U
    ¯Ê¹jíˆ  ã                7   @   s–  d Z ddlmZ ddlmZ ddlZddlmZ ddlm  m	Z
 ddlmZ ddlmZ ddlmZmZ ddlmZmZmZmZmZmZmZmZ d	d
lmZ d	dlmZ d	dlmZm Z  dg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(G dd„ deƒZ)G dd„ deƒ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"ƒZ0G d*d„ dej"ƒZ1d+d,„ Z2ded.d/„Z3dfd1d2„Z4ee4d3d4d5�e4d3d4d5�e4d3d4d5�e4d3d6d5�e4d3d6d5�e4d3d7�e4d3d7�e4d3d7�e4d3d7�e4d3d7�e4d3d8d9�e4d3d8d:d;d<�e4d3d8d9�e4d3d8d:d;d<�e4d3d8d=d>�e4d3d8d9�e4d3d8d:d;d<�e4d3d8d9�e4d3d8d:d;d<�e4d3d8d=d>�e4d3d8d9�e4d3d8d:d;d<�e4d3d8d9�e4d3d8d:d;d<�e4d3d8d=d>�e4d3d8d9�e4d3d8d:d;d<�e4d3d8d9�e4d3d8d:d;d<�e4d3d8d=d>�e4d3d8d9�e4d3d8d:d;d<�e4d3d8d9�e4d3d8d:d;d<�e4d3d8d=d>�e4d3d8d9�e4d3d8d:d;d<�e4d3d8d9�e4d3d8d:d;d<�e4d3d8d=d>�e4d3d8d9�e4d3d8d:d;d<�e4d3d8d9�e4d3d8d:d;d<�e4d3d8d=d>�e4d3d8d9�e4d3d8d:d;d<�e4d3d8d9�e4d3d8d:d;d<�e4d3d8d=d>�d?œ2ƒZ5e dge1d@œdAdB„ƒZ6e dhe1d@œdCdD„ƒZ7e die1d@œdEdF„ƒZ8e dje1d@œdGdH„ƒZ9e dke1d@œdIdJ„ƒZ:e dle1d@œdKdL„ƒZ;e dme1d@œdMdN„ƒZ<e dne1d@œdOdP„ƒZ=e doe1d@œdQdR„ƒZ>e dpe1d@œdSdT„ƒZ?e dqe1d@œdUdV„ƒZ@e dre1d@œdWdX„ƒZAe dse1d@œdYdZ„ƒZBe dte1d@œd[d\„ƒZCe due1d@œd]d^„ƒZDe dve1d@œd_d`„ƒZEe dwe1d@œdadb„ƒZFe dxe1d@œdcdd„ƒZGdS )yaì  
Poolformer from MetaFormer is Actually What You Need for Vision https://arxiv.org/abs/2111.11418

IdentityFormer, RandFormer, PoolFormerV2, ConvFormer, and CAFormer
from MetaFormer Baselines for Vision https://arxiv.org/abs/2210.13452

All implemented models support feature extraction and variable input resolution.

Original implementation by Weihao Yu et al.,
adapted for timm by Fredo Guan and Ross Wightman.

Adapted from https://github.com/sail-sg/metaformer, original copyright below
é    )ÚOrderedDict)ÚpartialN)ÚTensor)ÚFinal©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)Útrunc_normal_ÚDropPathÚSelectAdaptivePool2dÚ
GroupNorm1Ú	LayerNormÚLayerNorm2dÚMlpÚuse_fused_attné   )Úbuild_model_with_cfg)Úcheckpoint_seq)Úgenerate_default_cfgsÚregister_modelÚ
MetaFormerc                       s*   e Zd ZdZd‡ fdd„	Zdd„ Z‡  ZS )ÚStemzc
    Stem implemented by a layer of convolution.
    Conv2d params constant across all models.
    Nc                    s:   t ƒ  ¡  tj||dddd�| _|r,||ƒnt ¡ | _d S )Né   é   é   ©Úkernel_sizeÚstrideÚpadding)ÚsuperÚ__init__ÚnnÚConv2dÚconvÚIdentityÚnorm)ÚselfÚin_channelsÚout_channelsÚ
norm_layer©Ú	__class__© úU/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/metaformer.pyr    7   s    
ûzStem.__init__c                 C   s   |   |¡}|  |¡}|S ©N)r#   r%   ©r&   Úxr,   r,   r-   ÚforwardG   s    

zStem.forward)N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r1   Ú__classcell__r,   r,   r*   r-   r   1   s   	 ür   c                       s*   e Zd ZdZd	‡ fdd„	Zdd„ Z‡  ZS )
ÚDownsamplingz=
    Downsampling implemented by a layer of convolution.
    r   r   Nc                    s:   t ƒ  ¡  |r||ƒnt ¡ | _tj|||||d�| _d S )Nr   )r   r    r!   r$   r%   r"   r#   )r&   r'   r(   r   r   r   r)   r*   r,   r-   r    R   s    	
ûzDownsampling.__init__c                 C   s   |   |¡}|  |¡}|S r.   )r%   r#   r/   r,   r,   r-   r1   e   s    

zDownsampling.forward)r   r   Nr2   r,   r,   r*   r-   r8   M   s   	   ùr8   c                       s*   e Zd ZdZd‡ fdd„	Zdd„ Z‡  ZS )	ÚScalez2
    Scale vector by element multiplications.
    ç      ð?Tc                    s>   t ƒ  ¡  |r|ddfn|f| _tj|t |¡ |d�| _d S )Nr   ©Zrequires_grad)r   r    Úshaper!   Ú	ParameterÚtorchÚonesÚscale)r&   ÚdimÚ
init_valueZ	trainableÚuse_nchwr*   r,   r-   r    p   s    
zScale.__init__c                 C   s   || j  | j¡ S r.   )r@   Úviewr<   r/   r,   r,   r-   r1   u   s    zScale.forward)r:   TTr2   r,   r,   r*   r-   r9   k   s   r9   c                       s*   e Zd ZdZd‡ fdd„	Zdd„ Z‡  ZS )ÚSquaredReLUz<
        Squared ReLU: https://arxiv.org/abs/2109.08668
    Fc                    s   t ƒ  ¡  tj|d�| _d S )N©Úinplace)r   r    r!   ÚReLUÚrelu)r&   rG   r*   r,   r-   r    ~   s    
zSquaredReLU.__init__c                 C   s   t  |  |¡¡S r.   )r>   ZsquarerI   r/   r,   r,   r-   r1   ‚   s    zSquaredReLU.forward)Fr2   r,   r,   r*   r-   rE   y   s   rE   c                       s*   e Zd ZdZd‡ fdd„	Zd	d
„ Z‡  ZS )ÚStarReLUz(
    StarReLU: s * relu(x) ** 2 + b
    r:   ç        TNFc                    sV   t ƒ  ¡  || _tj|d�| _tj|t d¡ |d�| _	tj|t d¡ |d�| _
d S )NrF   r   r;   )r   r    rG   r!   rH   rI   r=   r>   r?   r@   Úbias)r&   Zscale_valueZ
bias_valueZscale_learnableZbias_learnableÚmoderG   r*   r,   r-   r    ‹   s
    	
zStarReLU.__init__c                 C   s   | j |  |¡d  | j S )Nr   )r@   rI   rL   r/   r,   r,   r-   r1   š   s    zStarReLU.forward)r:   rK   TTNFr2   r,   r,   r*   r-   rJ   †   s         ùrJ   c                       s8   e Zd ZU dZee ed< d‡ fdd„	Zd	d
„ Z‡  Z	S )Ú	Attentionzl
    Vanilla self-attention from Transformer: https://arxiv.org/abs/1706.03762.
    Modified from timm.
    Ú
fused_attné    NFrK   c           	         sš   t ƒ  ¡  || _|d | _tƒ | _|r*|n|| | _| jdkrDd| _| j| j | _tj	|| jd |d�| _
t |¡| _tj	| j||d�| _t |¡| _d S )Ng      à¿r   r   é   ©rL   )r   r    Úhead_dimr@   r   rO   Ú	num_headsZattention_dimr!   ÚLinearÚqkvÚDropoutÚ	attn_dropÚprojÚ	proj_drop)	r&   rA   rS   rT   Zqkv_biasrX   rZ   Z	proj_biasÚkwargsr*   r,   r-   r    ¥   s    


zAttention.__init__c           
      C   sÐ   |j \}}}|  |¡ ||d| j| j¡ ddddd¡}| d¡\}}}| jrntj	|||| j
rd| jjndd�}n4|| dd	¡ | j }	|	jd	d
�}	|  |	¡}	|	| }| dd¡ |||¡}|  |¡}|  |¡}|S )NrQ   r   r   r   r   rK   )Z	dropout_péþÿÿÿéÿÿÿÿ)rA   )r<   rV   ÚreshaperT   rS   ZpermuteZunbindrO   ÚFZscaled_dot_product_attentionZtrainingrX   ÚpÚ	transposer@   ZsoftmaxrY   rZ   )
r&   r0   ÚBÚNÚCrV   ÚqÚkÚvZattnr,   r,   r-   r1   Á   s$    *  þ


zAttention.forward)rP   NFrK   rK   F)
r3   r4   r5   r6   r   ÚboolÚ__annotations__r    r1   r7   r,   r,   r*   r-   rN   ž   s   
      ørN   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚGroupNorm1NoBiasc                    s(   t ƒ j|f|Ž | dd¡| _d | _d S ©NÚepsç�íµ ÷Æ°>©r   r    Úgetrl   rL   ©r&   Znum_channelsr[   r*   r,   r-   r    Û   s    zGroupNorm1NoBias.__init__©r3   r4   r5   r    r7   r,   r,   r*   r-   rj   Ú   s   rj   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚLayerNorm2dNoBiasc                    s(   t ƒ j|f|Ž | dd¡| _d | _d S rk   rn   rp   r*   r,   r-   r    â   s    zLayerNorm2dNoBias.__init__rq   r,   r,   r*   r-   rr   á   s   rr   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚLayerNormNoBiasc                    s(   t ƒ j|f|Ž | dd¡| _d | _d S rk   rn   rp   r*   r,   r-   r    é   s    zLayerNormNoBias.__init__rq   r,   r,   r*   r-   rs   è   s   rs   c                       s8   e Zd ZdZdeejdddf‡ fdd„	Zdd	„ Z‡  Z	S )
ÚSepConvz\
    Inverted separable convolution from MobileNetV2: https://arxiv.org/abs/1801.04381.
    r   Fr   rQ   c           
         sj   t ƒ  ¡  t|| ƒ}	tj||	d|d�| _|ƒ | _tj|	|	|||	|d�| _|ƒ | _tj|	|d|d�| _	d S )Nr   )r   rL   )r   r   ÚgroupsrL   )
r   r    Úintr!   r"   Úpwconv1Úact1ÚdwconvÚact2Úpwconv2)
r&   rA   Zexpansion_ratioZ
act1_layerZ
act2_layerrL   r   r   r[   Zmid_channelsr*   r,   r-   r    ô   s    
    þzSepConv.__init__c                 C   s6   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S r.   )rw   rx   ry   rz   r{   r/   r,   r,   r-   r1   	  s    




zSepConv.forward)
r3   r4   r5   r6   rJ   r!   r$   r    r1   r7   r,   r,   r*   r-   rt   ï   s   ørt   c                       s*   e Zd ZdZd‡ fdd„	Zdd„ Z‡  ZS )ÚPoolingzT
    Implementation of pooling for PoolFormer: https://arxiv.org/abs/2111.11418
    rQ   c                    s&   t ƒ  ¡  tj|d|d dd�| _d S )Nr   r   F)r   r   Zcount_include_pad)r   r    r!   Z	AvgPool2dÚpool)r&   Ú	pool_sizer[   r*   r,   r-   r      s    
   ÿzPooling.__init__c                 C   s   |   |¡}|| S r.   )r}   )r&   r0   Úyr,   r,   r-   r1     s    
zPooling.forward)rQ   r2   r,   r,   r*   r-   r|     s   r|   c                       s6   e Zd ZdZddeeddf‡ fdd„	Zdd	„ Z‡  ZS )
ÚMlpHeadz MLP classification head
    éè  r   rK   Tc           	         s\   t ƒ  ¡  t|| ƒ}tj|||d�| _|ƒ | _||ƒ| _tj|||d�| _t 	|¡| _
d S )NrR   )r   r    rv   r!   rU   Úfc1Úactr%   Úfc2rW   Ú	head_drop)	r&   rA   Únum_classesZ	mlp_ratioÚ	act_layerr)   Ú	drop_raterL   Zhidden_featuresr*   r,   r-   r    %  s    


zMlpHead.__init__c                 C   s6   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S r.   )r‚   rƒ   r%   r…   r„   r/   r,   r,   r-   r1   7  s    




zMlpHead.forward)	r3   r4   r5   r6   rE   r   r    r1   r7   r,   r,   r*   r-   r€   !  s   ør€   c                	       s<   e Zd ZdZeededddddf	‡ fdd„	Zdd	„ Z‡  Z	S )
ÚMetaFormerBlockz1
    Implementation of one MetaFormer block.
    FrK   TNc                    s
  t ƒ  ¡  tt||	|d�}tt||
|d�}||ƒ| _|f ||dœ|—Ž| _|dkrZt|ƒnt ¡ | _	|	d k	rr|ƒ nt ¡ | _
|
d k	rŠ|ƒ nt ¡ | _||ƒ| _t|td| ƒ||||d�| _|dkrÌt|ƒnt ¡ | _|	d k	rä|ƒ nt ¡ | _|
d k	rü|ƒ nt ¡ | _d S )N)rA   rB   rC   )rA   rZ   rK   r   )r‡   rL   ÚdropZuse_conv)r   r    r   r9   Únorm1Útoken_mixerr
   r!   r$   Ú
drop_path1Úlayer_scale1Ú
res_scale1Únorm2r   rv   ÚmlpÚ
drop_path2Úlayer_scale2Ú
res_scale2)r&   rA   rŒ   Úmlp_actÚmlp_biasr)   rZ   Ú	drop_pathrC   Úlayer_scale_init_valueÚres_scale_init_valuer[   Zls_layerZrs_layerr*   r,   r-   r    E  s(    



úzMetaFormerBlock.__init__c              
   C   sP   |   |¡|  |  |  |  |¡¡¡¡ }|  |¡|  |  |  |  	|¡¡¡¡ }|S r.   )
r�   rŽ   r�   rŒ   r‹   r”   r“   r’   r‘   r�   r/   r,   r,   r-   r1   j  s    ÿÿÿÿÿÿzMetaFormerBlock.forward)
r3   r4   r5   r6   r|   rJ   r   r    r1   r7   r,   r,   r*   r-   r‰   @  s   õ%r‰   c                
       sZ   e Zd Zdejedeeddgd ddf
‡ fdd„	Zej	j
ddd	„ƒZed
œdd„Z‡  ZS )ÚMetaFormerStager   FrK   Nc                    sz   t ƒ  ¡  dˆ	_tˆ
tƒ ˆ	_|ˆkr.t ¡ nt|ˆddd|d�ˆ	_	tj
‡ ‡‡‡‡‡‡‡‡‡	‡
fdd„t|ƒD ƒŽ ˆ	_d S )NFrQ   r   r   )r   r   r   r)   c                    s6   g | ].}t f ˆˆ
ˆˆˆˆˆ | ˆˆˆ	jd œ
ˆ—Ž‘qS ))
rA   rŒ   r•   r–   r)   rZ   r—   r˜   r™   rC   )r‰   rC   )Ú.0Úi©Údp_ratesr[   r˜   r•   r–   r)   Úout_chsrZ   r™   r&   rŒ   r,   r-   Ú
<listcomp>›  s   ôöõz,MetaFormerStage.__init__.<locals>.<listcomp>)r   r    Úgrad_checkpointingÚ
issubclassrN   rC   r!   r$   r8   Ú
downsampleÚ
SequentialÚrangeÚblocks)r&   Zin_chsrŸ   ÚdepthrŒ   r•   r–   Údownsample_normr)   rZ   rž   r˜   r™   r[   r*   r�   r-   r    |  s    
ú	"ôzMetaFormerStage.__init__Tc                 C   s
   || _ d S r.   )r¡   )r&   Úenabler,   r,   r-   Úset_grad_checkpointing©  s    z&MetaFormerStage.set_grad_checkpointing©r0   c                 C   s~   |   |¡}|j\}}}}| js4| ||d¡ dd¡}| jrRtj ¡ sRt	| j
|ƒ}n
|  
|¡}| jsz| dd¡ ||||¡}|S )Nr]   r   r   )r£   r<   rC   r^   ra   r¡   r>   ÚjitÚis_scriptingr   r¦   )r&   r0   rb   rd   ÚHÚWr,   r,   r-   r1   ­  s    

zMetaFormerStage.forward)T)r3   r4   r5   r!   r$   rJ   r   r    r>   r¬   Úignorerª   r   r1   r7   r,   r,   r*   r-   rš   z  s   ó-rš   c                       s¦   e Zd ZdZdddddeeddddd	d
eeedf‡ fdd„	Zdd„ Z	e
jjddd„ƒZe
jjdd„ ƒZd dd„Zd!eedœdd„Zedœdd„Zedœdd„Z‡  ZS )"r   aM   MetaFormer
        A PyTorch impl of : `MetaFormer Baselines for Vision`  -
          https://arxiv.org/abs/2210.13452

    Args:
        in_chans (int): Number of input image channels.
        num_classes (int): Number of classes for classification head.
        global_pool: Pooling for classifier head.
        depths (list or tuple): Number of blocks at each stage.
        dims (list or tuple): Feature dimension at each stage.
        token_mixers (list, tuple or token_fcn): Token mixer for each stage.
        mlp_act: Activation layer for MLP.
        mlp_bias (boolean): Enable or disable mlp bias term.
        drop_path_rate (float): Stochastic depth rate.
        drop_rate (float): Dropout rate.
        layer_scale_init_values (list, tuple, float or None): Init value for Layer Scale.
            None means not use the layer scale. Form: https://arxiv.org/abs/2103.17239.
        res_scale_init_values (list, tuple, float or None): Init value for res Scale on residual connections.
            None means not use the res scale. From: https://arxiv.org/abs/2110.09456.
        downsample_norm (nn.Module): Norm layer used in stem and downsampling layers.
        norm_layers (list, tuple or norm_fcn): Norm layers for each stage.
        output_norm: Norm layer before classifier head.
        use_mlp_head: Use MLP classification head.
    rQ   r�   Úavg©r   r   é   r   )é@   é€   é@  é   FrK   N)NNr:   r:   Tc                    sT  t ƒ  ¡  || _|d | _|| _|| _t|ƒ| _t|t	t
fƒsD|g}t|t	t
fƒsX|g}t|t	t
fƒsr|g| j }t|t	t
fƒsŒ|g| j }t|t	t
fƒs¦|g| j }t|t	t
fƒsÀ|g| j }d| _g | _t||d |d�| _g }|d }dd„ t d|	t|ƒ¡ |¡D ƒ}t| jƒD ]|}|t||| f|| || |||
|| || || ||| dœ
|—Žg7 }|| }|  jt|| dd	|› �d
�g7  _�qtj|Ž | _|dk�rØ| j�rÈt| j|| jd�}nt | j|¡}nt ¡ }t tdt|d�fd|| jƒfd|�rt d¡nt ¡ fd| j�r,t |¡nt ¡ fd|fgƒ¡| _ |  !| j"¡ d S )Nr]   Fr   )r)   c                 S   s   g | ]}|  ¡ ‘qS r,   )Útolist)r›   r0   r,   r,   r-   r      s     z'MetaFormer.__init__.<locals>.<listcomp>)
r§   rŒ   r•   r–   rZ   rž   r˜   r™   r¨   r)   r   zstages.)Znum_chsZ	reductionÚmodule©rˆ   Úglobal_pool©Z	pool_typer%   Úflattenr   rŠ   Úfc)#r   r    r†   Únum_featuresrˆ   Úuse_mlp_headÚlenZ
num_stagesÚ
isinstanceÚlistÚtupler¡   Zfeature_infor   Ústemr>   ZlinspaceÚsumÚsplitr¥   rš   Údictr!   r¤   Ústagesr€   rU   r$   r   r   ÚFlattenrW   ÚheadÚapplyÚ_init_weights)r&   Zin_chansr†   r»   ÚdepthsÚdimsÚtoken_mixersr•   r–   Zdrop_path_rateZproj_drop_raterˆ   Úlayer_scale_init_valuesÚres_scale_init_valuesr¨   Únorm_layersZoutput_normrÀ   r[   rÉ   Zprev_dimrž   rœ   Úfinalr*   r,   r-   r    Ù  s|    


ý"þôó
(
û
zMetaFormer.__init__c                 C   s>   t |tjtjfƒr:t|jdd� |jd k	r:tj |jd¡ d S )Ng{®Gáz”?)Ústdr   )	rÂ   r!   r"   rU   r	   ÚweightrL   ÚinitZ	constant_)r&   Úmr,   r,   r-   rÍ   7  s    
zMetaFormer._init_weightsc                 C   s"   || _ | jD ]}|j|d� qd S )N)r©   )r¡   rÉ   rª   )r&   r©   Zstager,   r,   r-   rª   =  s    
z!MetaFormer.set_grad_checkpointingc                 C   s   | j jS r.   )rË   r¾   )r&   r,   r,   r-   Úget_classifierC  s    zMetaFormer.get_classifierr   c                 C   sv   |d k	r0t |d�| j_|r$t d¡nt ¡ | j_|dkrb| jrRt| j	|| j
d�}qjt | j	|¡}nt ¡ }|| j_d S )Nr¼   r   r   rº   )r   rË   r»   r!   rÊ   r$   r½   rÀ   r€   r¿   rˆ   rU   r¾   )r&   r†   r»   rÔ   r,   r,   r-   Úreset_classifierG  s    zMetaFormer.reset_classifier)r0   Ú
pre_logitsc                 C   sD   | j  |¡}| j  |¡}| j  |¡}| j  |¡}|r8|S | j  |¡S r.   )rË   r»   r%   r½   rŠ   r¾   )r&   r0   rÛ   r,   r,   r-   Úforward_headT  s
    zMetaFormer.forward_headr«   c                 C   s6   |   |¡}| jr(tj ¡ s(t| j|ƒ}n
|  |¡}|S r.   )rÅ   r¡   r>   r¬   r­   r   rÉ   r/   r,   r,   r-   Úforward_features\  s
    

zMetaFormer.forward_featuresc                 C   s   |   |¡}|  |¡}|S r.   )rÝ   rÜ   r/   r,   r,   r-   r1   d  s    

zMetaFormer.forward)T)r   N)F)r3   r4   r5   r6   r|   rJ   rr   r   r    rÍ   r>   r¬   r°   rª   rÙ   rÚ   r   rh   rÜ   rÝ   r1   r7   r,   r,   r*   r-   r   ¿  s8   î^

c                 C   sd  d| kr| S dd l }i }d| k}| ¡ }|  ¡ D �],\}}|r | dd|¡}| dd¡}| dd	¡}| d
d¡}| dd¡}| dd¡}| dd¡}| dd¡}| dd|¡}| dd¡}| dd¡}| dd|¡}| dd¡}| dd¡}| dd¡}| dd¡}| dd |¡}| d!d"|¡}|j|| k�rV| ¡ ||  ¡ k�rV| || j¡}|||< q0|S )#Nzstem.conv.weightr   znetwork.0.0.mlp.fc1.weightzlayer_scale_([0-9]+)zlayer_scale\1.scalez	network.1zdownsample_layers.1z	network.3zdownsample_layers.2z	network.5zdownsample_layers.3z	network.2z	network.4z	network.6ÚnetworkrÉ   zdownsample_layers.([0-9]+)zstages.\1.downsamplezdownsample.projzdownsample.convzpatch_embed.projzpatch_embed.convz([0-9]+).([0-9]+)z\1.blocks.\2zstages.0.downsampleZpatch_embedrÅ   Z	post_normr%   Zpre_normz^headúhead.fcz^normz	head.norm)ÚreÚ
state_dictÚitemsÚsubÚreplacer<   Znumelr^   )rá   Úmodelrà   Zout_dictZis_poolformerv1Zmodel_state_dictrf   rg   r,   r,   r-   Úcheckpoint_filter_fnk  s<    &
ræ   Fc                 K   sP   t dd„ t| dd¡ƒD ƒƒ}| d|¡}tt| |fttd|d�dœ|—Ž}|S )	Nc                 s   s   | ]\}}|V  qd S r.   r,   )r›   rœ   Ú_r,   r,   r-   Ú	<genexpr>‘  s     z%_create_metaformer.<locals>.<genexpr>rÎ   r²   Úout_indicesT)Zflatten_sequentialré   )Zpretrained_filter_fnZfeature_cfg)rÄ   Ú	enumeratero   Úpopr   r   ræ   rÈ   )ÚvariantÚ
pretrainedr[   Zdefault_out_indicesré   rå   r,   r,   r-   Ú_create_metaformer�  s    ý
ûú	rî   Ú c                 K   s   | dddddt tdddœ
|–S )	Nr�   )rQ   éà   rð   )r   r   r:   Zbicubicrß   z	stem.conv)
Úurlr†   Ú
input_sizer~   Úcrop_pctÚinterpolationZmeanrÕ   Ú
classifierZ
first_convr   )rñ   r[   r,   r,   r-   Ú_cfg   s         ûúrö   ztimm/gÍÌÌÌÌÌì?)Ú	hf_hub_idró   gffffffî?)r÷   zhead.fc.fc2)r÷   rõ   )rQ   é€  rø   )é   rù   )r÷   rõ   rò   r~   iQU  )r÷   rõ   r†   )2zpoolformer_s12.sail_in1kzpoolformer_s24.sail_in1kzpoolformer_s36.sail_in1kzpoolformer_m36.sail_in1kzpoolformer_m48.sail_in1kzpoolformerv2_s12.sail_in1kzpoolformerv2_s24.sail_in1kzpoolformerv2_s36.sail_in1kzpoolformerv2_m36.sail_in1kzpoolformerv2_m48.sail_in1kzconvformer_s18.sail_in1kzconvformer_s18.sail_in1k_384z!convformer_s18.sail_in22k_ft_in1kz%convformer_s18.sail_in22k_ft_in1k_384zconvformer_s18.sail_in22kzconvformer_s36.sail_in1kzconvformer_s36.sail_in1k_384z!convformer_s36.sail_in22k_ft_in1kz%convformer_s36.sail_in22k_ft_in1k_384zconvformer_s36.sail_in22kzconvformer_m36.sail_in1kzconvformer_m36.sail_in1k_384z!convformer_m36.sail_in22k_ft_in1kz%convformer_m36.sail_in22k_ft_in1k_384zconvformer_m36.sail_in22kzconvformer_b36.sail_in1kzconvformer_b36.sail_in1k_384z!convformer_b36.sail_in22k_ft_in1kz%convformer_b36.sail_in22k_ft_in1k_384zconvformer_b36.sail_in22kzcaformer_s18.sail_in1kzcaformer_s18.sail_in1k_384zcaformer_s18.sail_in22k_ft_in1kz#caformer_s18.sail_in22k_ft_in1k_384zcaformer_s18.sail_in22kzcaformer_s36.sail_in1kzcaformer_s36.sail_in1k_384zcaformer_s36.sail_in22k_ft_in1kz#caformer_s36.sail_in22k_ft_in1k_384zcaformer_s36.sail_in22kzcaformer_m36.sail_in1kzcaformer_m36.sail_in1k_384zcaformer_m36.sail_in22k_ft_in1kz#caformer_m36.sail_in22k_ft_in1k_384zcaformer_m36.sail_in22kzcaformer_b36.sail_in1kzcaformer_b36.sail_in1k_384zcaformer_b36.sail_in22k_ft_in1kz#caformer_b36.sail_in22k_ft_in1k_384zcaformer_b36.sail_in22k)Úreturnc                 K   sF   t f ddddgddddgd tjdtdd d	d
œ	|—Ž}tdd| i|—ŽS )Nr   r³   r´   rµ   r¶   r·   Tçñhãˆµøä>F©	rÎ   rÏ   r¨   r•   r–   rÓ   rÑ   rÒ   rÀ   Úpoolformer_s12rí   )rý   ©rÈ   r!   ZGELUr   rî   ©rí   r[   Zmodel_kwargsr,   r,   r-   rý   D  s    

÷
örý   c                 K   sF   t f ddddgddddgd tjdtdd d	d
œ	|—Ž}tdd| i|—ŽS )Nr   rù   r´   rµ   r¶   r·   Trû   Frü   Úpoolformer_s24rí   )r   rþ   rÿ   r,   r,   r-   r   T  s    

÷
ör   c                 K   sF   t f ddddgddddgd tjdtdd d	d
œ	|—Ž}tdd| i|—ŽS )Nr³   é   r´   rµ   r¶   r·   Trm   Frü   Úpoolformer_s36rí   )r  rþ   rÿ   r,   r,   r-   r  d  s    

÷
ör  c                 K   sF   t f ddddgddddgd tjdtdd d	d
œ	|—Ž}tdd| i|—ŽS )Nr³   r  é`   éÀ   rø   é   Trm   Frü   Úpoolformer_m36rí   )r  rþ   rÿ   r,   r,   r-   r  t  s    

÷
ör  c                 K   sF   t f ddddgddddgd tjdtdd d	d
œ	|—Ž}tdd| i|—ŽS )Né   é   r  r  rø   r  Trm   Frü   Úpoolformer_m48rí   )r	  rþ   rÿ   r,   r,   r-   r	  „  s    

÷
ör	  c                 K   s:   t f ddddgddddgtddœ|—Ž}tdd
| i|—ŽS )Nr   r³   r´   rµ   r¶   r·   F©rÎ   rÏ   rÓ   rÀ   Úpoolformerv2_s12rí   )r  ©rÈ   rj   rî   rÿ   r,   r,   r-   r  ”  s    

üûr  c                 K   s:   t f ddddgddddgtddœ|—Ž}tdd
| i|—ŽS )Nr   rù   r´   rµ   r¶   r·   Fr
  Úpoolformerv2_s24rí   )r  r  rÿ   r,   r,   r-   r  Ÿ  s    

üûr  c                 K   s:   t f ddddgddddgtddœ|—Ž}tdd
| i|—ŽS )Nr³   r  r´   rµ   r¶   r·   Fr
  Úpoolformerv2_s36rí   )r  r  rÿ   r,   r,   r-   r  ª  s    

üûr  c                 K   s:   t f ddddgddddgtddœ|—Ž}tdd
| i|—ŽS )Nr³   r  r  r  rø   r  Fr
  Úpoolformerv2_m36rí   )r  r  rÿ   r,   r,   r-   r  µ  s    

üûr  c                 K   s:   t f ddddgddddgtddœ|—Ž}tdd
| i|—ŽS )Nr  r  r  r  rø   r  Fr
  Úpoolformerv2_m48rí   )r  r  rÿ   r,   r,   r-   r  À  s    

üûr  c                 K   s:   t f ddddgddddgttdœ|—Ž}td
d	| i|—ŽS )NrQ   é	   r´   rµ   r¶   r·   ©rÎ   rÏ   rÐ   rÓ   Úconvformer_s18rí   )r  ©rÈ   rt   rr   rî   rÿ   r,   r,   r-   r  Ë  s    

üûr  c                 K   s:   t f ddddgddddgttdœ|—Ž}tdd
| i|—ŽS )NrQ   rù   r  r´   rµ   r¶   r·   r  Úconvformer_s36rí   )r  r  rÿ   r,   r,   r-   r  Ö  s    

üûr  c                 K   s:   t f ddddgddddgttdœ|—Ž}tdd
| i|—ŽS )NrQ   rù   r  r  r  rø   é@  r  Úconvformer_m36rí   )r  r  rÿ   r,   r,   r-   r  á  s    

üûr  c                 K   s:   t f ddddgddddgttdœ|—Ž}tdd
| i|—ŽS )NrQ   rù   r  rµ   é   r·   r  r  Úconvformer_b36rí   )r  r  rÿ   r,   r,   r-   r  ì  s    

üûr  c                 K   sR   t f ddddgddddgttttgtgd tgd  dœ|—Ž}tdd
| i|—ŽS )NrQ   r  r´   rµ   r¶   r·   r   r  Úcaformer_s18rí   )r  ©rÈ   rt   rN   rr   rs   rî   rÿ   r,   r,   r-   r  ÷  s    


üûr  c                 K   sR   t f ddddgddddgttttgtgd tgd  d	œ|—Ž}tdd| i|—ŽS )NrQ   rù   r  r´   rµ   r¶   r·   r   r  Úcaformer_s36rí   )r  r  rÿ   r,   r,   r-   r    s    


üûr  c                 K   sR   t f ddddgddddgttttgtgd tgd  d	œ|—Ž}tdd| i|—ŽS )NrQ   rù   r  r  r  rø   r  r   r  Úcaformer_m36rí   )r  r  rÿ   r,   r,   r-   r    s    


üûr  c                 K   sR   t f ddddgddddgttttgtgd tgd  d	œ|—Ž}tdd| i|—ŽS )NrQ   rù   r  rµ   r  r·   r  r   r  Úcaformer_b36rí   )r  r  rÿ   r,   r,   r-   r    s    


üûr  )F)rï   )F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)Hr6   Úcollectionsr   Ú	functoolsr   r>   Ztorch.nnr!   Ztorch.nn.functionalZ
functionalr_   r   Z	torch.jitr   Z	timm.datar   r   Ztimm.layersr	   r
   r   r   r   r   r   r   Z_builderr   Z_manipulater   Ú	_registryr   r   Ú__all__ÚModuler   r8   r9   rE   rJ   rN   rj   rr   rs   rt   r|   r€   r‰   rš   r   ræ   rî   rö   Zdefault_cfgsrý   r   r  r  r	  r  r  r  r  r  r  r  r  r  r  r  r  r  r,   r,   r,   r-   Ú<module>   sR  (<#:E -%

þþþþþþ  þþ  þ þþ  þþ  þ þþ  þþ  þ þþ  þþ  þ þþ  þþ  þ þþ  þþ  þ þþ  þþ  þ þþ  þþ  þ þ€ í 











