
    ^j6J              
          d Z ddlmZ ddlmZ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c 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 dd	lmZ dd
l m!Z! ddl"m#Z#m$Z$ dgZ% G d dejL                        Z' G d dejL                        Z( G d dejL                        Z) G d dejL                        Z* G d dejL                        Z+ G d dejL                        Z,dee-ej\                  f   dejL                  dee-ej\                  f   fdZ/d+de-dedee-ef   fdZ0 e$ e0d        e0d        e0d        e0d        e0d        e0d       d!      Z1d,d"e-d#e2dede,fd$Z3e#d,d#e2dede,fd%       Z4e#d,d#e2dede,fd&       Z5e#d,d#e2dede,fd'       Z6e#d,d#e2dede,fd(       Z7e#d,d#e2dede,fd)       Z8e#d,d#e2dede,fd*       Z9y)-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                        e Zd Zd	dededef fdZdej                  dej                  fdZdej                  dej                  fdZ	 xZ
S )
Partial_conv3dimn_divforwardc                 8   ||d}t         |           ||z  | _        || j                  z
  | _        t	        j
                  | j                  | j                  dddfddi|| _        |dk(  r| j                  | _        y |dk(  r| j                  | _        y t        )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          `/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/fasternet.pyr*   zPartial_conv3.__init__$   s    / 4>>1YYt~~t~~q!QaUZa^`ai//DL#11DL%%    xreturnc                     |j                         }| j                  |d d d | j                  d d d d f         |d d d | j                  d d d d f<   |S N)cloner/   r+   r3   r8   s     r6   r0   zPartial_conv3.forward_slicing2   sO    GGI&*&8&81ot~~oqRS;S9T&U!_dnn_a
"#r7   c                     t        j                  || j                  | j                  gd      \  }}| j	                  |      }t        j
                  ||fd      }|S )Nr   )r   )torchsplitr+   r,   r/   cat)r3   r8   x1x2s       r6   r1   zPartial_conv3.forward_split_cat8   sP    Q1C1C D!LB#IIr2h"r7   )NN)__name__
__module____qualname__intstrr*   r?   Tensorr0   r1   __classcell__r5   s   @r6   r   r   #   sS    &C & &c & %,, 5<< ELL r7   r   c                        e Zd Z eej
                  d      ej                  dddfdedededed	ed
e	ej                     de	ej                     def fdZdej                  dej                  fdZ xZS )MLPBlockTinplacer(   Nr   r   	mlp_ratio	drop_pathlayer_scale_init_value	act_layer
norm_layerpconv_fw_typec           
         |	|
d}t         |           t        ||z        }t        j                  t        j
                  ||dfddi| ||fi | |       t        j
                  ||dfddi|g | _        t        |||fi || _        |dkD  r4t        j                  |t        j                  |fi |z  d      | _        nd | _        |dkD  rt        |      | _        y t        j                         | _        y )	Nr"   r   r&   Fr   T)requires_grad        )r)   r*   rG   r-   
Sequentialr.   mlpr   spatial_mixing	Parameterr?   oneslayer_scaler   IdentityrQ   )r3   r   r   rP   rQ   rR   rS   rT   rU   r#   r$   r4   mlp_hidden_dimr5   s                r6   r*   zMLPBlock.__init__A   s     /S9_-==IIc>1?5?B?~,,KIInc1?5?B?	#
  ,CLL!A%!||&S)@R)@@PT VD  $D09B),BKKMr7   r8   r9   c                 *   |}| j                  |      }| j                  P|| j                  | j                  j                  d      j                  d      | j	                  |      z        z   }|S || j                  | j	                  |            z   }|S )N)r[   r^   rQ   	unsqueezerZ   )r3   r8   shortcuts      r6   r    zMLPBlock.forwardc   s    "'4>>  **2.88<txx{JL LA  4>>$((1+66Ar7   )rD   rE   rF   r   r-   ReLUBatchNorm2drG   floatr
   ModulerH   r*   r?   rI   r    rJ   rK   s   @r6   rM   rM   @   s     *1$)G*,..!, R R  R 	 R
  R %* R BII R RYY R  RD %,, r7   rM   c                       e Zd Z eej
                  d      ej                  dddddfdededed	ed
edede	ej                     de	ej                     dededeeeeef   f   f fdZdej"                  dej"                  fdZ xZS )BlockTrN   r(      Nr   depthr   rP   rQ   rR   rS   rT   rU   	use_merge
merge_sizec                 0   ||d}t         |           d| _        t        j                  t        |      D cg c]  }t        d|||||   ||||	d| c} | _        |
rt        d|dz  ||d|| _
        y t        j                         | _
        y c c}w )Nr"   F)r   r   rP   rQ   rR   rT   rS   rU   rk   )r   
patch_sizerT    )r)   r*   grad_checkpointingr-   rY   rangerM   blocksPatchMergingr_   
downsample)r3   r   rl   r   rP   rQ   rR   rS   rT   rU   rm   rn   r#   r$   r4   ir5   s                   r6   r*   zBlock.__init__o   s      /"'mm 5\&
   
##A,'=%#+
 
&
 &  ' 
q!!
 	

 KKM 	&
s   Br8   r9   c                     | j                  |      }| j                  r6t        j                  j	                         st        | j                  |      }|S | j                  |      }|S r;   )rv   rr   r?   jitis_scriptingr   rt   r=   s     r6   r    zBlock.forward   sS    OOA""599+A+A+Ct{{A.A  AAr7   )rD   rE   rF   r   r-   re   rf   rG   rg   r
   rh   rH   boolr   r	   r*   r?   rI   r    rJ   rK   s   @r6   rj   rj   n   s     *1$)G*,..!,"67&*&* &* 	&*
 &* &* %*&* BII&* RYY&* &* &* c5c?23&*P %,, r7   rj   c                        e Zd Zdej                  ddfdededeeeeef   f   deej                     f fdZ
dej                  d	ej                  fd
Z xZS )
PatchEmbed   Nin_chans	embed_dimrp   rT   c                     ||d}t         |           t        j                  ||||fddi|| _         ||fi || _        y )Nr"   r&   F)r)   r*   r-   r.   projnorm)	r3   r   r   rp   rT   r#   r$   r4   r5   s	           r6   r*   zPatchEmbed.__init__   sM     /IIh	:z\PU\Y[\	y/B/	r7   r8   r9   c                 B    | j                  | j                  |            S r;   )r   r   r=   s     r6   r    zPatchEmbed.forward   s    yy1&&r7   rD   rE   rF   r-   rf   rG   r   r	   r
   rh   r*   r?   rI   r    rJ   rK   s   @r6   r}   r}      su    
 78*,..00 0 c5c?23	0
 RYY0' '%,, 'r7   r}   c            	            e Zd Zdej                  ddfdedeeeeef   f   deej                     f fdZ
dej                  dej                  fd	Z xZS )
ru   rk   Nr   rp   rT   c                     ||d}t         |           t        j                  |d|z  ||fddi|| _         |d|z  fi || _        y )Nr"   rk   r&   F)r)   r*   r-   r.   	reductionr   )r3   r   rp   rT   r#   r$   r4   r5   s          r6   r*   zPatchMerging.__init__   sT     /3CZZeZWYZq3w-"-	r7   r8   r9   c                 B    | j                  | j                  |            S r;   )r   r   r=   s     r6   r    zPatchMerging.forward   s    yy*++r7   r   rK   s   @r6   ru   ru      sk     78*,.... c5c?23. RYY	., ,%,, ,r7   ru   c            #           e Zd Zdddddddddd	d
ddd eej
                  d	      ej                  dd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ej                     d eej                     d!ef" fd"Zd# Zej$                  j&                  d$efd%       Zej$                  j&                  d9d&ed$eeef   fd'       Zej$                  j&                  d:d(       Zej$                  j&                  d$ej                  fd)       Zd;dedefd*Z	 	 	 	 	 d<d+ej8                  d,ee	eee   f      d-ed.ed/ed0ed$e	eej8                     e
ej8                  eej8                     f   f   fd1Z	 	 	 d=d,e	eee   f   d2ed3efd4Z d+ej8                  d$ej8                  fd5Z!d9d+ej8                  d6ed$ej8                  fd7Z"d+ej8                  d$ej8                  fd8Z# xZ$S )>r   r%     avg`   r   rk      rk   g       @r~   rk   Ti   rX   皙?rN   r(   Nr   num_classesglobal_poolr   depths.rP   r   rp   rn   
patch_normfeature_dim	drop_ratedrop_path_raterR   rS   rT   rU   c                 $   t         |           ||d}|dv sJ || _        || _        || _        t        |t        t        f      s|}t        |      | _	        g | _
        t        d||||
r|nt        j                  d|| _        t        ||d      }g }t!        | j                        D ]s  }t#        |d|z  z        }t%        d|||   ||||   |||||dk(  rdnd|	d	|}|j'                  |       | xj                  t)        |d|dz   z  d
|       gz  c_
        u t        j*                  | | _        t#        |d| j                  dz
  z  z        x| _        }|x| _        }t3        |      | _        t        j6                  ||dddfddi|| _         |       | _        |rt        j<                  d      nt        j                         | _        |dkD  rtA        ||fddi|nt        j                         | _!        | jE                          y )Nr"   )r(   r'   )r   r   rp   rT   T)	stagewiserk   r   F)r   rl   r   rP   rQ   rR   rT   rS   rU   rm   rn   zstages.)num_chsr   moduler   	pool_typer&   rq   )#r)   r*   r   r   r   
isinstancelisttuplelen
num_stagesfeature_infor}   r-   r_   patch_embedr   rs   rG   rj   appenddictrY   stagesnum_featureshead_hidden_sizer   r   r.   	conv_headactFlattenflattenr   
classifier_initialize_weights)r3   r   r   r   r   r   rP   r   rp   rn   r   r   r   r   rR   rS   rT   rU   r#   r$   r4   dprstages_listrw   r   stageprev_chsout_chsr5   s                               r6   r*   zFasterNet.__init__   s/   , 	/ 9999& "&4-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  "r7   c                    | j                         D ]  \  }}t        |t        j                        rjt	        |j
                  d       t        |t        j                        sR|j                  _t        j                  j                  |j                  d       t        |t        j                        st	        |j
                  d       |j                  t        j                  j                  |j                  d        y )N{Gz?)stdr   )
named_modulesr   r-   r   r   weightr&   init	constant_r.   )r3   namems      r6   r   zFasterNet._initialize_weights  s    ))+ 	1GD!!RYY'ahhC0a+0BGG%%affa0Aryy)ahhC066%GG%%affa0	1r7   r9   c                     t               S r;   )setr3   s    r6   no_weight_decayzFasterNet.no_weight_decay  s	    ur7   coarsec                 ,    t        d|rdng d      }|S )Nz^patch_embedz^stages\.(\d+)))z^stages\.(\d+).downsample)r   )z^stages\.(\d+)\.blocks\.(\d+)N)z
^conv_head)i )stemrt   )r   )r3   r   matchers      r6   group_matcherzFasterNet.group_matcher   s!     (.$ 5
 r7   c                 4    | j                   D ]	  }||_         y r;   )r   rr   )r3   enabless      r6   set_grad_checkpointingz FasterNet.set_grad_checkpointing,  s     	*A#)A 	*r7   c                     | j                   S r;   )r   r   s    r6   get_classifierzFasterNet.get_classifier1  s    r7   c                    ||d}|| _         t        |      | _        |rt        j                  d      nt        j
                         | _        |dkD  rt        | j                  |fi || _	        y t        j
                         | _	        y )Nr"   r   r   r   )
r   r   r   r-   r   r_   r   r   r   r   )r3   r   r   r#   r$   r4   s         r6   reset_classifierzFasterNet.reset_classifier5  sj    /&/+F(3rzz!}NY\]o&!6!6JrJcecncncpr7   r8   indicesr   
stop_early
output_fmtintermediates_onlyc                 r   |dv sJ d       g }t        t        | j                        |      \  }}	| j                  |      }t        j
                  j                         s|s| j                  }
n| j                  d|	dz    }
t        |
      D ]#  \  }} ||      }||v s|j                  |       % |r|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:

        )NCHWzOutput shape must be NCHW.Nr   )	r   r   r   r   r?   ry   rz   	enumerater   )r3   r8   r   r   r   r   r   intermediatestake_indices	max_indexr   feat_idxr   s                r6   forward_intermediateszFasterNet.forward_intermediates=  s    * Y&D(DD&"6s4;;7G"Qi Q99!!#:[[F[[)a-0F(0 	(OHeaA<'$$Q'	(
   -r7   
prune_norm
prune_headc                     t        t        | j                        |      \  }}| j                  d|dz    | _        |r| j                  dd       |S )z@ Prune layers not required for specified intermediates.
        Nr   r    )r   r   r   r   )r3   r   r   r   r   r   s         r6   prune_intermediate_layersz#FasterNet.prune_intermediate_layersg  sM     #7s4;;7G"Qikk.9q=1!!!R(r7   c                 J    | j                  |      }| j                  |      }|S r;   )r   r   r=   s     r6   forward_featureszFasterNet.forward_featuresu  s$    QKKNr7   
pre_logitsc                 *   | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  dkD  r,t        j                  || j                  | j                        }|r|S | j                  |      S )NrX   )ptraining)	r   r   r   r   r   Fdropoutr   r   )r3   r8   r   s      r6   forward_headzFasterNet.forward_headz  sv    QNN1HHQKLLO>>B		!t~~FAq6DOOA$66r7   c                 J    | j                  |      }| j                  |      }|S r;   )r   r   r=   s     r6   r    zFasterNet.forward  s'    !!!$a r7   F)T)r   NN)NFFr   F)r   FT)%rD   rE   rF   r   r-   re   rf   rG   rH   r   r	   rg   r{   r
   rh   r*   r   r?   ry   ignorer   r   r   r   r   r   r   r   rI   r   r   r   r   r   r   r    rJ   rK   s   @r6   r   r      s:    #$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#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 %,, r7   
state_dictmodelr9   c                     | S r;   rq   )r   r   s     r6   checkpoint_filter_fnr     s
    2 r7   urlkwargsc                 :    | ddddddt         t        ddd	d
ddd|S )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     r6   _cfgr    s>    4}SY)c%.B('X?
 
 
r7   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                 N    t        t        | |ft        t        dd      d|}|S )N)r   r   rk   r%   T)out_indicesflatten_sequential)pretrained_filter_fnfeature_cfg)r   r   r   r   )r  r  r   r   s       r6   _create_fasternetr
    s6     7J1\dK 	E Lr7   c           	      j    t        dddt        j                        }t        dd| it        |fi |S )N(   r   rX   r   r   r   rS   r  )fasternet_t0r   r-   GELUr
  r  r   
model_argss      r6   r  r    s7    <WYW^W^_Ja
ad:F`Y_F`aar7   c           	      j    t        dddt        j                        }t        dd| it        |fi |S )N@   r   r   r  r  )fasternet_t1r  r  s      r6   r  r    s7    <XZX_X_`Ja
ad:F`Y_F`aar7   c           	      L    t        ddd      }t        dd| it        |fi |S )Nr   r   g?r   r   r   r  )fasternet_t2r   r
  r  s      r6   r  r    s.    <MJa
ad:F`Y_F`aar7   c           	      L    t        ddd      }t        dd| it        |fi |S )N   )r   rk      rk   r   r  r  )fasternet_sr  r  s      r6   r  r    .    M#NJ`z`T*E_X^E_``r7   c           	      L    t        ddd      }t        dd| it        |fi |S )N   r%   r~      r%   g?r  r  )fasternet_mr  r  s      r6   r#  r#    r  r7   c           	      L    t        ddd      }t        dd| it        |fi |S )N   r!  g333333?r  r  )fasternet_lr  r  s      r6   r&  r&    r  r7   )r   r   ):__doc__	functoolsr   typingr   r   r   r   r   r	   r
   r   r?   torch.nnr-   torch.nn.functional
functionalr   	timm.datar   r   timm.layersr   r   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__rh   r   rM   rj   r}   ru   r   rH   rI   r   r  default_cfgsr{   r
  r  r  r  r  r#  r&  rq   r7   r6   <module>r5     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r7   