Ë
    éÓ^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ˆÔÜŸY™Y t§~¡~°t·~±~ÀqÈ!ÈQÑaÐUZÐaÐ^`ÑaˆÔà�iÒØ×/Ñ/ˆD�LØ˜Ò#Ø×1Ñ1ˆD�Lä%Ð%ó    Ú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   € à�G‰G‹IˆØ&*×&8Ñ&8¸º1¸o¸t¿~¹~¸oÊqÒRSÐ;SÑ9TÓ&UˆŠ!ˆ_ˆd�n‰nˆ_š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 §¡°×1CÑ1CÐ DÈ!ÔL‰ˆˆBØ×Ñ Ó#ˆÜ�I‰I�r˜2�h Ó"ˆØˆr7   )NN)Ú__name__Ú
__module__Ú__qualname__ÚintÚstrr*   r?   ÚTensorr0   r1   Ú__classcell__©r5   s   @r6   r   r   #   sS   ø„ ñ&˜Cð &¨ð &°cõ &ð §¡ð °%·,±,ó ð 5§<¡<ð °E·L±L÷ 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ö   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ˜S 9™_Ó-ˆä—=‘=Ü�I‰I�c˜>¨1Ñ?°5Ð?¸BÑ?Ù�~Ñ,¨Ñ,Ù‹KÜ�I‰I�n c¨1Ñ?°5Ð?¸BÑ?ð	#
ð ˆŒô ,¨C°¸ÑLÈÑLˆÔà! AÒ%Ü!Ÿ|™|Ø&¬¯©°SÑ)@¸RÑ)@Ñ@ÐPTô VˆDÕð  $ˆDÔà09¸B²œ )Ó,ˆ�ÄBÇKÁKÃMˆ�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¸Ó<¸t¿x¹xÈ»{ÑJóLñ LˆAð ˆð ˜4Ÿ>™>¨$¯(©(°1«+Ó6Ñ6ˆAØˆ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ð ˜BŸI™I‘ð Rð ˜RŸY™Y™ð 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Æ   ø€ ð  ¨Ñ/ˆÜ‰ÑÔØ"'ˆÔÜ—m‘mô ˜5“\ö&
ð ô ð 
ØØØ#Ø# A™,Ø'=Ø%Ø#Ø+ñ
ð ó
ò&
ð ˆŒñ& ô 'ð 
Ø�q‘Ø!Ø!ñ
ð ñ	
ˆ�ô
 ŸK™K›Mð 	�ùò&
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   € Ø�O‰O˜AÓˆØ×"Ò"¬5¯9©9×+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ØØñ&*àð&*ð ð&*ð ð	&*ð
 ð&*ð ð&*ð %*ð&*ð ˜BŸI™I‘ð&*ð ˜RŸY™Y™ð&*ð ð&*ð ð&*ð ˜c 5¨¨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   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ—I‘I˜h¨	°:¸zÑ\ÐPUÐ\ÐY[Ñ\ˆŒ	Ù˜yÑ/¨BÑ/ˆ�	r7   r8   r9   c                 óB   — | j                  | j                  |«      «      S r;   )rƒ   r‚   r=   s     r6   r    zPatchEmbed.forward¯   s   € Ø�y‰y˜Ÿ™ 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ð ˜c 5¨¨c¨¡?Ð2Ñ3ð	0ð
 ˜RŸY™Y™õ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ÑZÈeÐZÐWYÑZˆŒÙ˜q 3™wÑ-¨"Ñ-ˆ�	r7   r8   r9   c                 óB   — | j                  | j                  |«      «      S r;   )rƒ   rˆ   r=   s     r6   r    zPatchMerging.forwardÁ   s   € Ø�y‰y˜Ÿ™¨Ó*Ó+Ð+r7   r…   rK   s   @r6   ru   ru   ³   sk   ø„ ð 78Ø*,¯.©.ØØñ.àð.ð ˜c 5¨¨c¨¡?Ð2Ñ3ð.ð ˜RŸY™Y™õ	.ð,˜Ÿ™ð ,¨%¯,©,÷ ,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›+ˆŒØˆÔä%ð 
ØØØ!Ù%/‘z´R·[±[ñ	
ð
 ñ
ˆÔô (¨¸È$ÔOˆð ˆÜ�t—‘Ó'ò 	_ˆAÜ�i ! q¡&Ñ(Ó)ˆCÜð ØØ˜Q‘iØØ#Ø˜a™&Ø'=Ø%Ø#Ø+Ø#$¨¢6™%¨tØ%ñð ñˆEð ×Ñ˜uÔ%Ø×Ò¤$¨s¸aÀ!ÀAÁ#¹hÐQXÐYZÐX[È}Ô"]Ð!^Ñ^Öð#	_ô$ —m‘m [Ð1ˆŒô (+¨9°q¸T¿_¹_ÈqÑ=PÑ7QÑ+QÓ'RÐRˆÔ˜HØ*5Ð5ˆÔ Ü/¸+ÔFˆÔÜŸ™ 8¨W°a¸¸AÑPÀEÐPÈRÑPˆŒÙ“;ˆŒÙ(3”r—z‘z !”}¼¿¹»ˆŒØKVÐYZÊ?œ& ¨+ÑG¸DÐGÀBÒ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ç{®Gáz”?)Ústdr   )
Únamed_modulesrž   r-   r   r   Úweightr&   ÚinitÚ	constant_r.   )r3   ÚnameÚms      r6   r¯   zFasterNet._initialize_weights  s§   € Ø×)Ñ)Ó+ò 	1‰GˆD�!Ü˜!œRŸY™YÔ'Ü˜aŸh™h¨CÕ0Ü˜a¤§¡Õ+°·±Ñ0BÜ—G‘G×%Ñ% a§f¡f¨aÕ0Ü˜AœrŸy™yÕ)Ü˜aŸh™h¨CÕ0Ø—6‘6Ñ%Ü—G‘G×%Ñ% a§f¡f¨aÕ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ˆÔÙ(3”r—z‘z !”}¼¿¹»ˆŒØNYÐ\]Êoœ& ×!6Ñ!6¸ÑJÀrÑJˆ�Ôce×cnÑcnÓcpˆ�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Ð&ØˆÜ"6´s¸4¿;¹;Ó7GÈÓ"QÑˆ�ið ×Ñ˜QÓˆÜ�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )¨a¡-Ð0ˆFä(¨Ó0ò 	(‰OˆH�eÙ�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   € ô #7´s¸4¿;¹;Ó7GÈÓ"QÑˆ�iØ—k‘k . 9¨q¡=Ð1ˆŒÙØ×!Ñ! ! RÔ(ØÐr7   c                 óJ   — | j                  |«      }| j                  |«      }|S r;   )r¤   r§   r=   s     r6   Úforward_featureszFasterNet.forward_featuresu  s$   € Ø×Ñ˜QÓˆØ�K‰K˜‹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ÓˆØ�N‰N˜1ÓˆØ�H‰H�Q‹KˆØ�L‰L˜‹OˆØ�>‰>˜BÒÜ—	‘	˜!˜tŸ~™~¸¿¹ÔFˆAÙˆqÐ6 D§O¡O°AÓ$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>Ø!ØØ67Ø67Ø#Ø#Ø!Ø$'Ø,.Ù)0°·±À$Ô)GØ*,¯.©.Ø!,ØØñ)I#àðI#ð ðI#ð ð	I#ð
 ðI#ð ˜#˜u S¨# X™Ð.Ñ/ðI#ð ðI#ð ðI#ð ˜c 5¨¨c¨¡?Ð2Ñ3ðI#ð ˜c 5¨¨c¨¡?Ð2Ñ3ðI#ð ðI#ð ðI#ð ðI#ð "ðI#ð %*ðI#ð  ˜BŸI™I‘ð!I#ð" ˜RŸY™Y™ð#I#ð$ õ%I#òV	1ð ‡Y�Y×Ñð ò ó ðð ‡Y�Y×Ññ	 Dð 	°T¸#¸s¸(±^ò 	ó ð	ð ‡Y�Y×Ñò*ó ð*ð ‡Y�Y×Ñð §	¡	ò ó ðñq¨Cð q¸có qð 8<ØØ$Ø$Ø',ñ( à�|‰|ð( ð ˜e C¨¨c© NÑ3Ñ4ð( ð ð	( ð
 ð( ð ð( ð !%ð( ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	Kó( ðX ./Ø$Ø#ñ	à˜3  S¡	˜>Ñ*ðð ðð ó	ð %§,¡,ð °5·<±<ó ñ
7˜eŸl™lð 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   € Ü Ü�7˜Jðä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   € ä ¨<ÈÔWY×W^ÑW^Ô_€JÜÑa¸
ÐaÄdÈ:Ñ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   € ä ¨<ÈÔXZ×X_ÑX_Ô`€JÜÑa¸
ÐaÄdÈ:Ñ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.   € ä ¨<ÈÔM€JÜÑa¸
ÐaÄdÈ:Ñ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È#ÔN€JÜÑ`°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Ý *Ý +Ý 'ß <àˆ-€ô�B—I‘Iô ô:+ˆr�y‰yô +ô\/ˆB�I‰Iô /ôd'�—‘ô 'ô&,�2—9‘9ô ,ô$A�—	‘	ô AðH T¨#¨u¯|©|Ð*;Ñ%<ð ÀRÇYÁYð ÐSWÐX[Ð]b×]iÑ]iÐXiÑSjó ñ8ˆcð  #ð ¨$¨s°C¨x©.ó ñ %ÙØôñ Øôñ Øôñ Øôñ Øôñ Øôñ+&ó €ñ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   