o
    پiC                     @   s  d Z ddlZddlmZ ddlmZ ddlmZ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d4dejdede f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*d5d%d&Z+d6d(d)Z,ee,d*d+e,d*d+e,d*d+d,Z-ed5d-e)fd.d/Z.ed5d-e)fd0d1Z/ed5d-e)fd2d3Z0dS )7zk Sequencer

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

    N)partial)
accumulate)Optional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   s  t | tjrY|drtj| j tj| j| d S |r3t	| j | jd ur1tj| j d S d S tj
| j | jd urWd|v rNtjj| jdd d S tj| j d S d S t | tjrtt	| j | jd urrtj| j d S d S t | tjtjtjfrtj| j tj| j d S t | tjtjtjfrdt| j }|  D ]}tj|| | qd S t| dr|   d S d S )Nheadmlpư>)stdg      ?init_weights)
isinstancennLinear
startswithinitzeros_weight	constant_biasr	   xavier_uniform_normal_Conv2d	LayerNormBatchNorm2d	GroupNormones_RNNGRULSTMmathsqrthidden_size
parametersuniform_hasattrr   )r   r   r   flaxstdvr#    r8   I/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/sequencer.py_init_weights   s>   






r:   c                       s:   e Zd Z fddZdejdeejdf fddZ  ZS )RNNIdentityc                    s   t t|   d S N)superr;   __init__)selfargskwargs	__class__r8   r9   r>   <   s   zRNNIdentity.__init__xreturnNc                 C   s   |d fS r<   r8   r?   rD   r8   r8   r9   forward?   s   zRNNIdentity.forward)	__name__
__module____qualname__r>   torchTensorr   rG   __classcell__r8   r8   rB   r9   r;   ;   s    &r;   c                       sF   e Zd Z					ddededededef
 fd	d
Zdd Z  ZS )	RNN2dBaser   Tcat
input_sizer2   
num_layersr%   bidirectionalc                    s  t    || _|| _|rd| n|| _|| _d| _d| _|| _d | _	|rg|dkr4t
d| j || _	n|dkrAt
| j|| _	n|dkrQt
| j|| _	d| _n|dkrat
| j|| _	d| _nptd| |dkr	 d| j |krtd	d| j  d
| dnO|dkr	 | j|krtd	| j d
| dn8|dkr| j|krtd	| j d
| dd| _n|dkr| j|krtd	| j d
| dd| _ntd| t | _t | _d S )N   TrO   addverticalF
horizontalzUnrecognized union: zThe output channel z% is different from the input channel .)r=   r>   rP   r2   output_sizeunionwith_verticalwith_horizontalwith_fcfcr   r   
ValueErrorr;   rnn_vrnn_hr?   rP   r2   rQ   r%   rR   rY   r\   rB   r8   r9   r>   E   sT   




zRNN2dBase.__init__c           	      C   s  |j \}}}}| jr1|dddd}|d||}| |\}}||||d}|dddd}nd }| jrM|d||}| |\}}||||d}nd }|d urk|d urk| jdkrftj	||gdd}n|| }n|d urr|}n|d urx|}| j
d ur| 
|}|S )Nr   rS   r      rO   )dim)shaperZ   permutereshaper_   r[   r`   rY   rK   rO   r]   )	r?   rD   BHWCv_hr8   r8   r9   rG   ~   s0   



zRNN2dBase.forwardr   TTrO   T)rH   rI   rJ   intboolr>   rG   rM   r8   r8   rB   r9   rN   C   s$    9rN   c                       s>   e Zd Z					ddededededef
 fd	d
Z  ZS )LSTM2dr   TrO   rP   r2   rQ   r%   rR   c              	      s\   t  ||||||| | jrtj|||d||d| _| jr,tj|||d||d| _d S d S )NT)batch_firstr%   rR   )r=   r>   rZ   r   r/   r_   r[   r`   ra   rB   r8   r9   r>      s(   
zLSTM2d.__init__ro   )rH   rI   rJ   rp   rq   r>   rM   r8   r8   rB   r9   rr      s"    rr   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   TrO   r   c                    sp   t    t|| }||| _|||||	|
|d| _|dkr#t|nt | _||| _	|||||d| _
d S )N)rQ   rR   rY   r\   r   )	act_layerdrop)r=   r>   rp   norm1
rnn_tokensr
   r   Identity	drop_pathnorm2mlp_channels)r?   rd   r2   	mlp_ratio	rnn_layer	mlp_layer
norm_layerrx   rQ   rR   rY   r\   ry   r}   channels_dimrB   r8   r9   r>      s   


zSequencer2dBlock.__init__c                 C   s8   ||  | | | }||  | | | }|S r<   )r}   r{   rz   r   r~   rF   r8   r8   r9   rG      s   zSequencer2dBlock.forward)rH   rI   rJ   rr   r   r   r   r)   GELUr>   rG   rM   r8   r8   rB   r9   rt      s    rt   c                       $   e Zd Z fddZdd Z  ZS )Shufflec                    s   t    d S r<   )r=   r>   r?   rB   r8   r9   r>      s   zShuffle.__init__c                 C   sV   | j r)|j\}}}}t|| }||d|}|d d |d d f |||d}|S )Nrc   )trainingre   rK   randpermrg   )r?   rD   rh   ri   rj   rk   rr8   r8   r9   rG      s   "zShuffle.forwardrH   rI   rJ   r>   rG   rM   r8   r8   rB   r9   r      s    r   c                       r   )Downsample2dc                    s"   t    tj||||d| _d S )N)kernel_sizestride)r=   r>   r   r(   down)r?   	input_dim
output_dim
patch_sizerB   r8   r9   r>      s   
zDownsample2d.__init__c                 C   s.   | dddd}| |}| dddd}|S )Nr   rb   r   rS   )rf   r   rF   r8   r8   r9   rG      s   
zDownsample2d.forwardr   r8   r8   rB   r9   r      s    r   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   rv   r   TrO   r   c                    s   t    |rt|||| _n||ksJ t | _g }t|D ]!}||||||	|
|||||||t|t	t
fr<|| n|d q tj| | _d S )N)r   r   r   r   rx   rQ   rR   rY   r\   ry   r}   )r=   r>   r   
downsampler   r|   rangeappendr   listtuple
Sequentialblocks)r?   rd   dim_outdepthr   r2   r   r   block_layerr   r   r   rx   rQ   rR   rY   r\   ry   r}   r   	block_idxrB   r8   r9   r>     s.   


zSequencer2dStage.__init__c                 C      |  |}| |}|S r<   )r   r   rF   r8   r8   r9   rG   1     

zSequencer2dStage.forward)rH   rI   rJ   rt   rr   r   r   r   r)   r   r>   rG   rM   r8   r8   rB   r9   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ejfddZd*dedee fdd Zd!d" Zd(d#efd$d%Zd&d' Z  ZS )+r        rb   avg   rb      rb   )   rS   rS   r        r   r   0   `   r   r   ru   ru   ru   ru   r   rv   r   TrO   r   Fc              	      s  t    |dv sJ || _|| _|d  | _| _d| _d| _g | _t	d |d ||d |r/|nd ddd| _
t|t|  krUt|  krUt|  krUt|	ksXJ  J tt|dd }g }|d }t|D ]`\}}|t||| fi d	|| d
|dkd|| d|| d|	| d|
d|d|d|d|d|d|d|d|d|d|g7 }|| }|  jt||| d| dg7  _qktj| | _||d | _t| j|||| jd| _| j|d d S )N) r   rc   NHWCr   F)img_sizer   in_chans	embed_dimr   flatten
output_fmtc                 S   s   | | S r<   r8   )rD   yr8   r8   r9   <lambda>e  s    z&Sequencer2d.__init__.<locals>.<lambda>r   r   r   r2   r   r   r   r   r   rx   rQ   rR   rY   r\   ry   r}   stages.)num_chs	reductionr   )	pool_type	drop_rate	input_fmt)nlhb)r=   r>   num_classesglobal_poolnum_featureshead_hidden_sizefeature_dimr   feature_infor   stemlenr   r   	enumerater   dictr   r   stagesnormr   r   r   )r?   r   r   r   r   layerspatch_sizes
embed_dimshidden_sizes
mlp_ratiosr   r   r   r   rx   num_rnn_layersrR   rY   r\   r   drop_path_rater   	stem_norm
reductionsr   prev_dimirm   rB   r8   r9   r>   8  s   

D
	
&zSequencer2d.__init__c                 C   s.   |r	t | j nd}ttt|d| d d S )Nr   )r   )r   )r0   logr   r   r   r:   )r?   r   r   r8   r8   r9   r     s   zSequencer2d.init_weightsc                 C   s    t d|r
ddgdS g d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   )r   )r?   coarser8   r8   r9   group_matcher  s   zSequencer2d.group_matcherc                 C   s   |rJ dd S )Nz$gradient checkpointing not supportedr8   )r?   enabler8   r8   r9   set_grad_checkpointing  s   z"Sequencer2d.set_grad_checkpointingrE   c                 C   s   | j S r<   r   r   r8   r8   r9   get_classifier  s   zSequencer2d.get_classifierNr   r   c                 C   s   || _ | jj||d d S )N)r   )r   r   reset)r?   r   r   r8   r8   r9   reset_classifier  s   zSequencer2d.reset_classifierc                 C   s"   |  |}| |}| |}|S r<   )r   r   r   rF   r8   r8   r9   forward_features  s   


zSequencer2d.forward_features
pre_logitsc                 C   s   |r	| j |ddS |  |S )NT)r   r   )r?   rD   r   r8   r8   r9   forward_head  s   zSequencer2d.forward_headc                 C   r   r<   )r   r   rF   r8   r8   r9   rG     r   zSequencer2d.forwardF)Tr<   )rH   rI   rJ   rt   rr   r   r   r   r)   r   r>   r   rK   jitignorer   r   Moduler   rp   r   strr   r   rq   r   rG   rM   r8   r8   rB   r9   r   7  sF    
Tc                 C   sr   d| v r| S d| v r| d } ddl }i }|  D ]\}}|ddd |}|dd	|}|d
d}|||< q|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)rp   group)rD   r8   r8   r9   r     s    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)
state_dictr   r   out_dictkrl   r8   r8   r9   checkpoint_filter_fn  s   
r   c                 K   s>   t td}|d|}tt| |fttd|dd|}|S )Nrb   out_indicesT)flatten_sequentialr   )pretrained_filter_fnfeature_cfg)r   r   popr   r   r   r   )variant
pretrainedrA   default_out_indicesr   r   r8   r8   r9   _create_sequencer2d  s   
r   r   c                 K   s    | ddd t ddttddd|S )Nr   )rb   r   r   bicubicTz	stem.projzhead.fc)urlr   rP   	pool_sizecrop_pctinterpolationfixed_input_sizemeanr   
first_conv
classifier)r   r   r   )r   rA   r8   r8   r9   _cfg  s   r  ztimm/)	hf_hub_id)zsequencer2d_s.in1kzsequencer2d_m.in1kzsequencer2d_l.in1krE   c                 K   sP   t g dg dg dg dg dtdddd	}tdd
| it |fi |}|S )Nr   r   rS   r   r   r   r   r   TrO   	r   r   r   r   r   r   rR   rY   r\   sequencer2d_sr   )r	  r   rr   r   r   rA   
model_argsr   r8   r8   r9   r	    s   r	  c                 K   X   t dg dg dg dg dg dtdddd	|}tdd
| it |fi |}|S )N)r   rb      rb   r  r   r   r   TrO   r  sequencer2d_mr   r8   )r  r
  r  r8   r8   r9   r       
r  c                 K   r  )N)r   r      r   r  r   r   r   TrO   r  sequencer2d_lr   r8   )r  r
  r  r8   r8   r9   r    r  r  )r   Fr   )r   )1__doc__r0   	functoolsr   	itertoolsr   typingr   r   rK   torch.nnr   	timm.datar   r   r   timm.layersr	   r
   r   r   r   _builderr   _manipulater   	_registryr   r   __all__r   r   floatr:   r;   rN   rr   rt   r   r   r   r   r   r   r  default_cfgsr	  r  r  r8   r8   r8   r9   <module>   sJ    !^!&6 

