
    ^jE5              
       2   d 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jH                        Z% G d dejL                        Z' G d dejL                        Z(dee)e
jT                  f   dejL                  dee)e
jT                  f   fdZ+d%de)dedee)ef   fdZ, e" e,d       e,d       e,d       e,d       e,        e,        e,       d      Z-d&de)de.dede(fdZ/e!d&de.dede(fd       Z0e!d&de.dede(fd       Z1e!d&de.dede(fd        Z2e!d&de.dede(fd!       Z3e!d&de.dede(fd"       Z4e!d&de.dede(fd#       Z5e!d&de.dede(fd$       Z6y)'al  
Implementation of Prof-of-Concept Network: StarNet.

We make StarNet as simple as possible [to show the key contribution of element-wise multiplication]:
    - like NO layer-scale in network design,
    - and NO EMA during training,
    - which would improve the performance further.

Created by: Xu Ma (Email: ma.xu1@northeastern.edu)
Modified Date: Mar/29/2024
    )AnyDictListOptionalSetTupleUnionTypeNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)DropPathSelectAdaptivePool2dLinear	LayerTypetrunc_normal_calculate_drop_path_rates   )build_model_with_cfg)feature_take_indices)checkpoint_seq)register_modelgenerate_default_cfgsStarNetc                   F     e Zd Z	 	 	 	 	 	 ddedededededef fdZ xZS )	ConvBNin_channelsout_channelskernel_sizestridepaddingwith_bnc	           	         ||d}
t         |           | j                  dt        j                  |||f||d|
|	       |r| j                  dt        j
                  |fi |
       t        j                  j                  | j                  j                  d       t        j                  j                  | j                  j                  d       y y )Ndevicedtypeconvr    r!   bnr   r   )super__init__
add_modulennConv2dBatchNorm2dinit	constant_r)   weightbias)selfr   r   r   r    r!   r"   r%   r&   kwargsdd	__class__s              ^/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/starnet.pyr+   zConvBN.__init__   s     /		{!d;A7!dVX!d\b!d 	eOOD".."D"DEGGdggnna0GGdggllA.     )r   r   r   TNN)__name__
__module____qualname__intboolr+   __classcell__r7   s   @r8   r   r      s[    
  ! // / 	/
 / / / /r9   r   c            
            e Zd Zddej                  ddfdedededeej                     f fdZ	d	e
j                  d
e
j                  fdZ xZS )Block           Ndim	mlp_ratio	drop_path	act_layerc                    ||d}t         |           t        ||dddf|dd|| _        t        |||z  dfddi|| _        t        |||z  dfddi|| _        t        ||z  |dfddi|| _        t        ||dddf|dd|| _         |       | _        |d	kD  rt        |      | _        y t        j                         | _        y )
Nr$      r   rC   T)groupsr"   r"   FrD   )r*   r+   r   dwconvf1f2gdwconv2actr   r-   IdentityrG   )	r4   rE   rF   rG   rH   r%   r&   r6   r7   s	           r8   r+   zBlock.__init__4   s     /S#q!QOsDOBOi#oqF%F2Fi#oqF%F2F	CaDDDc31aQUQbQ;09B),BKKMr9   xreturnc                     |}| j                  |      }| j                  |      | j                  |      }}| j                  |      |z  }| j	                  | j                  |            }|| j                  |      z   }|S N)rL   rM   rN   rQ   rP   rO   rG   )r4   rS   residualx1x2s        r8   forwardzBlock.forwardG   sm    KKNTWWQZBHHRL2LL#t~~a((r9   )r:   r;   r<   r-   ReLU6r=   floatr
   Moduler+   torchTensorrZ   r?   r@   s   @r8   rB   rB   3   sk     !)+RR R 	R
 BIIR& %,, r9   rB   c                   f    e Zd Zdg ddddej                  ddddddfd	ed
ee   dedededeej                     dedede
def fdZd Zej                  j                  defd       Zej                  j                  d+dedee
ef   fd       Zej                  j                  d,defd       Zej                  j                  dej                  fd       Zd-dedee
   fdZ	 	 	 	 	 d.dej4                  deeeee   f      ded ed!e
d"edeeej4                     eej4                  eej4                     f   f   fd#Z	 	 	 d/deeee   f   d$ed%efd&Zdej4                  dej4                  fd'Zd+dej4                  d(edej4                  fd)Z dej4                  dej4                  fd*Z! xZ"S )0r       rC   rC            rD     rC   avgNbase_dimdepthsrF   	drop_ratedrop_path_raterH   num_classesin_chansglobal_pooloutput_stridec                 V   ||d}t         |           |
dk(  sJ || _        || _        || _        d| _        g | _        d}t        j                  t        ||fdddd| |             | _
        |}t        |t        |            }g }d}t        t        |            D ]  }|d|z  z  }t        ||dfddd	|}t        ||         D cg c]  }t        |||||z      |fi | }}|||   z  }|}|j!                  t        j                  |g|        | j                  j!                  t#        |d|dz   z  d
|               t        j                  | | _        |x| _        | _        t        j*                  | j&                  fi || _        t/        |	      | _        |	rt        j2                  d      nt        j4                         | _        |dkD  rt9        | j&                  |fi |nt        j4                         | _        | j=                  | j>                         y c c}w )Nr$   ra   FrC      r   )r   r    r!   r   r(   zstages.)num_chs	reductionmodule	pool_type) r*   r+   rl   rm   rj   grad_checkpointingfeature_infor-   
Sequentialr   stemr   sumrangelenrB   appenddictstagesnum_featureshead_hidden_sizer/   normr   rn   FlattenrR   flattenr   headapply_init_weights)r4   rh   ri   rF   rj   rk   rH   rl   rm   rn   ro   r%   r&   r5   r6   stem_chsprev_chsdprr   curi_layer	embed_dimdown_sampleriblocksr7   s                            r8   r+   zStarNet.__init__R   s)     /"""& ""' MM8XP1QPRPK
	  (FDS[) 	]G 1</I!(IqTATQSTLZ_`fgn`oZpqUVeIy#cAg,	PRPqFq6'?"C HMM"-->v>?$$T$GAIQXPYGZ&\ ]	] mmV,4<<D1NN4#4#4;;	/+F(3rzz!}DORSOF4,,k@R@Y[YdYdYf	

4%%& rs   H&c                 
   t        |t        j                  t        j                  f      rjt	        |j
                  d       t        |t        j                        r8|j                  +t        j                  j                  |j                  d       y y y t        |t        j                        rUt        j                  j                  |j                  d       t        j                  j                  |j
                  d       y y )Ng{Gz?)stdr   g      ?)

isinstancer-   r   r.   r   r2   r3   r0   r1   r/   )r4   ms     r8   r   zStarNet._init_weights   s    a"))RYY/0!((,!RYY'AFF,>!!!&&!, -?'2>>*GGaffa(GGahh, +r9   rT   c                     t               S rV   )setr4   s    r8   no_weight_decayzStarNet.no_weight_decay   s	    ur9   coarsec                 0    t        d|rdndd fdg      }|S )Nz
^stem\.\d+z^stages\.(\d+)z^stages\.(\d+)\.(\d+))r   )i )rz   r   )r   )r4   r   matchers      r8   group_matcherzStarNet.group_matcher   s,    &,"2JDQ#
 r9   enablec                     || _         y rV   )rw   )r4   r   s     r8   set_grad_checkpointingzStarNet.set_grad_checkpointing   s
    "(r9   c                     | j                   S rV   )r   r   s    r8   get_classifierzStarNet.get_classifier   s    yyr9   c           	      "   || _         |At        |      | _        |rt        j                  d      nt        j
                         | _        |dkD  rt        | j                  |t        | j                  t        j                        r | j                  j                  j                  nd t        | j                  t        j                        r | j                  j                  j                  nd       | _
        y t        j
                         | _
        y )Nru   r   r   r$   )rl   r   rn   r-   r   rR   r   r   r   r   r   r2   r%   r&   )r4   rl   rn   s      r8   reset_classifierzStarNet.reset_classifier   s    &"3kJD,72::a=R[[]DL
 1_	 !!;.8BII.N499##**TX,6tyy")),L$))""((RV
	 #%++-	 		r9   rS   indicesr   
stop_early
output_fmtintermediates_onlyc                 r   |dv sJ d       g }t        t        | j                        |      \  }}	t        | j                        dz
  }
| j                  |      }t        j
                  j                         s|s| j                  }n| j                  d|	dz    }t        |      D ]u  \  }}| j                  r+t        j
                  j                         st        ||      }n ||      }||v sJ|r||
k(  r| j                  |      }n|}|j                  |       w |r|S |
k(  r| j                  |      }||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.r   N)r   r}   r   rz   r^   jitis_scripting	enumeraterw   r   r   r~   )r4   rS   r   r   r   r   r   intermediatestake_indices	max_indexlast_idxr   feat_idxstagex_inters                  r8   forward_intermediateszStarNet.forward_intermediates   s*   * Y&D(DD&"6s4;;7G"Qit{{#a' IIaL99!!#:[[F[[)a-0F(0 
	.OHe&&uyy/E/E/G"5!,!H<'H0"iilGG$$W-
	.   x		!A-r9   
prune_norm
prune_headc                     t        t        | j                        |      \  }}| j                  d|dz    | _        |rt        j                         | _        |r| j                  dd       |S )z@ Prune layers not required for specified intermediates.
        Nr   r    )r   r}   r   r-   rR   r   r   )r4   r   r   r   r   r   s         r8   prune_intermediate_layersz!StarNet.prune_intermediate_layers   s]     #7s4;;7G"Qikk.9q=1DI!!!R(r9   c                     | j                  |      }| j                  r5t        j                  j	                         st        | j                  |      }n| j                  |      }| j                  |      }|S rV   )rz   rw   r^   r   r   r   r   r   r4   rS   s     r8   forward_featureszStarNet.forward_features   sV    IIaL""599+A+A+Ct{{A.AAAIIaLr9   
pre_logitsc                     | j                  |      }| j                  |      }| j                  dkD  r,t        j                  || j                  | j
                        }|r|S | j                  |      S )NrD   )ptraining)rn   r   rj   Fdropoutr   r   )r4   rS   r   s      r8   forward_headzStarNet.forward_head  sZ    QLLO>>B		!t~~FAq0DIIaL0r9   c                 J    | j                  |      }| j                  |      }|S rV   )r   r   r   s     r8   rZ   zStarNet.forward
  s'    !!!$a r9   F)TrV   )NFFr   F)r   FT)#r:   r;   r<   r-   r[   r=   r   r\   r
   r]   strr+   r   r^   r   ignorer   r   r>   r   r   r   r   r   r   r   r_   r	   r   r   r   r   r   rZ   r?   r@   s   @r8   r   r   Q   s     -!$&)+#$!#5'5' I5' 	5'
 5' "5' BII5' 5' 5' 5' 5'n- YY   YYD T#s(^   YY)T ) ) YY		  
0C 
0hsm 
0 8<$$',3 ||3  eCcN343  	3 
 3  3  !%3  
tELL!5tELL7I)I#JJ	K3 n ./$#	3S	>*  	 %,, 5<< 1ell 1 1 1 %,, r9   
state_dictmodelrT   c                 &    | j                  d|       S )Nr   )get)r   r   s     r8   checkpoint_filter_fnr     s    >>,
33r9   urlr5   c                 8    | dddddt         t        dddd	d
dd|S )Nrf   )rC      r   )rJ   rJ   g      ?bicubiczstem.0.convr   zarXiv:2403.19967zRewrite the Starsz*https://github.com/ma-xu/Rewrite-the-Starsz
apache-2.0)r   rl   
input_size	pool_sizecrop_pctinterpolationmeanr   
first_conv
classifier	paper_ids
paper_name
origin_urllicenser   )r   r5   s     r8   _cfgr     s;    4}SYI%.B#6')B|	 	 	r9   ztimm/)	hf_hub_id)zstarnet_s1.in1kzstarnet_s2.in1kzstarnet_s3.in1kzstarnet_s4.in1kzstarnet_s050.untrainedzstarnet_s100.untrainedzstarnet_s150.untrainedvariant
pretrainedc                 N    t        t        | |ft        t        dd      d|}|S )N)r   r   rq   rC   T)out_indicesflatten_sequential)pretrained_filter_fnfeature_cfg)r   r   r   r   )r   r   r5   r   s       r8   _create_starnetr   8  s6     *1\dK 	E Lr9   c           	      N    t        dg d      }t        dd| it        |fi |S )N   )rq   rq      rC   rh   ri   r   )
starnet_s1r   r   r   r5   
model_argss      r8   r   r   B  ,    r,7J]J]$zB\U[B\]]r9   c           	      N    t        dg d      }t        dd| it        |fi |S )Nra   )r   rq      rq   r   r   )
starnet_s2r   r   s      r8   r   r   H  r   r9   c           	      N    t        dg d      }t        dd| it        |fi |S )Nra   )rq   rq   r   re   r   r   )
starnet_s3r   r   s      r8   r   r   N  r   r9   c           	      N    t        dg d      }t        dd| it        |fi |S )Nra   rb   r   r   )
starnet_s4r   r   s      r8   r   r   T  s,    r-8J]J]$zB\U[B\]]r9   c           	      P    t        dg dd      }t        dd| it        |fi |S )N   )r   r   rC   r   rC   rh   ri   rF   r   )starnet_s050r   r   s      r8   r   r   [  .    r,!DJ_j_DD^W]D^__r9   c           	      P    t        dg dd      }t        dd| it        |fi |S )N   )r   rq   re   r   re   r   r   )starnet_s100r   r   s      r8   r   r   a  r   r9   c           	      P    t        dg dd      }t        dd| it        |fi |S )Nr   )r   rq   re   rq   rC   r   r   )starnet_s150r   r   s      r8   r   r   g  r   r9   )r   r   )7__doc__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__ry   r   r]   rB   r   r   r_   r   r   default_cfgsr>   r   r   r   r   r   r   r   r    r9   r8   <module>r     s  
 F E E     A s s * + ' <+/R]] /.BII <|bii |~4T#u||*;%< 4RYY 4SWX[]b]i]iXiSj 4
c 
# 
$sCx. 
 %    #f"f"f'& .S d c g  ^4 ^3 ^7 ^ ^
 ^4 ^3 ^7 ^ ^
 ^4 ^3 ^7 ^ ^
 ^4 ^3 ^7 ^ ^ `T `S `W ` `
 `T `S `W ` `
 `T `S `W ` `r9   