U
    ¯Ê¹jfC  ã                   @   sÄ  d Z ddlZddlm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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gZd2e
jeedœdd„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
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(d!d"„ Z)d3d#d$„Z*d4d&d'„Z+ee+d(d)�e+d(d)�e+d(d)�d*œƒZ,ed5e(d+œd,d-„ƒZ-ed6e(d+œd.d/„ƒZ.ed7e(d+œd0d1„ƒZ/dS )8zk Sequencer

Paper: `Sequencer: Deep LSTM for Image Classification` - https://arxiv.org/pdf/2205.01972.pdf

é    N)Úpartial)Ú
accumulate)ÚTuple)ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STDÚDEFAULT_CROP_PCT)Úlecun_normal_ÚDropPathÚMlpÚ
PatchEmbedÚClassifierHeadé   )Úbuild_model_with_cfg)Únamed_apply)Úregister_modelÚgenerate_default_cfgsÚSequencer2dç        F)ÚmoduleÚnameÚ	head_biasc                 C   sl  t | tjƒr¢| d¡r6tj | j¡ tj | j|¡ nj|r^t	| jƒ | jd k	r tj | j¡ nBtj 
| j¡ | jd k	r d|kr’tjj| jdd� ntj | j¡ nÆt | tjƒrÒt	| jƒ | jd k	rÐtj | j¡ n–t | tjtjtjfƒ�rtj | j¡ tj | j¡ n`t | tjtjtjfƒ�rTdt | j¡ }|  ¡ D ]}tj || |¡ �q8nt| dƒ�rh|  ¡  d S )NÚheadZmlpç�íµ ÷Æ°>)Ústdg      ð?Úinit_weights)Ú
isinstanceÚnnÚLinearÚ
startswithÚinitZzeros_ÚweightZ	constant_Úbiasr   Zxavier_uniform_Znormal_ÚConv2dÚ	LayerNormZBatchNorm2dZ	GroupNormZones_ZRNNZGRUÚLSTMÚmathÚsqrtÚhidden_sizeÚ
parametersZuniform_Úhasattrr   )r   r   r   ZflaxZstdvr    © r*   úT/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/sequencer.pyÚ_init_weights   s4    





r,   c                       s8   e Zd Z‡ fdd„Zejeejdf dœdd„Z‡  ZS )ÚRNNIdentityc                    s   t t| ƒ ¡  d S ©N)Úsuperr-   Ú__init__)ÚselfÚargsÚkwargs©Ú	__class__r*   r+   r0   <   s    zRNNIdentity.__init__N)ÚxÚreturnc                 C   s   |d fS r.   r*   ©r1   r6   r*   r*   r+   Úforward?   s    zRNNIdentity.forward)	Ú__name__Ú
__module__Ú__qualname__r0   ÚtorchZTensorr   r9   Ú__classcell__r*   r*   r4   r+   r-   ;   s   r-   c                       s4   e Zd Zd	eeeeedœ‡ fdd„Zdd„ Z‡  ZS )
Ú	RNN2dBaser   TÚcat©Ú
input_sizer'   Ú
num_layersr!   Úbidirectionalc                    sÄ  t ƒ  ¡  || _|| _|r"d| n|| _|| _d| _d| _|| _d | _	|rÐ|dkrht
 d| j |¡| _	nf|dkr‚t
 | j|¡| _	nL|dkr¢t
 | j|¡| _	d| _n,|dkrÂt
 | j|¡| _	d| _ntd| ƒ‚nà|dk�rd| j |k�r°td	d| j › d
|› d�ƒ‚n¨|dk�r8| j|k�r°td	| j› d
|› d�ƒ‚nx|dk�rn| j|k�rftd	| j› d
|› d�ƒ‚d| _nB|dk�r¤| j|k�rœtd	| j› d
|› d�ƒ‚d| _ntd| ƒ‚tƒ | _tƒ | _d S )Né   Tr@   ÚaddÚverticalFÚ
horizontalzUnrecognized union: zThe output channel z% is different from the input channel Ú.)r/   r0   rB   r'   Zoutput_sizeÚunionÚwith_verticalÚwith_horizontalÚwith_fcÚfcr   r   Ú
ValueErrorr-   Úrnn_vÚrnn_h©r1   rB   r'   rC   r!   rD   rJ   rM   r4   r*   r+   r0   E   sL    





zRNN2dBase.__init__c           	      C   s
  |j \}}}}| jrb| dddd¡}| d||¡}|  |¡\}}| |||d¡}| dddd¡}nd }| jrš| d||¡}|  |¡\}}| |||d¡}nd }|d k	rÖ|d k	rÖ| jdkrÌtj	||gdd�}qð|| }n|d k	rä|}n|d k	rð|}| j
d k	�r|  
|¡}|S )Nr   rE   r   é   éÿÿÿÿr@   )Údim)ÚshaperK   ÚpermuteÚreshaperP   rL   rQ   rJ   r=   r@   rN   )	r1   r6   ÚBÚHÚWÚCÚvÚ_Úhr*   r*   r+   r9   ~   s0    


zRNN2dBase.forward)r   TTr@   T)r:   r;   r<   ÚintÚboolr0   r9   r>   r*   r*   r4   r+   r?   C   s        øú9r?   c                       s,   e Zd Zdeeeeedœ‡ fdd„Z‡  ZS )ÚLSTM2dr   Tr@   rA   c              	      sX   t ƒ  |||||||¡ | jr6tj|||d||d�| _| jrTtj|||d||d�| _d S )NT)Zbatch_firstr!   rD   )r/   r0   rK   r   r$   rP   rL   rQ   rR   r4   r*   r+   r0   £   s&    
úúzLSTM2d.__init__)r   TTr@   T)r:   r;   r<   r`   ra   r0   r>   r*   r*   r4   r+   rb   ¡   s        øúrb   c                       sH   e Zd Zdeeeejdd�ejddddddf‡ fdd	„	Z	d
d„ Z
‡  ZS )ÚSequencer2dBlockç      @r   ©Úepsr   Tr@   r   c                    sp   t ƒ  ¡  t|| ƒ}||ƒ| _|||||	|
|d�| _|dkrFt|ƒnt ¡ | _||ƒ| _	|||||d�| _
d S )N)rC   rD   rJ   rM   r   )Ú	act_layerÚdrop)r/   r0   r`   Únorm1Ú
rnn_tokensr	   r   ÚIdentityÚ	drop_pathÚnorm2Úmlp_channels)r1   rU   r'   Ú	mlp_ratioÚ	rnn_layerÚ	mlp_layerÚ
norm_layerrg   rC   rD   rJ   rM   rh   rl   Zchannels_dimr4   r*   r+   r0   Ã   s    

ú
zSequencer2dBlock.__init__c                 C   s8   ||   |  |  |¡¡¡ }||   |  |  |¡¡¡ }|S r.   )rl   rj   ri   rn   rm   r8   r*   r*   r+   r9   â   s    zSequencer2dBlock.forward)r:   r;   r<   rb   r
   r   r   r#   ÚGELUr0   r9   r>   r*   r*   r4   r+   rc   Â   s   òrc   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚShufflec                    s   t ƒ  ¡  d S r.   )r/   r0   ©r1   r4   r*   r+   r0   é   s    zShuffle.__init__c                 C   sV   | j rR|j\}}}}t || ¡}| |d|¡}|d d …|d d …f  |||d¡}|S )NrT   )ZtrainingrV   r=   ZrandpermrX   )r1   r6   rY   rZ   r[   r\   Úrr*   r*   r+   r9   ì   s    "zShuffle.forward©r:   r;   r<   r0   r9   r>   r*   r*   r4   r+   rt   è   s   rt   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚDownsample2dc                    s"   t ƒ  ¡  tj||||d�| _d S )N)Zkernel_sizeZstride)r/   r0   r   r"   Údown)r1   Z	input_dimZ
output_dimÚ
patch_sizer4   r*   r+   r0   ö   s    
zDownsample2d.__init__c                 C   s.   |  dddd¡}|  |¡}|  dddd¡}|S )Nr   rS   r   rE   )rW   ry   r8   r*   r*   r+   r9   ú   s    
zDownsample2d.forwardrw   r*   r*   r4   r+   rx   õ   s   rx   c                       sJ   e Zd Zdeeeeejdd�ej	ddddddf‡ fdd	„	Z
d
d„ Z‡  ZS )ÚSequencer2dStageFr   re   r   Tr@   r   c                    s”   t ƒ  ¡  |rt|||ƒ| _n||ks*t‚t ¡ | _g }t|ƒD ]B}| |||||	|
|||||||t	|t
tfƒrx|| n|d�¡ q@tj|Ž | _d S )N)ro   rp   rq   rr   rg   rC   rD   rJ   rM   rh   rl   )r/   r0   rx   Ú
downsampleÚAssertionErrorr   rk   ÚrangeÚappendr   ÚlistÚtupleÚ
SequentialÚblocks)r1   rU   Zdim_outÚdepthrz   r'   ro   r|   Úblock_layerrp   rq   rr   rg   rC   rD   rJ   rM   rh   rl   rƒ   Z	block_idxr4   r*   r+   r0     s.    

ó
zSequencer2dStage.__init__c                 C   s   |   |¡}|  |¡}|S r.   )r|   rƒ   r8   r*   r*   r+   r9   1  s    

zSequencer2dStage.forward)r:   r;   r<   rc   rb   r
   r   r   r#   rs   r0   r9   r>   r*   r*   r4   r+   r{     s   	í/r{   c                       s¾   e Zd Zddddddddd	eeeeejd
d�ej	ddddddddf‡ fdd„	Z
d%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   éè  éà   rS   Úavg)é   rS   é   rS   )é   rE   rE   r   )éÀ   é€  r�   r�   )é0   é`   r�   r�   )rd   rd   rd   rd   r   re   r   Tr@   r   Fc                    s�  t ƒ  ¡  |dkst‚|| _|| _|d | _d| _d| _g | _t	d |d ||d |rX|nd ddd�| _
t|ƒt|ƒ  kr¢t|ƒ  kr¢t|ƒ  kr¢t|	ƒks¨n t‚tt|dd„ ƒƒ}g }|d }t|ƒD ]~\}}|t||| || |dk|| || |	| |
||||||||||d	�g7 }|| }|  jt||| d
|› �d�g7  _qÎtj|Ž | _||d ƒ| _t| j|||| jd�| _| j|d� d S )N)Ú rˆ   rT   ZNHWCr   F)Úimg_sizerz   Úin_chansZ	embed_dimrr   ÚflattenÚ
output_fmtc                 S   s   | | S r.   r*   )r6   Úyr*   r*   r+   Ú<lambda>e  ó    z&Sequencer2d.__init__.<locals>.<lambda>)r„   r|   rz   r'   ro   r…   rp   rq   rr   rg   rC   rD   rJ   rM   rh   rl   ústages.)Znum_chsZ	reductionr   )Ú	pool_typeÚ	drop_rateZ	input_fmt)Únlhb)r/   r0   r}   Únum_classesÚglobal_poolZnum_featuresZfeature_dimr”   Zfeature_infor   ÚstemÚlenr€   r   Ú	enumerater{   Údictr   r‚   ÚstagesÚnormr   r   r   )r1   rœ   r‘   r’   r�   ÚlayersÚpatch_sizesÚ
embed_dimsÚhidden_sizesÚ
mlp_ratiosr…   rp   rq   rr   rg   Znum_rnn_layersrD   rJ   rM   rš   Zdrop_path_rater›   Z	stem_normZ
reductionsr¢   Zprev_dimÚir^   r4   r*   r+   r0   8  sl    


ù
Bî
&ûzSequencer2d.__init__c                 C   s.   |rt  | j¡ nd}ttt|d�| d� d S )Nr   )r   )r   )r%   Úlogrœ   r   r   r,   )r1   r›   r   r*   r*   r+   r   Œ  s    zSequencer2d.init_weightsc                 C   s   t d|rddgndddgd�S )Nz^stem)z^stages\.(\d+)N)z^norm)iŸ† )z^stages\.(\d+)\.blocks\.(\d+)N)z^stages\.(\d+)\.downsample)r   )rž   rƒ   )r¡   )r1   Zcoarser*   r*   r+   Úgroup_matcher�  s    ýþýûzSequencer2d.group_matcherc                 C   s   |rt dƒ‚d S )Nz$gradient checkpointing not supported)r}   )r1   Úenabler*   r*   r+   Úset_grad_checkpointingž  s    z"Sequencer2d.set_grad_checkpointingc                 C   s   | j S r.   ©r   ru   r*   r*   r+   Úget_classifier¢  s    zSequencer2d.get_classifierNc                 C   s   || _ | jj||d� d S )N)r™   )rœ   r   Úreset)r1   rœ   r�   r*   r*   r+   Úreset_classifier¦  s    zSequencer2d.reset_classifierc                 C   s"   |   |¡}|  |¡}|  |¡}|S r.   )rž   r¢   r£   r8   r*   r*   r+   Úforward_featuresª  s    


zSequencer2d.forward_features©Ú
pre_logitsc                 C   s   |r| j |dd�S |   |¡S )NTr³   r®   )r1   r6   r´   r*   r*   r+   Úforward_head°  s    zSequencer2d.forward_headc                 C   s   |   |¡}|  |¡}|S r.   )r²   rµ   r8   r*   r*   r+   r9   ³  s    

zSequencer2d.forward)F)F)T)N)F)r:   r;   r<   rc   rb   r
   r   r   r#   rs   r0   r   r=   ZjitÚignorer«   r­   r¯   r±   r²   ra   rµ   r9   r>   r*   r*   r4   r+   r   7  sD   éT


c                 C   sr   d| kr| S d| kr| d } ddl }i }|  ¡ D ]<\}}| ddd„ |¡}| dd	|¡}| d
d¡}|||< q0|S )z$ Remap original checkpoints -> timm zstages.0.blocks.0.norm1.weightÚmodelr   Nzblocks.([0-9]+).([0-9]+).downc                 S   s   dt |  d¡ƒd › d�S )Nr˜   r   z.downsample.down)r`   Úgroup)r6   r*   r*   r+   r–   Ã  r—   z&checkpoint_filter_fn.<locals>.<lambda>zblocks.([0-9]+).([0-9]+)zstages.\1.blocks.\2zhead.zhead.fc.)ÚreÚitemsÚsubÚreplace)Z
state_dictr·   r¹   Zout_dictÚkr]   r*   r*   r+   Úcheckpoint_filter_fn¹  s    
r¾   c                 K   s>   t tdƒƒ}| d|¡}tt| |fttd|d�dœ|—Ž}|S )NrS   Úout_indicesT)Zflatten_sequentialr¿   )Zpretrained_filter_fnZfeature_cfg)r�   r~   Úpopr   r   r¾   r¡   )ÚvariantÚ
pretrainedr3   Zdefault_out_indicesr¿   r·   r*   r*   r+   Ú_create_sequencer2dË  s    ý
ûúrÃ   r�   c                 K   s    | ddd t ddttdddœ|–S )Nr†   )rS   r‡   r‡   ZbicubicTz	stem.projzhead.fc)Úurlrœ   rB   Z	pool_sizeZcrop_pctÚinterpolationZfixed_input_sizeZmeanr   Z
first_convÚ
classifier)r   r   r   )rÄ   r3   r*   r*   r+   Ú_cfgÚ  s          ûúrÇ   ztimm/)Z	hf_hub_id)zsequencer2d_s.in1kzsequencer2d_m.in1kzsequencer2d_l.in1k)r7   c                 K   s`   t ddddgddddgddddgd	d
d
d
gddddgtdddd�	}tdd| it |f|Ž—Ž}|S )Nr‰   rS   rŠ   r‹   rE   r   rŒ   r�   rŽ   r�   rd   Tr@   ©	r¤   r¥   r¦   r§   r¨   rp   rD   rJ   rM   Úsequencer2d_srÂ   )rÉ   ©r¡   rb   rÃ   ©rÂ   r3   Z
model_argsr·   r*   r*   r+   rÉ   ì  s    




÷rÉ   c                 K   sh   t f ddddgddddgddddgd	d
d
d
gddddgtddddœ	|—Ž}tdd| it |f|Ž—Ž}|S )Nr‰   rS   é   r‹   rE   r   rŒ   r�   rŽ   r�   rd   Tr@   rÈ   Úsequencer2d_mrÂ   )rÍ   rÊ   rË   r*   r*   r+   rÍ   ý  s    




÷
örÍ   c                 K   sh   t f ddddgddddgddddgd	d
d
d
gddddgtddddœ	|—Ž}tdd| it |f|Ž—Ž}|S )NrŠ   é   r‰   r‹   rE   r   rŒ   r�   rŽ   r�   rd   Tr@   rÈ   Úsequencer2d_lrÂ   )rÏ   rÊ   rË   r*   r*   r+   rÏ     s    




÷
örÏ   )r   F)F)r�   )F)F)F)0Ú__doc__r%   Ú	functoolsr   Ú	itertoolsr   Útypingr   r=   Ztorch.nnr   Z	timm.datar   r   r   Ztimm.layersr   r	   r
   r   r   Z_builderr   Z_manipulater   Ú	_registryr   r   Ú__all__ÚModuleÚstrÚfloatr,   r-   r?   rb   rc   rt   rx   r{   r   r¾   rÃ   rÇ   Zdefault_cfgsrÉ   rÍ   rÏ   r*   r*   r*   r+   Ú<module>   sH   !^!&6 

ý