o
    پiF                  	   @   sz  d Z ddlmZ ddlmZmZmZmZmZm	Z	m
Z
 ddlZddlmZ ddlm  mZ ddl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 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*dee+ej,f dej$dee+ej,f fddZ-d6de+dedee+ef fd d!Z.e"e.d"d#e.d"d#e.d"d#e.d"d#e.d"d#e.d"d#d$Z/d7d&e+d'e0dede*fd(d)Z1e!d7d'e0dede*fd*d+Z2e!d7d'e0dede*fd,d-Z3e!d7d'e0dede*fd.d/Z4e!d7d'e0dede*fd0d1Z5e!d7d'e0dede*fd2d3Z6e!d7d'e0dede*fd4d5Z7dS )8a  FasterNet
Run, Don't Walk: Chasing Higher FLOPS for Faster Neural Networks
- paper: https://arxiv.org/abs/2303.03667
- code: https://github.com/JierunChen/FasterNet

@article{chen2023run,
  title={Run, Don't Walk: Chasing Higher FLOPS for Faster Neural Networks},
  author={Chen, Jierun and Kao, Shiu-hong and He, Hao and Zhuo, Weipeng and Wen, Song and Lee, Chul-Ho and Chan, S-H Gary},
  journal={arXiv preprint arXiv:2303.03667},
  year={2023}
}

Modifications by / Copyright 2025 Ryan Hou & Ross Wightman, original copyrights below
    )partial)AnyDictListOptionalSetTupleUnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)SelectAdaptivePool2dLinearDropPathtrunc_normal_	LayerType   )build_model_with_cfg)feature_take_indices)checkpoint_seq)register_modelgenerate_default_cfgs	FasterNetc                       sV   e Zd Zdededef fddZdejdejfdd	Zdejdejfd
dZ	  Z
S )Partial_conv3dimn_divforwardc                    sh   t    || | _|| j | _tj| j| jddddd| _|dkr(| j| _d S |dkr2| j	| _d S t
)N   r   Fbiasslicing	split_cat)super__init__	dim_conv3dim_untouchednnConv2dpartial_conv3forward_slicingr   forward_split_catNotImplementedError)selfr   r   r   	__class__ I/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/fasternet.pyr#   $   s   

zPartial_conv3.__init__xreturnc                 C   sR   |  }| |d d d | jd d d d f |d d d | jd d d d f< |S N)cloner(   r$   r,   r1   r/   r/   r0   r)   1   s   FzPartial_conv3.forward_slicingc                 C   s:   t j|| j| jgdd\}}| |}t ||fd}|S )Nr   )r   )torchsplitr$   r%   r(   cat)r,   r1   x1x2r/   r/   r0   r*   7   s   
zPartial_conv3.forward_split_cat)__name__
__module____qualname__intstrr#   r6   Tensorr)   r*   __classcell__r/   r/   r-   r0   r   #   s    r   c                       sh   e Zd Zeejddejdfdededededed	e	d
e	de
f fddZdejdejfddZ  ZS )MLPBlockTinplacer!   r   r   	mlp_ratio	drop_pathlayer_scale_init_value	act_layer
norm_layerpconv_fw_typec	           
   
      s   t    t|| }	tjtj||	ddd||	| tj|	|dddg | _t|||| _|dkr?tj	|t
| dd| _nd | _|dkrMt|| _d S t | _d S )Nr   Fr   r   T)requires_grad        )r"   r#   r>   r&   
Sequentialr'   mlpr   spatial_mixing	Parameterr6   oneslayer_scaler   IdentityrF   )
r,   r   r   rE   rF   rG   rH   rI   rJ   mlp_hidden_dimr-   r/   r0   r#   @   s   

$zMLPBlock.__init__r1   r2   c                 C   sZ   |}|  |}| jd ur!|| | jdd| |  }|S || | | }|S )N)rO   rR   rF   	unsqueezerN   )r,   r1   shortcutr/   r/   r0   r   _   s   

zMLPBlock.forward)r;   r<   r=   r   r&   ReLUBatchNorm2dr>   floatr   r?   r#   r6   r@   r   rA   r/   r/   r-   r0   rB   ?   s,    	rB   c                       s   e Zd Zeejddejdddfdedededed	ed
ede	de	de
dedeeeeef f f fddZdejdejfddZ  ZS )BlockTrC   r!      r   depthr   rE   rF   rG   rH   rI   rJ   	use_merge
merge_sizec              	      sf   t    d| _tj fddt|D  | _|
r,td |d| _	d S t | _	d S )NFc                    s(   g | ]}t |  d qS ))r   r   rE   rF   rG   rI   rH   rJ   )rB   ).0irH   r   rF   rG   rE   r   rI   rJ   r/   r0   
<listcomp>{   s    z"Block.__init__.<locals>.<listcomp>r\   )r   
patch_sizerI   )
r"   r#   grad_checkpointingr&   rM   rangeblocksPatchMergingrS   
downsample)r,   r   r]   r   rE   rF   rG   rH   rI   rJ   r^   r_   r-   rb   r0   r#   k   s   

zBlock.__init__r1   r2   c                 C   s8   |  |}| jrtj st| j|}|S | |}|S r3   )ri   re   r6   jitis_scriptingr   rg   r5   r/   r/   r0   r      s   

zBlock.forward)r;   r<   r=   r   r&   rX   rY   r>   rZ   r   r?   boolr	   r   r#   r6   r@   r   rA   r/   r/   r-   r0   r[   j   s<    		
#r[   c                       s\   e Zd Zdejfdededeeeeef f def fddZ	de
jd	e
jfd
dZ  ZS )
PatchEmbed   in_chans	embed_dimrd   rI   c                    s.   t    tj||||dd| _||| _d S )NFr   )r"   r#   r&   r'   projnorm)r,   ro   rp   rd   rI   r-   r/   r0   r#      s   
zPatchEmbed.__init__r1   r2   c                 C      |  | |S r3   )rr   rq   r5   r/   r/   r0   r         zPatchEmbed.forwardr;   r<   r=   r&   rY   r>   r	   r   r   r#   r6   r@   r   rA   r/   r/   r-   r0   rm      s    rm   c                	       sX   e Zd Zdejfdedeeeeef f def fddZ	de
jde
jfd	d
Z  ZS )rh   r\   r   rd   rI   c                    s6   t    tj|d| ||dd| _|d| | _d S )Nr\   Fr   )r"   r#   r&   r'   	reductionrr   )r,   r   rd   rI   r-   r/   r0   r#      s   
zPatchMerging.__init__r1   r2   c                 C   rs   r3   )rr   rv   r5   r/   r/   r0   r      rt   zPatchMerging.forwardru   r/   r/   r-   r0   rh      s    
rh   c                #       s  e Zd Zdddddddddd	d
dddeejd	dejdfdedededede	ee
edf f dedede	ee
eef f de	ee
eef f dededededededed ef" fd!d"Zd#d$ Zejjd%efd&d'ZejjdHd)ed%eeef fd*d+ZejjdId,d-Zejjd%ejfd.d/ZdJdedefd0d1Z	2	(	(	3	(dKd4ejd5ee	eee f  d6ed7ed8ed9ed%e	eej e
ejeej f f fd:d;Z	<	(		dLd5e	eee f d=ed>efd?d@Z d4ejd%ejfdAdBZ!dHd4ejdCed%ejfdDdEZ"d4ejd%ejfdFdGZ#  Z$S )Mr   r     avg`   r   r\      r\   g       @rn   r\   Ti   rL   皙?rC   r!   ro   num_classesglobal_poolrp   depths.rE   r   rd   r_   
patch_normfeature_dim	drop_ratedrop_path_raterG   rH   rI   rJ   c                    s  t    |dv sJ || _|| _t|ttfs|}t|| _g | _	t
||||
r*|ntjd| _dd td|t|D }g }t| jD ]L}t|d|  }t||| |||t|d | t|d |d   |||||dkrsdnd	|	d
}|| |  j	t|d|d  d| dg7  _	qEtj| | _t|d| jd    | _}| | _}t|d| _tj||ddddd| _| | _|rtdnt | _ |dkrt!||d	dnt | _"| #  d S )N)r!   r    )ro   rp   rd   rI   c                 S   s   g | ]}|  qS r/   )item)r`   r1   r/   r/   r0   rc      s    z&FasterNet.__init__.<locals>.<listcomp>r   r\   r   FT)r   r]   r   rE   rF   rG   rI   rH   rJ   r^   r_   zstages.)num_chsrv   module	pool_typer   )$r"   r#   r}   r   
isinstancelisttuplelen
num_stagesfeature_inform   r&   rS   patch_embedr6   linspacesumrf   r>   r[   appenddictrM   stagesnum_featureshead_hidden_sizer   r~   r'   	conv_headactFlattenflattenr   
classifier_initialize_weights)r,   ro   r}   r~   rp   r   rE   r   rd   r_   r   r   r   r   rG   rH   rI   rJ   dprstages_listra   r   stageprev_chsout_chsr-   r/   r0   r#      sT   

&
*
 zFasterNet.__init__c                 C   s   |   D ]?\}}t|tjr)t|jdd t|tjr(|jd ur(tj|jd qt|tj	rCt|jdd |jd urCtj|jd qd S )N{Gz?)stdr   )
named_modulesr   r&   r   r   weightr   init	constant_r'   )r,   namemr/   r/   r0   r      s   
zFasterNet._initialize_weightsr2   c                 C   s   t  S r3   )setr,   r/   r/   r0   no_weight_decay     zFasterNet.no_weight_decayFcoarsec                 C   s   t d|rdng dd}|S )Nz^patch_embedz^stages\.(\d+)))z^stages\.(\d+).downsample)r   )z^stages\.(\d+)\.blocks\.(\d+)N)z
^conv_head)i )stemrg   )r   )r,   r   matcherr/   r/   r0   group_matcher  s
   zFasterNet.group_matcherc                 C   s   | j D ]}||_qd S r3   )r   re   )r,   enablesr/   r/   r0   set_grad_checkpointing  s   
z FasterNet.set_grad_checkpointingc                 C   s   | j S r3   )r   r   r/   r/   r0   get_classifier  r   zFasterNet.get_classifierc                 C   sR   || _ t|d| _|rtdnt | _|dkr"t| j|| _	d S t | _	d S )Nr   r   r   )
r}   r   r~   r&   r   rS   r   r   r   r   )r,   r}   r~   r/   r/   r0   reset_classifier   s   (zFasterNet.reset_classifierNNCHWr1   indicesrr   
stop_early
output_fmtintermediates_onlyc                 C   s   |dv sJ dg }t t| j|\}}	| |}tj s |s$| j}
n	| jd|	d  }
t|
D ]\}}||}||v rB|| q1|rG|S ||fS )a   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            norm: Apply norm layer to compatible intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
        Returns:

        )r   zOutput shape must be NCHW.Nr   )	r   r   r   r   r6   rj   rk   	enumerater   )r,   r1   r   rr   r   r   r   intermediatestake_indices	max_indexr   feat_idxr   r/   r/   r0   forward_intermediates'  s   

zFasterNet.forward_intermediatesr   
prune_norm
prune_headc                 C   s<   t t| j|\}}| jd|d  | _|r| dd |S )z@ Prune layers not required for specified intermediates.
        Nr   r    )r   r   r   r   )r,   r   r   r   r   r   r/   r/   r0   prune_intermediate_layersQ  s
   z#FasterNet.prune_intermediate_layersc                 C      |  |}| |}|S r3   )r   r   r5   r/   r/   r0   forward_features_     

zFasterNet.forward_features
pre_logitsc                 C   sX   |  |}| |}| |}| |}| jdkr#tj|| j| jd}|r'|S | |S )NrL   )ptraining)	r~   r   r   r   r   Fdropoutr   r   )r,   r1   r   r/   r/   r0   forward_headd  s   




zFasterNet.forward_headc                 C   r   r3   )r   r   r5   r/   r/   r0   r   m  r   zFasterNet.forwardF)T)rx   )NFFr   F)r   FT)%r;   r<   r=   r   r&   rX   rY   r>   r?   r	   r   rZ   rl   r   r#   r   r6   rj   ignorer   r   r   r   r   r   Moduler   r   r@   r   r   r   r   r   r   r   rA   r/   r/   r-   r0   r      s    	
E
 
,
	
state_dictmodelr2   c                 C   s   | S r3   r/   )r   r   r/   r/   r0   checkpoint_filter_fns  s   r   r   urlkwargsc                 K   s&   | ddddddt tddd	d
dd|S )Nrw   )r      r   )   r   g      ?bicubicg?zpatch_embed.projr   zarXiv:2303.03667z@Run, Don't Walk: Chasing Higher FLOPS for Faster Neural Networksz'https://github.com/JierunChen/FasterNet)r   r}   
input_size	pool_sizecrop_pctinterpolationtest_crop_pctmeanr   
first_convr   	paper_ids
paper_name
origin_urlr
   )r   r   r/   r/   r0   _cfg  s   r   ztimm/)	hf_hub_id)zfasternet_t0.in1kzfasternet_t1.in1kzfasternet_t2.in1kzfasternet_s.in1kzfasternet_m.in1kzfasternet_l.in1kFvariant
pretrainedc                 K   s&   t t| |fttdddd|}|S )N)r   r   r\   r   T)out_indicesflatten_sequential)pretrained_filter_fnfeature_cfg)r   r   r   r   )r   r   r   r   r/   r/   r0   _create_fasternet  s   
r   c                 K   0   t dddtjd}tdd| it |fi |S )N(   rz   rL   rp   r   r   rH   fasternet_t0r   )r   r   r&   GELUr   r   r   
model_argsr/   r/   r0   r        r   c                 K   r   )N@   rz   r   r   fasternet_t1r   )r   r   r   r/   r/   r0   r     r   r   c                 K   ,   t dddd}tdd| it |fi |S )Nry   rz   g?rp   r   r   fasternet_t2r   )r   r   r   r   r/   r/   r0   r        r   c                 K   r   )N   )r   r\      r\   r|   r   fasternet_sr   )r   r   r   r/   r/   r0   r     r   r   c                 K   r   )N   r   rn      r   g?r   fasternet_mr   )r  r   r   r/   r/   r0   r    r   r  c                 K   r   )N   r  g333333?r   fasternet_lr   )r  r   r   r/   r/   r0   r    r   r  )r   r   )8__doc__	functoolsr   typingr   r   r   r   r   r   r	   r6   torch.nnr&   torch.nn.functional
functionalr   	timm.datar   r   timm.layersr   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__r   r   rB   r[   rm   rh   r   r?   r@   r   r   default_cfgsrl   r   r   r   r   r   r  r  r/   r/   r/   r0   <module>   sn    $+- ,> 
