U
    ¯Ê¹jT  ã                	   @   sV  d Z ddlZddlZddlZddlmZ ddlZddlm	  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 ddl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dl"m#Z#m$Z$m%Z% dgZ&e 'e(¡Z)G dd„ de	j*ƒZ+G dd„ de	j*ƒZ,G dd„ de	j*ƒZ-e.dœdd„Z/ee.dœdd„ƒZ0G dd„ de	j*ƒZ1G dd„ de	j*ƒZ2d;e	j*e3e4dœdd „Z5d!d"„ Z6d#d$„ Z7d<d&d'„Z8d=d(d)„Z9e$e9ƒ e9ƒ e9ƒ e9d*d+�e9d*d+�e9d*d+�d,œƒZ:e#d>e2d-œd.d/„ƒZ;e#d?e2d-œd0d1„ƒZ<e#d@e2d-œd2d3„ƒZ=e#dAe2d-œd4d5„ƒZ>e#dBe2d-œd6d7„ƒZ?e#dCe2d-œd8d9„ƒZ@e%e(d5d7d9d:œƒ dS )Da   Nested Transformer (NesT) in PyTorch

A PyTorch implement of Aggregating Nested Transformers as described in:

'Aggregating Nested Transformers'
    - https://arxiv.org/abs/2105.12723

The official Jax code is released and available at https://github.com/google-research/nested-transformer. The weights
have been converted with convert/convert_nest_flax.py

Acknowledgments:
* The paper authors for sharing their research, code, and model weights
* Ross Wightman's existing code off which I based this

Copyright 2021 Alexander Soare
é    N)Úpartial)Únn©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)Ú
PatchEmbedÚMlpÚDropPathÚcreate_classifierÚtrunc_normal_Ú_assert)Úcreate_conv2dÚcreate_pool2dÚ	to_ntupleÚuse_fused_attnÚ	LayerNormé   )Úbuild_model_with_cfg)Úregister_notrace_function)Úcheckpoint_seqÚnamed_apply)Úregister_modelÚgenerate_default_cfgsÚregister_model_deprecationsÚNestc                       s<   e Zd ZU dZejje ed< d
‡ fdd„	Z	dd	„ Z
‡  ZS )Ú	Attentionzš
    This is much like `.vision_transformer.Attention` but uses *localised* self attention by accepting an input with
     an extra "image block" dim
    Ú
fused_attné   Fç        c                    sj   t ƒ  ¡  || _|| }|d | _tƒ | _tj|d| |d�| _t 	|¡| _
t ||¡| _t 	|¡| _d S )Ng      à¿é   )Úbias)ÚsuperÚ__init__Ú	num_headsÚscaler   r   r   ÚLinearÚqkvÚDropoutÚ	attn_dropÚprojÚ	proj_drop)ÚselfÚdimr#   Úqkv_biasr(   r*   Zhead_dim©Ú	__class__© úO/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/nest.pyr"   /   s    

zAttention.__init__c              	   C   sæ   |j \}}}}|  |¡ |||d| j|| j ¡ dddddd¡}| d¡\}}}	| jrxtj|||	| j	rn| j
jndd�}n8|| j }|| d	d
¡ }
|
jd
d�}
|  
|
¡}
|
|	 }| ddddd¡ ||||¡}|  |¡}|  |¡}|S )zm
        x is shape: B (batch_size), T (image blocks), N (seq length per image block), C (embed dim)
        r   r   é   r   é   é   r   )Z	dropout_péþÿÿÿéÿÿÿÿ)r,   )Úshaper&   Úreshaper#   ÚpermuteZunbindr   ÚFZscaled_dot_product_attentionZtrainingr(   Úpr$   Ú	transposeZsoftmaxr)   r*   )r+   ÚxÚBÚTÚNÚCr&   ÚqÚkÚvÚattnr0   r0   r1   Úforward;   s    2"



zAttention.forward)r   Fr   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚtorchÚjitÚFinalÚboolÚ__annotations__r"   rF   Ú__classcell__r0   r0   r.   r1   r   (   s   
r   c                       s<   e Zd ZdZdddddejejf‡ fdd„	Zdd„ Z‡  Z	S )	ÚTransformerLayerzü
    This is much like `.vision_transformer.Block` but:
        - Called TransformerLayer here to allow for "block" as defined in the paper ("non-overlapping image blocks")
        - Uses modified Attention layer that handles the "block" dimension
    ç      @Fr   c
                    sn   t ƒ  ¡  |	|ƒ| _t|||||d�| _|dkr8t|ƒnt ¡ | _|	|ƒ| _	t
|| ƒ}
t||
||d�| _d S )N)r#   r-   r(   r*   r   )Zin_featuresZhidden_featuresÚ	act_layerZdrop)r!   r"   Únorm1r   rE   r	   r   ÚIdentityÚ	drop_pathÚnorm2Úintr   Úmlp)r+   r,   r#   Ú	mlp_ratior-   r*   r(   rV   rS   Ú
norm_layerZmlp_hidden_dimr.   r0   r1   r"   Z   s$    

û
üzTransformerLayer.__init__c                 C   s<   |   |¡}||  |  |¡¡ }||  |  |  |¡¡¡ }|S ©N)rT   rV   rE   rY   rW   )r+   r=   Úyr0   r0   r1   rF   y   s    
zTransformerLayer.forward)
rG   rH   rI   rJ   r   ÚGELUr   r"   rF   rP   r0   r0   r.   r1   rQ   T   s   	örQ   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚConvPoolÚ c                    s>   t ƒ  ¡  t||d|dd�| _||ƒ| _tddd|d�| _d S )Nr   T)Úkernel_sizeÚpaddingr    Úmaxr3   )ra   Zstriderb   )r!   r"   r   ÚconvÚnormr   Úpool)r+   Zin_channelsZout_channelsr[   Úpad_typer.   r0   r1   r"   �   s    

zConvPool.__init__c                 C   sj   t |jd d dkdƒ t |jd d dkdƒ |  |¡}|  | dddd¡¡ dddd¡}|  |¡}|S )z:
        x is expected to have shape (B, C, H, W)
        r5   r3   r   z1BlockAggregation requires even input spatial dimsr6   r   r   )r   r7   rd   re   r9   rf   ©r+   r=   r0   r0   r1   rF   ‡   s    
"
zConvPool.forward)r`   )rG   rH   rI   r"   rF   rP   r0   r0   r.   r1   r_   €   s   r_   )Ú
block_sizec                 C   sv   | j \}}}}t|| dkdƒ t|| dkdƒ || }|| }|  ||||||¡} |  dd¡ ||| d|¡} | S )zšimage to blocks
    Args:
        x (Tensor): with shape (B, H, W, C)
        block_size (int): edge length of a single square block in units of H, W
    r   z,`block_size` must divide input height evenlyz+`block_size` must divide input width evenlyr3   r   r6   )r7   r   r8   r<   )r=   ri   r>   ÚHÚWrA   Zgrid_heightZ
grid_widthr0   r0   r1   Úblockify”   s    rl   c           	      C   sX   | j \}}}}tt |¡ƒ}||  }}|  ||||||¡} |  dd¡ ||||¡} | S )zßblocks to image
    Args:
        x (Tensor): with shape (B, T, N, C) where T is number of blocks and N is sequence size per block
        block_size (int): edge length of a single square block in units of desired H, W
    r3   r   )r7   rX   ÚmathÚsqrtr8   r<   )	r=   ri   r>   r?   Ú_rA   Z	grid_sizeÚheightÚwidthr0   r0   r1   Ú
deblockify¤   s    rr   c                	       s<   e Zd ZdZdddddg dddf	‡ fdd„	Zd	d
„ Z‡  ZS )Ú	NestLevelz7 Single hierarchical level of a Nested Transformer
    NrR   Tr   r`   c              
      s¢   t ƒ  ¡  || _d| _t t d||ˆ¡¡| _|d k	rJt	|ˆˆ|d�| _
n
t ¡ | _
tˆƒrptˆƒ|ksptdƒ‚tj‡ ‡‡‡‡‡‡‡‡f	dd„t|ƒD ƒŽ | _d S )NFr   )r[   rg   zDMust provide as many drop path rates as there are transformer layersc                    s*   g | ]"}t ˆˆˆˆˆˆˆ| ˆˆ d �	‘qS ))	r,   r#   rZ   r-   r*   r(   rV   r[   rS   )rQ   ©Ú.0Úi©	rS   r(   rV   Ú	embed_dimrZ   r[   r#   r*   r-   r0   r1   Ú
<listcomp>Ö   s   õ÷z&NestLevel.__init__.<locals>.<listcomp>)r!   r"   ri   Úgrad_checkpointingr   Ú	ParameterrK   ZzerosÚ	pos_embedr_   rf   rU   ÚlenÚAssertionErrorÚ
SequentialÚrangeÚtransformer_encoder)r+   Ú
num_blocksri   Ú
seq_lengthr#   Údepthrx   Zprev_embed_dimrZ   r-   r*   r(   rV   r[   rS   rg   r.   rw   r1   r"   ¶   s    

ôzNestLevel.__init__c                 C   st   |   |¡}| dddd¡}t|| jƒ}|| j }| jrNtj ¡ sNt	| j
|ƒ}n
|  
|¡}t|| jƒ}| dddd¡S )z+
        expects x as (B, C, H, W)
        r   r3   r   r   )rf   r9   rl   ri   r|   rz   rK   rL   Zis_scriptingr   r�   rr   rh   r0   r0   r1   rF   ä   s    


zNestLevel.forward)rG   rH   rI   rJ   r"   rF   rP   r0   r0   r.   r1   rs   ³   s   
ð.rs   c                       s¢   e Zd ZdZd&‡ fdd„	Zejjd'dd„ƒZejjdd„ ƒZ	ejjd(dd„ƒZ
ejjd)dd„ƒZejjdd„ ƒZd*dd„Zdd „ Zd+ed!œd"d#„Zd$d%„ Z‡  ZS ),r   z… Nested Transformer (NesT)

    A PyTorch impl of : `Aggregating Nested Transformers`
        - https://arxiv.org/abs/2105.12723
    éà   r   r2   ©é€   é   i   ©r2   r   é   ©r3   r3   é   éè  rR   Tr   ç      à?Nr`   Úavgc                    sŠ  t ƒ  ¡  dD ]8}tƒ | }t|tjjƒrt|ƒ|kstd|› d�ƒ‚qt	|ƒ|ƒ}t	|ƒ|ƒ}t	|ƒ|ƒ}|| _
|d | _g | _|pˆt}|p’tj}|| _|| _t|tjjƒrÎ|d |d ksÆtdƒ‚|d }|| dksâtdƒ‚|| _d	t |¡  d¡ ¡ | _|| t | jd ¡ dk�s(td
ƒ‚t|| t | jd ¡ ƒ| _t||||d dd�| _| jj| _| j| jd  | _g }dd„ t  d|t!|ƒ¡ "|¡D ƒ}d}d	}t#t| jƒƒD ]|}|| }| $t%| j| | j| j|| || |||	|
|||| |||d�¡ |  jt&||d|› �d�g7  _|}|d9 }�q¶tj'|Ž | _(||d ƒ| _)t*| j| j
|d�\}}|| _+t ,|¡| _-|| _.|  /|¡ dS )a‰  
        Args:
            img_size (int, tuple): input image size
            in_chans (int): number of input channels
            patch_size (int): patch size
            num_levels (int): number of block hierarchies (T_d in the paper)
            embed_dims (int, tuple): embedding dimensions of each level
            num_heads (int, tuple): number of attention heads for each level
            depths (int, tuple): number of transformer layers for each level
            num_classes (int): number of classes for classification head
            mlp_ratio (int): ratio of mlp hidden dim to embedding dim for MLP of transformer layers
            qkv_bias (bool): enable bias for qkv if True
            drop_rate (float): dropout rate for MLP of transformer layers, MSA final projection layer, and classifier
            attn_drop_rate (float): attention dropout rate
            drop_path_rate (float): stochastic depth rate
            norm_layer: (nn.Module): normalization layer for transformer layers
            act_layer: (nn.Module): activation layer in MLP of transformer layers
            pad_type: str: Type of padding to use '' for PyTorch symmetric, 'same' for TF SAME
            weight_init: (str): weight init scheme
            global_pool: (str): type of pooling operation to apply to final feature map

        Notes:
            - Default values follow NesT-B from the original Jax code.
            - `embed_dims`, `num_heads`, `depths` should be ints or tuples with length `num_levels`.
            - For those following the paper, Table A1 may have errors!
                - https://github.com/google-research/nested-transformer/issues/2
        ©Ú
embed_dimsr#   ÚdepthszRequire `len(z) == num_levels`r6   r   r   z Model only handles square inputsz*`patch_size` must divide `img_size` evenlyr2   zUFirst level blocks don't fit evenly. Check `img_size`, `patch_size`, and `num_levels`F)Úimg_sizeÚ
patch_sizeÚin_chansrx   Úflattenc                 S   s   g | ]}|  ¡ ‘qS r0   )Útolist)ru   r=   r0   r0   r1   ry   [  s     z!Nest.__init__.<locals>.<listcomp>N)rZ   r-   r*   r(   rV   r[   rS   rg   zlevels.)Znum_chsZ	reductionÚmoduler3   ©Z	pool_type)0r!   r"   ÚlocalsÚ
isinstanceÚcollectionsÚabcÚSequencer}   r~   r   Únum_classesÚnum_featuresZfeature_infor   r   r^   Ú	drop_rateÚ
num_levelsr”   rK   ZarangeÚflipr—   r‚   rm   rn   rX   ri   r   Úpatch_embedZnum_patchesrƒ   ZlinspaceÚsumÚsplitr€   Úappendrs   Údictr   Úlevelsre   r
   Úglobal_poolr'   Ú	head_dropÚheadÚinit_weights)r+   r“   r•   r”   r¢   r‘   r#   r’   rŸ   rZ   r-   r¡   Zproj_drop_rateZattn_drop_rateZdrop_path_rater[   rS   rg   Zweight_initrª   Ú
param_nameZparam_valuer©   Zdp_ratesZprev_dimZcurr_striderv   r,   r¬   r.   r0   r1   r"   ü   s†    1



 ÿû
"ñ zNest.__init__c                 C   sZ   |dkst ‚d|kr"t | j¡ nd}| jD ]}t|jdddd� q,ttt	|d�| ƒ d S )	N)Únlhbr`   r¯   r   ç{®Gáz”?r5   r3   ©ÚstdÚaÚb)Ú	head_bias)
r~   rm   ÚlogrŸ   r©   r   r|   r   r   Ú_init_nest_weights)r+   Úmoderµ   Úlevelr0   r0   r1   r­   �  s
    
zNest.init_weightsc                 C   s   dd„ t t| jƒƒD ƒS )Nc                 S   s   h | ]}d |› d�’qS )zlevel.z
.pos_embedr0   rt   r0   r0   r1   Ú	<setcomp>‹  s     z'Nest.no_weight_decay.<locals>.<setcomp>)r€   r}   r©   ©r+   r0   r0   r1   Úno_weight_decay‰  s    zNest.no_weight_decayFc                 C   s"   t d|rdndd fddgd�}|S )Nz^patch_embedz^levels\.(\d+)z*^levels\.(\d+)\.transformer_encoder\.(\d+))z"^levels\.(\d+)\.(?:pool|pos_embed))r   )z^norm)iŸ† )ÚstemÚblocks)r¨   )r+   ZcoarseZmatcherr0   r0   r1   Úgroup_matcher�  s    ýþzNest.group_matcherc                 C   s   | j D ]
}||_qd S r\   )r©   rz   )r+   ÚenableÚlr0   r0   r1   Úset_grad_checkpointing™  s    
zNest.set_grad_checkpointingc                 C   s   | j S r\   )r¬   r»   r0   r0   r1   Úget_classifierž  s    zNest.get_classifierc                 C   s$   || _ t| j| j |d�\| _| _d S )Nr™   )rŸ   r
   r    rª   r¬   )r+   rŸ   rª   r0   r0   r1   Úreset_classifier¢  s      ÿzNest.reset_classifierc                 C   s:   |   |¡}|  |¡}|  | dddd¡¡ dddd¡}|S )Nr   r3   r   r   )r¤   r©   re   r9   rh   r0   r0   r1   Úforward_features§  s    

"zNest.forward_features)Ú
pre_logitsc                 C   s&   |   |¡}|  |¡}|r|S |  |¡S r\   )rª   r«   r¬   )r+   r=   rÆ   r0   r0   r1   Úforward_head®  s    

zNest.forward_headc                 C   s   |   |¡}|  |¡}|S r\   )rÅ   rÇ   rh   r0   r0   r1   rF   ³  s    

zNest.forward)r…   r   r2   r   r†   r‰   r‹   r�   rR   Tr   r   r   rŽ   NNr`   r`   r�   )r`   )F)T)r�   )F)rG   rH   rI   rJ   r"   rK   rL   Úignorer­   r¼   r¿   rÂ   rÃ   rÄ   rÅ   rN   rÇ   rF   rP   r0   r0   r.   r1   r   õ   sH                      ì 


r`   r   ©r˜   Únamerµ   c                 C   s    t | tjƒrf| d¡r:t| jdddd� tj | j|¡ qœt| jdddd� | jdk	rœtj 	| j¡ n6t | tj
ƒrœt| jdddd� | jdk	rœtj 	| j¡ dS )zn NesT weight initialization
    Can replicate Jax implementation. Otherwise follows vision_transformer.py
    r¬   r°   r5   r3   r±   N)r›   r   r%   Ú
startswithr   ÚweightÚinitZ	constant_r    Zzeros_ZConv2drÉ   r0   r0   r1   r·   ¹  s    


r·   c                 C   sš   t  d| j|j¡ | jd }|jdd… \}}tt || ¡ƒ}t| tt |¡ƒƒ dddd¡} tj	| ||gddd�} t
|  dddd¡tt |¡ƒƒ} | S )	zª
    Rescale the grid of position embeddings when loading from state_dict
    Expected shape of position embeddings is (1, T, N, C), and considers only square images
    z$Resized position embedding: %s to %sr3   r   r   r   ÚbicubicF)Úsizer¸   Zalign_corners)Ú_loggerÚinfor7   rX   rm   rn   rr   r9   r:   Zinterpolaterl   )ZposembZ
posemb_newZseq_length_oldZnum_blocks_newZseq_length_newZsize_newr0   r0   r1   Úresize_pos_embedË  s    
  rÒ   c                 C   sN   dd„ |   ¡ D ƒ}|D ]2}| | jt||ƒjkrt| | t||ƒƒ| |< q| S )z4 resize positional embeddings of pretrained weights c                 S   s   g | ]}|  d ¡r|‘qS )Z
pos_embed_)rË   )ru   rC   r0   r0   r1   ry   Þ  s     
 z(checkpoint_filter_fn.<locals>.<listcomp>)Úkeysr7   ÚgetattrrÒ   )Z
state_dictÚmodelZpos_embed_keysrC   r0   r0   r1   Úcheckpoint_filter_fnÜ  s
    rÖ   Fc                 K   s&   t t| |ftddd�tdœ|—Ž}|S )N)r   r   r3   T)Zout_indicesZflatten_sequential)Zfeature_cfgZpretrained_filter_fn)r   r   r¨   rÖ   )ÚvariantÚ
pretrainedÚkwargsrÕ   r0   r0   r1   Ú_create_nestå  s    ý
ûú	rÚ   c                 K   s$   | ddddgdddt tddd	œ|–S )
Nr�   )r   r…   r…   é   g      ì?rÎ   Tzpatch_embed.projr¬   )ÚurlrŸ   Z
input_sizeZ	pool_sizeZcrop_pctÚinterpolationZfixed_input_sizeZmeanr²   Z
first_convÚ
classifierr   )rÜ   rÙ   r0   r0   r1   Ú_cfgò  s          ûúrß   ztimm/)Z	hf_hub_id)znest_base.untrainedznest_small.untrainedznest_tiny.untrainedznest_base_jx.goog_in1kznest_small_jx.goog_in1kznest_tiny_jx.goog_in1k)Úreturnc                 K   s,   t f ddddœ|—Ž}tdd| i|—Ž}|S )ú Nest-B @ 224x224
    r†   r‰   r‹   r�   Ú	nest_baserØ   )râ   ©r¨   rÚ   ©rØ   rÙ   Zmodel_kwargsrÕ   r0   r0   r1   râ     s      ÿÿrâ   c                 K   s,   t f ddddœ|—Ž}tdd| i|—Ž}|S )ú Nest-S @ 224x224
    ©é`   éÀ   i€  ©r   é   é   r‹   r�   Ú
nest_smallrØ   )rì   rã   rä   r0   r0   r1   rì     s    rì   c                 K   s,   t f ddddœ|—Ž}tdd| i|—Ž}|S )ú Nest-T @ 224x224
    ræ   ré   ©r3   r3   r   r�   Ú	nest_tinyrØ   )rï   rã   rä   r0   r0   r1   rï     s    rï   c                 K   s8   |  dd¡ tf ddddœ|—Ž}td	d| i|—Ž}|S )
rá   rg   Úsamer†   r‰   r‹   r�   Únest_base_jxrØ   )rñ   ©Ú
setdefaultr¨   rÚ   rä   r0   r0   r1   rñ   $  s      ÿÿrñ   c                 K   s8   |  dd¡ tf ddddœ|—Ž}td	d| i|—Ž}|S )
rå   rg   rð   ræ   ré   r‹   r�   Únest_small_jxrØ   )rô   rò   rä   r0   r0   r1   rô   /  s    rô   c                 K   s8   |  dd¡ tf ddddœ|—Ž}td	d| i|—Ž}|S )
rí   rg   rð   ræ   ré   rî   r�   Únest_tiny_jxrØ   )rõ   rò   rä   r0   r0   r1   rõ   9  s    rõ   )Zjx_nest_baseZjx_nest_smallZjx_nest_tiny)r`   r   )F)r`   )F)F)F)F)F)F)ArJ   Úcollections.abcrœ   Úloggingrm   Ú	functoolsr   rK   Ztorch.nn.functionalr   Z
functionalr:   Z	timm.datar   r   Ztimm.layersr   r   r	   r
   r   r   r   r   r   r   r   Z_builderr   Z_features_fxr   Z_manipulater   r   Ú	_registryr   r   r   Ú__all__Ú	getLoggerrG   rÐ   ÚModuler   rQ   r_   rX   rl   rr   rs   r   ÚstrÚfloatr·   rÒ   rÖ   rÚ   rß   Zdefault_cfgsrâ   rì   rï   rñ   rô   rõ   r0   r0   r0   r1   Ú<module>   sn    
,,B E	

ù	
		ý