o
    پi2                  	   @   sP  d 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&dee'e	j(f dej$dee'e	j(f fddZ)d1d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* e* e* dZ+d2de'd e,dede&fd!d"Z-ed2d e,dede&fd#d$Z.ed2d e,dede&fd%d&Z/ed2d e,dede&fd'd(Z0ed2d e,dede&fd)d*Z1ed2d e,dede&fd+d,Z2ed2d e,dede&fd-d.Z3ed2d e,dede&fd/d0Z4dS )3al  
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UnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)DropPathSelectAdaptivePool2dLinear	LayerTypetrunc_normal_   )build_model_with_cfg)feature_take_indices)checkpoint_seq)register_modelgenerate_default_cfgsStarNetc                       s@   e Zd Z				ddededededed	ef fd
dZ  ZS )ConvBNr   r   Tin_channelsout_channelskernel_sizestridepaddingwith_bnc                    sp   t    | dtj|||f||d| |r6| dt| tj| jj	d tj| jj
d d S d S )Nconvr   r   bnr   r   )super__init__
add_modulennConv2dBatchNorm2dinit	constant_r!   weightbias)selfr   r   r   r   r   r   kwargs	__class__ G/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/starnet.pyr#      s   


zConvBN.__init__)r   r   r   T)__name__
__module____qualname__intboolr#   __classcell__r0   r0   r.   r1   r      s$    r   c                	       sN   e Zd Zddejf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 )Block           dim	mlp_ratio	drop_path	act_layerc              	      s   t    t||ddd|dd| _t||| ddd| _t||| ddd| _t|| |ddd| _t||ddd|dd| _| | _|dkrMt	|| _d S t
 | _d S )	N   r   r9   T)groupsr   F)r   r:   )r"   r#   r   dwconvf1f2gdwconv2actr   r%   Identityr=   )r,   r;   r<   r=   r>   r.   r0   r1   r#   1   s   
$zBlock.__init__xreturnc                 C   sT   |}|  |}| || |}}| || }| | |}|| | }|S N)rA   rB   rC   rF   rE   rD   r=   )r,   rH   residualx1x2r0   r0   r1   forwardA   s   
zBlock.forward)r2   r3   r4   r%   ReLU6r5   floatr   r#   torchTensorrN   r7   r0   r0   r.   r1   r8   0   s    r8   c                       s  e Zd Zdg ddddejddddf
ded	ee 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d;dedee	ef fddZejjd<defdd Zejjdejfd!d"Zd=dedee	 fd$d%Z	#			&	d>d'ejd(eeeee f  d)ed*ed+e	d,edeeej eejeej f f fd-d.Z	/		d?d(eeee f d0ed1efd2d3Zd'ejdejfd4d5Zd;d'ejd6edejfd7d8Z d'ejdejfd9d:Z!  Z"S )@r       r9   r9            r:     r9   avgbase_dimdepthsr<   	drop_ratedrop_path_rater>   num_classesin_chansglobal_pooloutput_stridec              	      s  t    |
dksJ || _|| _d| _g | _d}tt||dddd  | _	|}dd t
d	|t|D g }d	tt|D ]H}|d|  t|dddd
} fddt|| D }|| 7 }|tj|g|R   | jt|d|d  d| d qBtj| | _| | _| _t| j| _t|	d| _|	rtdnt | _|d	krt| j|nt | _| | j d S )NrS   Fr9      r   )r   r   r   c                 S   s   g | ]}|  qS r0   )item).0rH   r0   r0   r1   
<listcomp>j   s    z$StarNet.__init__.<locals>.<listcomp>r   r    c                    s"   g | ]}t |   qS r0   )r8   )rd   ir>   curdpr	embed_dimr<   r0   r1   re   p   s   " zstages.)num_chs	reductionmodule	pool_type)r"   r#   r^   r\   grad_checkpointingfeature_infor%   
Sequentialr   stemrQ   linspacesumrangelenappenddictstagesnum_featureshead_hidden_sizer'   normr   r`   FlattenrG   flattenr   headapply_init_weights)r,   rZ   r[   r<   r\   r]   r>   r^   r_   r`   ra   r-   stem_chsprev_chsrz   i_layerdown_samplerblocksr.   rg   r1   r#   L   s@   
"
zStarNet.__init__c                 C   s   t |tjtjfr)t|jdd t |tjr%|jd ur'tj|jd d S d S d S t |tj	rAtj|jd tj|jd d S d S )Ng{Gz?)stdr   g      ?)

isinstancer%   r   r&   r   r*   r+   r(   r)   r'   )r,   mr0   r0   r1   r      s   zStarNet._init_weightsrI   c                 C   s   t  S rJ   )setr,   r0   r0   r1   no_weight_decay      zStarNet.no_weight_decayFcoarsec                 C   s    t d|rdndd fdgd}|S )Nz
^stem\.\d+z^stages\.(\d+)z^stages\.(\d+)\.(\d+))r}   )i )rs   r   )ry   )r,   r   matcherr0   r0   r1   group_matcher   s   zStarNet.group_matcherTenablec                 C   s
   || _ d S rJ   )rp   )r,   r   r0   r0   r1   set_grad_checkpointing   s   
zStarNet.set_grad_checkpointingc                 C   s   | j S rJ   )r   r   r0   r0   r1   get_classifier   r   zStarNet.get_classifierNc                 C   sZ   || _ |d urt|d| _|rtdnt | _|dkr&t| j|| _	d S t | _	d S )Nrn   r   r   )
r^   r   r`   r%   r~   rG   r   r   r|   r   )r,   r^   r`   r0   r0   r1   reset_classifier   s
   (zStarNet.reset_classifierNCHWrH   indicesr}   
stop_early
output_fmtintermediates_onlyc                 C   s   |dv sJ dg }t t| j|\}}	t| jd }
| |}tj s'|s+| j}n	| jd|	d  }t|D ]-\}}| jrJtj sJt	||}n||}||v re|r^||
kr^| 
|}n|}|| q8|rj|S ||
krs| 
|}||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.r   N)r   rw   rz   rs   rQ   jitis_scripting	enumeraterp   r   r}   rx   )r,   rH   r   r}   r   r   r   intermediatestake_indices	max_indexlast_idxrz   feat_idxstagex_interr0   r0   r1   forward_intermediates   s.   


zStarNet.forward_intermediatesr   
prune_norm
prune_headc                 C   sJ   t t| j|\}}| jd|d  | _|rt | _|r#| dd |S )z@ Prune layers not required for specified intermediates.
        Nr   r    )r   rw   rz   r%   rG   r}   r   )r,   r   r   r   r   r   r0   r0   r1   prune_intermediate_layers   s   
z!StarNet.prune_intermediate_layersc                 C   s@   |  |}| jrtj st| j|}n| |}| |}|S rJ   )rs   rp   rQ   r   r   r   rz   r}   r,   rH   r0   r0   r1   forward_features   s   


zStarNet.forward_features
pre_logitsc                 C   sD   |  |}| |}| jdkrtj|| j| jd}|r|S | |S )Nr:   )ptraining)r`   r   r\   Fdropoutr   r   )r,   rH   r   r0   r0   r1   forward_head   s
   


zStarNet.forward_headc                 C   s   |  |}| |}|S rJ   )r   r   r   r0   r0   r1   rN      s   

zStarNet.forwardF)TrJ   )NFFr   F)r   FT)#r2   r3   r4   r%   rO   r5   r   rP   r   strr#   r   rQ   r   ignorer   r   r6   r   r   r   r   Moduler   r   r   rR   r   r   r   r   r   r   rN   r7   r0   r0   r.   r1   r   K   s    	
3	
 
7
	
state_dictmodelrI   c                 C   s   |  d| S )Nr   )get)r   r   r0   r0   r1   checkpoint_filter_fn  s   r   r   urlr-   c                 K   s$   | dddddt tdddd	d
d|S )NrX   )r9      r   )r?   r?   g      ?bicubiczstem.0.convr   zarXiv:2403.19967zRewrite the Starsz*https://github.com/ma-xu/Rewrite-the-Stars)r   r^   
input_size	pool_sizecrop_pctinterpolationmeanr   
first_conv
classifier	paper_ids
paper_name
origin_urlr	   )r   r-   r0   r0   r1   _cfg  s   r   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.untrainedFvariant
pretrainedc                 K   s&   t t| |fttdddd|}|S )N)r   r   rb   r9   T)out_indicesflatten_sequential)pretrained_filter_fnfeature_cfg)r   r   r   ry   )r   r   r-   r   r0   r0   r1   _create_starnet*  s   
r   c                 K   .   t dg dd}tdd| it |fi |S )N   )rb   rb      r9   rZ   r[   
starnet_s1r   )r   ry   r   r   r-   
model_argsr0   r0   r1   r   4     r   c                 K   r   )NrS   )r   rb      rb   r   
starnet_s2r   )r   r   r   r0   r0   r1   r   :  r   r   c                 K   r   )NrS   )rb   rb   r   rW   r   
starnet_s3r   )r   r   r   r0   r0   r1   r   @  r   r   c                 K   r   )NrS   rT   r   
starnet_s4r   )r   r   r   r0   r0   r1   r   F  r   r   c                 K   0   t dg ddd}tdd| it |fi |S )N   )r   r   r9   r   r9   rZ   r[   r<   starnet_s050r   )r   r   r   r0   r0   r1   r   M     r   c                 K   r   )N   )r   rb   rW   r   rW   r   starnet_s100r   )r   r   r   r0   r0   r1   r   S  r   r   c                 K   r   )Nr   )r   rb   rW   rb   r9   r   starnet_s150r   )r   r   r   r0   r0   r1   r   Y  r   r   )r   r   )5__doc__typingr   r   r   r   r   r   r   rQ   torch.nnr%   torch.nn.functional
functionalr   	timm.datar
   r   timm.layersr   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__rr   r   r   r8   r   r   rR   r   r   default_cfgsr6   r   r   r   r   r   r   r   r   r0   r0   r0   r1   <module>   sd    $ ,8 
