
    RЦi6J                        S r SSKJr  SSKJrJrJrJrJrJ	r	J
r
Jr  SSKrSSKJr  SSKJs  Jr  SSKJrJr  SSKJrJrJrJrJrJr  SSKJr  SS	KJr  SS
K J!r!  SSK"J#r#J$r$  S/r% " S S\RL                  5      r' " S S\RL                  5      r( " S S\RL                  5      r) " S S\RL                  5      r* " S S\RL                  5      r+ " S S\RL                  5      r,S\\-\R\                  4   S\RL                  S\\-\R\                  4   4S jr/S+S\-S\S\\-\4   4S jjr0\$" \0" SS 9\0" SS 9\0" SS 9\0" SS 9\0" SS 9\0" SS 9S!.5      r1S,S"\-S#\2S\S\,4S$ jjr3\#S,S#\2S\S\,4S% jj5       r4\#S,S#\2S\S\,4S& jj5       r5\#S,S#\2S\S\,4S' jj5       r6\#S,S#\2S\S\,4S( jj5       r7\#S,S#\2S\S\,4S) jj5       r8\#S,S#\2S\S\,4S* jj5       r9g)-a  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TypeUnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)SelectAdaptivePool2dLinearDropPathtrunc_normal_	LayerTypecalculate_drop_path_rates   )build_model_with_cfg)feature_take_indices)checkpoint_seq)register_modelgenerate_default_cfgs	FasterNetc                      ^  \ rS rSrSS\S\S\4U 4S jjjrS\R                  S\R                  4S jr	S\R                  S\R                  4S	 jr
S
rU =r$ )Partial_conv3#   dimn_divforwardc                 8  > XES.n[         TU ]  5         X-  U l        XR                  -
  U l        [        R
                  " U R                  U R                  SSS4SS0UD6U l        US:X  a  U R                  U l        g US:X  a  U R                  U l        g [        e)Ndevicedtype   r   biasFslicing	split_cat)super__init__	dim_conv3dim_untouchednnConv2dpartial_conv3forward_slicingr!   forward_split_catNotImplementedError)selfr   r    r!   r$   r%   dd	__class__s          T/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/fasternet.pyr+   Partial_conv3.__init__$   s    / >>1YYt~~t~~q!QaUZa^`ai//DL#11DL%%    xreturnc                     UR                  5       nU R                  US S 2S U R                  2S S 2S S 24   5      US S 2S U R                  2S S 2S S 24'   U$ N)cloner0   r,   r4   r:   s     r7   r1   Partial_conv3.forward_slicing2   sO    GGI&*&8&81ot~~oqRS;S9T&U!_dnn_a
"#r9   c                     [         R                  " XR                  U R                  /SS9u  p#U R	                  U5      n[         R
                  " X#4S5      nU$ )Nr   )r   )torchsplitr,   r-   r0   cat)r4   r:   x1x2s       r7   r2   Partial_conv3.forward_split_cat8   sJ    Q1C1C D!L#IIrh"r9   )r,   r-   r!   r0   )NN)__name__
__module____qualname____firstlineno__intstrr+   rB   Tensorr1   r2   __static_attributes____classcell__r6   s   @r7   r   r   #   s]    &C & &c & & %,, 5<< ELL  r9   r   c                      ^  \ rS rSr\" \R                  SS9\R                  SSS4S\S\S\	S	\	S
\	S\
\R                     S\
\R                     S\4U 4S jjjrS\R                  S\R                  4S jrSrU =r$ )MLPBlock@   Tinplacer)   Nr   r    	mlp_ratio	drop_pathlayer_scale_init_value	act_layer
norm_layerpconv_fw_typec           
        > XS.n[         TU ]  5         [        X-  5      n[        R                  " [        R
                  " XS4SS0UD6U" U40 UD6U" 5       [        R
                  " XS4SS0UD6/6 U l        [        XU40 UD6U l        US:  a3  [        R                  " U[        R                  " U40 UD6-  SS9U l        OS U l        US:  a  [        U5      U l        g [        R                  " 5       U l        g )	Nr#   r   r'   Fr   T)requires_grad        )r*   r+   rL   r.   
Sequentialr/   mlpr   spatial_mixing	ParameterrB   oneslayer_scaler   IdentityrX   )r4   r   r    rW   rX   rY   rZ   r[   r\   r$   r%   r5   mlp_hidden_dimr6   s                r7   r+   MLPBlock.__init__A   s     /S_-==IIc1?5?B?~,,KIIn1?5?B?	#
  ,CLL!A%!||&S)@R)@@PT VD  $D09B),BKKMr9   r:   r;   c                 (   UnU R                  U5      nU R                  bO  X R                  U R                  R                  S5      R                  S5      U R	                  U5      -  5      -   nU$ X R                  U R	                  U5      5      -   nU$ )N)rb   re   rX   	unsqueezera   )r4   r:   shortcuts      r7   r!   MLPBlock.forwardc   s    "'>>  **2.88<txx{JL LA  >>$((1+66Ar9   )rX   re   ra   rb   )rH   rI   rJ   rK   r   r.   ReLUBatchNorm2drL   floatr
   ModulerM   r+   rB   rN   r!   rO   rP   rQ   s   @r7   rS   rS   @   s     *1$)G*,..!, R R  R 	 R
  R %* R BII R RYY R  R  RD %,,  r9   rS   c                     ^  \ rS rSr\" \R                  SS9\R                  SSSSS4S\S\S	\S
\	S\	S\	S\
\R                     S\
\R                     S\S\S\\\\\4   4   4U 4S jjjrS\R$                  S\R$                  4S jrSrU =r$ )Blockn   TrU   r)      Nr   depthr    rW   rX   rY   rZ   r[   r\   	use_merge
merge_sizec                 @  > XS.n[         TU ]  5         SU l        [        R                  " [        U5       Vs/ s H  n[        SUUUX_   UUUU	S.UD6PM     sn6 U l        U
(       a  [        SUS-  UUS.UD6U l
        g [        R                  " 5       U l
        g s  snf )Nr#   F)r   r    rW   rX   rY   r[   rZ   r\   ru   )r   
patch_sizer[    )r*   r+   grad_checkpointingr.   r`   rangerS   blocksPatchMergingrf   
downsample)r4   r   rv   r    rW   rX   rY   rZ   r[   r\   rw   rx   r$   r%   r5   ir6   s                   r7   r+   Block.__init__o   s      /"'mm 5\&
 "  
##,'=%#+
 
 "&
 &  ' 
q!!
 	

 KKM 	&
s    Br:   r;   c                     U R                  U5      nU R                  (       a;  [        R                  R	                  5       (       d  [        U R                  U5      nU$ U R                  U5      nU$ r=   )r   r|   rB   jitis_scriptingr   r~   r?   s     r7   r!   Block.forward   sV    OOA""599+A+A+C+Ct{{A.A  AAr9   )r~   r   r|   )rH   rI   rJ   rK   r   r.   rn   ro   rL   rp   r
   rq   rM   boolr   r	   r+   rB   rN   r!   rO   rP   rQ   s   @r7   rs   rs   n   s     *1$)G*,..!,"67&*&* &* 	&*
 &* &* %*&* BII&* RYY&* &* &* c5c?23&* &*P %,,  r9   rs   c                      ^  \ rS rSrS\R
                  SS4S\S\S\\\\\4   4   S\	\R                     4U 4S jjjrS	\R                  S
\R                  4S jrSrU =r$ )
PatchEmbed      Nin_chans	embed_dimrz   r[   c                    > XVS.n[         TU ]  5         [        R                  " XX34SS0UD6U l        U" U40 UD6U l        g )Nr#   r'   F)r*   r+   r.   r/   projnorm)	r4   r   r   rz   r[   r$   r%   r5   r6   s	           r7   r+   PatchEmbed.__init__   sG     /IIh:\PU\Y[\	y/B/	r9   r:   r;   c                 B    U R                  U R                  U5      5      $ r=   r   r   r?   s     r7   r!   PatchEmbed.forward   s    yy1&&r9   r   rH   rI   rJ   rK   r.   ro   rL   r   r	   r
   rq   r+   rB   rN   r!   rO   rP   rQ   s   @r7   r   r      s    
 78*,..00 0 c5c?23	0
 RYY0 0' '%,, ' 'r9   r   c            	          ^  \ rS rSrS\R
                  SS4S\S\\\\\4   4   S\	\R                     4U 4S jjjrS\R                  S	\R                  4S
 jrSrU =r$ )r      ru   Nr   rz   r[   c                    > XES.n[         TU ]  5         [        R                  " USU-  X"4SS0UD6U l        U" SU-  40 UD6U l        g )Nr#   ru   r'   F)r*   r+   r.   r/   	reductionr   )r4   r   rz   r[   r$   r%   r5   r6   s          r7   r+   PatchMerging.__init__   sP     /3CZeZWYZq3w-"-	r9   r:   r;   c                 B    U R                  U R                  U5      5      $ r=   r   r   r?   s     r7   r!   PatchMerging.forward   s    yy*++r9   r   r   rQ   s   @r7   r   r      su     78*,.... c5c?23. RYY	. ., ,%,, , ,r9   r   c            #         ^  \ rS rSrSSSSSSSSS	S
SSSS\" \R                  S
S9\R                  SSS4S\S\S\	S\S\
\\\S4   4   S\S\S\
\\\\4   4   S\
\\\\4   4   S\S\S\S\S\S \\R                     S!\\R                     S"\	4"U 4S# jjjrS$ r\R&                  R(                  S%\4S& j5       r\R&                  R(                  S;S'\S%\\	\4   4S( jj5       r\R&                  R(                  S<S) j5       r\R&                  R(                  S%\R                  4S* j5       rS=S\S\	4S+ jjr     S>S,\R:                  S-\\
\\\   4      S.\S/\S0\	S1\S%\
\\R:                     \\R:                  \\R:                     4   4   4S2 jjr    S?S-\
\\\   4   S3\S4\4S5 jjr!S,\R:                  S%\R:                  4S6 jr"S;S,\R:                  S7\S%\R:                  4S8 jjr#S,\R:                  S%\R:                  4S9 jr$S:r%U =r&$ )@r      r&     avg`   r   ru      ru   g       @r   ru   Ti   r_   皙?rU   r)   Nr   num_classesglobal_poolr   depths.rW   r    rz   rx   
patch_normfeature_dim	drop_ratedrop_path_raterY   rZ   r[   r\   c                 >  > [         TU ]  5         UUS.nUS;   d   eX l        Xl        Xl        [        U[        [        45      (       d  Un[        U5      U l	        / U l
        [        SUUUU
(       a  UO[        R                  S.UD6U l        [        XSS9n/ n[!        U R                  5       Hr  n[#        USU-  -  5      n[%        SUUU   UUUU   UUUUUS:X  a  SOSU	S	.UD6nUR'                  U5        U =R                  [)        USUS-   -  S
U 3S9/-  sl
        Mt     [        R*                  " U6 U l        [#        USU R                  S-
  -  -  5      =U l        nU=U l        n[3        US9U l        [        R6                  " UUSSS4SS0UD6U l        U" 5       U l        U(       a  [        R<                  " S5      O[        R                  " 5       U l        US:  a  [A        UU4SS0UD6O[        R                  " 5       U l!        U RE                  5         g )Nr#   )r)   r(   )r   r   rz   r[   T)	stagewiseru   r   F)r   rv   r    rW   rX   rY   r[   rZ   r\   rw   rx   zstages.)num_chsr   moduler   	pool_typer'   r{   )#r*   r+   r   r   r   
isinstancelisttuplelen
num_stagesfeature_infor   r.   rf   patch_embedr   r}   rL   rs   appenddictr`   stagesnum_featureshead_hidden_sizer   r   r/   	conv_headactFlattenflattenr   
classifier_initialize_weights)r4   r   r   r   r   r   rW   r    rz   rx   r   r   r   r   rY   rZ   r[   r\   r$   r%   r5   dprstages_listr   r   stageprev_chsout_chsr6   s                               r7   r+   FasterNet.__init__   s#   , 	/ 9999& "&4-00Ff+% 
!%/zR[[	

 
 ($O t'Ai!q&()C Qi#a&'=%#+#$6%t% E u%$sa!A#hQXYZX[}"]!^^# ($ mm[1 (+9qT__q=P7Q+Q'RRH*55/+F8WaAPEPRP;(3rzz!}KVYZ?&+GDGBG`b`k`k`m  "r9   c                 4   U R                  5        GH  u  p[        U[        R                  5      (       ap  [	        UR
                  SS9  [        U[        R                  5      (       a;  UR                  b,  [        R                  R                  UR                  S5        M  M  M  [        U[        R                  5      (       d  M  [	        UR
                  SS9  UR                  c  M  [        R                  R                  UR                  S5        GM     g )N{Gz?)stdr   )
named_modulesr   r.   r   r   weightr'   init	constant_r/   )r4   namems      r7   r   FasterNet._initialize_weights  s    ))+GD!RYY''ahhC0a++0BGG%%affa0 1C+Aryy))ahhC066%GG%%affa0 ,r9   r;   c                     [        5       $ r=   )setr4   s    r7   no_weight_decayFasterNet.no_weight_decay  s	    ur9   coarsec                 0    [        SU(       a  SO/ SQS9nU$ )Nz^patch_embedz^stages\.(\d+)))z^stages\.(\d+).downsample)r   )z^stages\.(\d+)\.blocks\.(\d+)N)z
^conv_head)i )stemr~   )r   )r4   r   matchers      r7   group_matcherFasterNet.group_matcher   s!     (.$ 5
 r9   c                 6    U R                    H	  nXl        M     g r=   )r   r|   )r4   enabless      r7   set_grad_checkpointing FasterNet.set_grad_checkpointing,  s    A#)  r9   c                     U R                   $ r=   )r   r   s    r7   get_classifierFasterNet.get_classifier1  s    r9   c                    X4S.nXl         [        US9U l        U(       a  [        R                  " S5      O[        R
                  " 5       U l        US:  a  [        U R                  U40 UD6U l	        g [        R
                  " 5       U l	        g )Nr#   r   r   r   )
r   r   r   r.   r   rf   r   r   r   r   )r4   r   r   r$   r%   r5   s         r7   reset_classifierFasterNet.reset_classifier5  sf    /&/+F(3rzz!}NY\]o&!6!6JrJcecncncpr9   r:   indicesr   
stop_early
output_fmtintermediates_onlyc                    US;   d   S5       e/ n[        [        U R                  5      U5      u  pU R                  U5      n[        R
                  R                  5       (       d  U(       d  U R                  n
OU R                  SU	S-    n
[        U
5       H%  u  pU" U5      nX;   d  M  UR                  U5        M'     U(       a  U$ X4$ )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:

)NCHWzOutput shape must be NCHW.Nr   )	r   r   r   r   rB   r   r   	enumerater   )r4   r:   r   r   r   r   r   intermediatestake_indices	max_indexr   feat_idxr   s                r7   forward_intermediatesFasterNet.forward_intermediates=  s    * Y&D(DD&"6s4;;7G"Q Q99!!##:[[F[[)a-0F(0OHaA'$$Q'  1
   r9   
prune_norm
prune_headc                     [        [        U R                  5      U5      u  pEU R                  SUS-    U l        U(       a  U R                  SS5        U$ )z?Prune layers not required for specified intermediates.
        Nr   r    )r   r   r   r   )r4   r   r   r   r   r   s         r7   prune_intermediate_layers#FasterNet.prune_intermediate_layersg  sK     #7s4;;7G"Qkk.9q=1!!!R(r9   c                 J    U R                  U5      nU R                  U5      nU$ r=   )r   r   r?   s     r7   forward_featuresFasterNet.forward_featuresu  s$    QKKNr9   
pre_logitsc                 0   U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  S:  a)  [
        R                  " XR                  U R                  S9nU(       a  U$ U R                  U5      $ )Nr_   )ptraining)	r   r   r   r   r   Fdropoutr  r   )r4   r:   r  s      r7   forward_headFasterNet.forward_headz  st    QNN1HHQKLLO>>B		!~~FAq6DOOA$66r9   c                 J    U R                  U5      nU R                  U5      nU$ r=   )r   r  r?   s     r7   r!   FasterNet.forward  s'    !!!$a r9   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   F)T)r   NN)NFFr   F)r   FT)'rH   rI   rJ   rK   r   r.   rn   ro   rL   rM   r   r	   rp   r   r
   rq   r+   r   rB   r   ignorer   r   r   r   r   r   r   r   rN   r   r   r   r   r   r  r!   rO   rP   rQ   s   @r7   r   r      sE    #$2>!6767##!$',.)0$)G*,..!,)I#I# I# 	I#
 I# #uS#X./I# I# I# c5c?23I# c5c?23I# I# I# I# "I# %*I#  BII!I#" RYY#I#$ %I# I#V	1 YY   YY	D 	T#s(^ 	 	 YY* * YY		  qC qc q 8<$$',( ||(  eCcN34(  	( 
 (  (  !%(  
tELL!5tELL7I)I#JJ	K( X ./$#	3S	>*  	%,, 5<< 
7ell 7 7 7 %,,  r9   
state_dictmodelr;   c                     U $ r=   r{   )r  r  s     r7   checkpoint_filter_fnr    s
    2 r9   urlkwargsc                 :    U SSSSSS[         [        SSS	S
SSS.UE$ )Nr   )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/FasterNetz
apache-2.0)r  r   
input_size	pool_sizecrop_pctinterpolationtest_crop_pctmeanr   
first_convr   	paper_ids
paper_name
origin_urllicenser   )r  r  s     r7   _cfgr"    s>    4}SY)c%.B('X?
 
 
r9   ztimm/)	hf_hub_id)zfasternet_t0.in1kzfasternet_t1.in1kzfasternet_t2.in1kzfasternet_s.in1kzfasternet_m.in1kzfasternet_l.in1kvariant
pretrainedc           	      F    [        [        X4[        [        SSS9S.UD6nU$ )N)r   r   ru   r&   T)out_indicesflatten_sequential)pretrained_filter_fnfeature_cfg)r   r   r  r   )r$  r%  r  r  s       r7   _create_fasternetr+    s4     71\dK 	E Lr9   c           	      d    [        SSS[        R                  S9n[        SSU 0[        U40 UD6D6$ )N(   r   r_   r   r   r   rZ   r%  )fasternet_t0r   r.   GELUr+  r%  r  
model_argss      r7   r/  r/    s7    <WYW^W^_Ja
ad:F`Y_F`aar9   c           	      d    [        SSS[        R                  S9n[        SSU 0[        U40 UD6D6$ )NrT   r   r   r.  r%  )fasternet_t1r0  r2  s      r7   r5  r5    s7    <XZX_X_`Ja
ad:F`Y_F`aar9   c           	      F    [        SSSS9n[        SSU 0[        U40 UD6D6$ )Nr   r   g?r   r   r   r%  )fasternet_t2r   r+  r2  s      r7   r8  r8    s.    <MJa
ad:F`Y_F`aar9   c           	      F    [        SSSS9n[        SSU 0[        U40 UD6D6$ )N   )r   ru      ru   r   r7  r%  )fasternet_sr9  r2  s      r7   r=  r=    .    M#NJ`z`T*E_X^E_``r9   c           	      F    [        SSSS9n[        SSU 0[        U40 UD6D6$ )N   r&   r      r&   g?r7  r%  )fasternet_mr9  r2  s      r7   rC  rC    r>  r9   c           	      F    [        SSSS9n[        SSU 0[        U40 UD6D6$ )N   rA  g333333?r7  r%  )fasternet_lr9  r2  s      r7   rF  rF    r>  r9   )r   r  ):__doc__	functoolsr   typingr   r   r   r   r   r	   r
   r   rB   torch.nnr.   torch.nn.functional
functionalr  	timm.datar   r   timm.layersr   r   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__rq   r   rS   rs   r   r   r   rM   rN   r  r"  default_cfgsr   r+  r/  r5  r8  r=  rC  rF  r{   r9   r7   <module>rU     s  "  E E E     A s s * + ' <-BII :+ryy +\/BII /d' '&,299 ,$A		 AHT#u||*;%< RYY SWX[]b]i]iXiSj 8c # $sCx.  %     +& 8s   PY  bT bS bY b b
 bT bS bY b b
 bT bS bY b b
 aD aC aI a a
 aD aC aI a a
 aD aC aI a ar9   