o
    پi);                     @   s  d Z ddlmZ ddlmZ ddlmZmZmZm	Z	 ddl
Z
ddl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mZ ddlmZ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d Z$d0ddZ%d1ddZ&ee&dde&ddde&dde&dde&dde&dddd e&dddd e&dddd e&dde&dddd!
Z'ed0d"e#fd#d$Z(ed0d"e#fd%d&Z)ed0d"e#fd'd(Z*ed0d"e#fd)d*Z+ee,d+d,d-d.d/ dS )2z
TResNet: High Performance GPU-Dedicated Architecture
https://arxiv.org/pdf/2003.13630.pdf

Original model: https://github.com/mrT23/TResNet

    )OrderedDict)partial)ListOptionalTupleUnionN)SpaceToDepth
BlurPool2dClassifierHeadSEModuleConvNormActDropPath   )build_model_with_cfg)feature_take_indices)
checkpointcheckpoint_seq)register_modelgenerate_default_cfgsregister_model_deprecationsTResNetc                       s4   e Zd ZdZ					d	 fdd	Zdd Z  ZS )

BasicBlockr   NT        c           
         s   t t|   || _|| _ttjdd}t||d|||d| _	t||dddd| _
tjdd	| _t|| j d
 d}	|rEt|| j |	dnd | _|dkrSt|| _d S t | _d S )NMbP?negative_slope   kernel_sizestride	act_layeraa_layerr   Fr   r   	apply_actTinplace   @   rd_channelsr   )superr   __init__
downsampler   r   nn	LeakyReLUr   conv1conv2ReLUactmax	expansionr   ser   Identity	drop_path)
selfinplanesplanesr   r,   use_ser!   drop_path_rater    rd_chs	__class__ G/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/tresnet.pyr+      s   
$zBasicBlock.__init__c                 C   s^   | j d ur|  |}n|}| |}| |}| jd ur!| |}| || }| |}|S N)r,   r/   r0   r5   r7   r2   r8   xshortcutoutr@   r@   rA   forward2   s   





zBasicBlock.forward)r   NTNr   __name__
__module____qualname__r4   r+   rG   __classcell__r@   r@   r>   rA   r      s    r   c                       s6   e Zd ZdZ						d
 fdd	Zdd	 Z  ZS )
Bottleneckr&   r   NTr   c	           
         s   t t|   || _|| _|pttjdd}t||dd|d| _	t||d|||d| _
t|| j d d}	|r=t||	d	nd | _t||| j ddd
d| _|dkrUt|nt | _tjdd| _d S )Nr   r   r   )r   r   r    r   r      r'   r(   Fr"   r   Tr$   )r*   rM   r+   r,   r   r   r-   r.   r   r/   r0   r3   r4   r   r5   conv3r   r6   r7   r1   r2   )
r8   r9   r:   r   r,   r;   r    r!   r<   reduction_chsr>   r@   rA   r+   C   s"   
zBottleneck.__init__c                 C   sh   | j d ur|  |}n|}| |}| |}| jd ur!| |}| |}| || }| |}|S rB   )r,   r/   r0   r5   rO   r7   r2   rC   r@   r@   rA   rG   a   s   






zBottleneck.forward)r   NTNNr   rH   r@   r@   r>   rA   rM   @   s    rM   c                       s6  e Zd Z							d- fdd	Zd.ddZejjd/ddZejjd0ddZ	ejjde
jfddZd1dedee fddZ					d2d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				
d3deeee f d"ed#efd$d%Zd&d' Zd/d(efd)d*Zd+d, Z  ZS )4r   r           ?Ffastr   c	              
      s  || _ || _d| _tt|   t}	tj}
t	d| | _
t	d| | _|r5| j
d d | _
| jd d | _dd td|t||D }t|d | jdd	|
d
}| j|rXtnt| j|d dd|	|d d}| j|rmtnt| jd |d dd|	|d d}| jt| jd |d dd|	|d d}| jt| jd |d	 dd|	|d	 d}ttdt fd|fd|fd|fd|fd|fg| _t| jdddt| j|rtjnd dddt| jd |rtjnd dddt| jd tj dddt| jd tj dddg| _| jd tj  | _| _t| j|||d| _|  D ]#}t |tj!r,tj"j#|j$ddd t |tj%r;|j$j&'dd  q|  D ]!}t |trRtj"(|j)j*j$ t |tratj"(|j+j*j$ qAd S )!NFr'   rN   c                 S   s   g | ]}|  qS r@   )tolist).0rD   r@   r@   rA   
<listcomp>       z$TResNet.__init__.<locals>.<listcomp>r      r   r   )r   r   r    T)r   r;   r!   r<      r&   s2dr/   layer1layer2layer3layer4 )num_chs	reductionmodulezbody.layer1zbody.layer2zbody.layer3    zbody.layer4)	pool_type	drop_ratefan_out
leaky_relu)modenonlinearityg{Gz?),num_classesre   grad_checkpointingr*   r   r+   r	   r-   r.   intr9   r:   torchlinspacesumsplitr   _make_layerrM   r   
Sequentialr   r   bodydictr4   feature_infonum_featureshead_hidden_sizer
   headmodules
isinstanceConv2dinitkaiming_normal_weightLineardatanormal_zeros_r0   bnrO   )r8   layersin_chansrj   width_factorv2global_poolre   r<   r!   r    dprr/   r[   r\   r]   r^   mr>   r@   rA   r+   q   st   "



 	zTResNet.__init__r   TNc                 C   s   d }|dks| j ||j kr5g }	|dkr |	tjddddd |	t| j ||j ddddg7 }	tj|	 }g }	t|D ],}
|	|| j ||
dkrI|nd|
dkrP|nd ||t|t	r\||
 n|d ||j | _ q;tj|	 S )	Nr   rY   TF)r   r   	ceil_modecount_include_padr"   r   )r   r,   r;   r!   r<   )
r9   r4   appendr-   	AvgPool2dr   rr   rangerz   list)r8   blockr:   blocksr   r;   r!   r<   r,   r   ir@   r@   rA   rq      s,   

	
zTResNet._make_layerc                 C   s   t d|rdndd}|S )Nz^body\.conv1z^body\.layer(\d+)z^body\.layer(\d+)\.(\d+))stemr   )rt   )r8   coarsematcherr@   r@   rA   group_matcher   s   zTResNet.group_matcherc                 C   s
   || _ d S rB   )rk   )r8   enabler@   r@   rA   set_grad_checkpointing   s   
zTResNet.set_grad_checkpointingreturnc                 C   s   | j jS rB   )rx   fc)r8   r@   r@   rA   get_classifier   s   zTResNet.get_classifierrj   r   c                 C   s   || _ | jj||d d S )N)rd   )rj   rx   reset)r8   rj   r   r@   r@   rA   reset_classifier   s   zTResNet.reset_classifierNCHWrD   indicesnorm
stop_early
output_fmtintermediates_onlyc                    s   |dv sJ dg }g d t t |\}}	 fdd|D } |	 }	tj s+|s/| j}
n	| jd|	d  }
t|
D ]\}}| jrNtj sNt||}n||}||v r[|	| q<|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:

        )r   zOutput shape must be NCHW.r   rY   r   r&      c                    s   g | ]} | qS r@   r@   )rU   r   
stage_endsr@   rA   rV     rW   z1TResNet.forward_intermediates.<locals>.<listcomp>Nr   )
r   lenrm   jitis_scriptingrs   	enumeraterk   r   r   )r8   rD   r   r   r   r   r   intermediatestake_indices	max_indexstagesfeat_idxstager@   r   rA   forward_intermediates   s&   
zTResNet.forward_intermediates
prune_norm
prune_headc                 C   sJ   g d}t t||\}}|| }| jd|d  | _|r#| dd |S )z@ Prune layers not required for specified intermediates.
        r   Nr   r   r_   )r   r   rs   r   )r8   r   r   r   r   r   r   r@   r@   rA   prune_intermediate_layers  s   z!TResNet.prune_intermediate_layersc                 C   s`   | j r)tj s)| j|}| j|}t| jj| jj	| jj
| jjg|dd}|S | |}|S )NT)flatten)rk   rm   r   r   rs   rZ   r/   r   r[   r\   r]   r^   r8   rD   r@   r@   rA   forward_features&  s   
zTResNet.forward_features
pre_logitsc                 C   s   |r	| j ||dS |  |S )N)r   )rx   )r8   rD   r   r@   r@   rA   forward_head4  s   zTResNet.forward_headc                 C   s   |  |}| |}|S rB   )r   r   r   r@   r@   rA   rG   7  s   

zTResNet.forward)r   rQ   rR   FrS   r   r   )r   TNr   F)TrB   )NFFr   F)r   FT)rI   rJ   rK   r+   rq   rm   r   ignorer   r   r-   Moduler   rl   r   strr   Tensorr   r   boolr   r   r   r   r   rG   rL   r@   r@   r>   rA   r   p   sd    
M 
0
c                 C   s   d| v r| S dd l }| d| } | d| } i }|  D ]J\}}|ddd |}|dd	d |}|d
dd |}|ddd |}|ddd |}|ddd |}|drb| d}|||< q|S )Nzbody.conv1.conv.weightr   model
state_dictzconv(\d+)\.0.0c                 S      dt | d dS Nconvr   .convrl   grouprD   r@   r@   rA   <lambda>F      z&checkpoint_filter_fn.<locals>.<lambda>zconv(\d+)\.0.1c                 S   r   Nr   r   .bnr   r   r@   r@   rA   r   G  r   zconv(\d+)\.0c                 S   r   r   r   r   r@   r@   rA   r   H  r   zconv(\d+)\.1c                 S   r   r   r   r   r@   r@   rA   r   I  r   zdownsample\.(\d+)\.0c                 S   r   )Ndownsample.r   r   r   r   r@   r@   rA   r   J  r   zdownsample\.(\d+)\.1c                 S   r   )Nr   r   r   r   r   r@   r@   rA   r   K  r   z	bn.weightgh㈵>)regetitemssubendswithabsadd)r   r   r   out_dictkvr@   r@   rA   checkpoint_filter_fn=  s"   

r   Fc                 K   s"   t t| |fttdddd|S )N)r   rY   r   r&   T)out_indicesflatten_sequential)pretrained_filter_fnfeature_cfg)r   r   r   rt   )variant
pretrainedkwargsr@   r@   rA   _create_tresnetS  s   
r   r_   c                 K   s   | ddddddddd	d

|S )NrQ   )r      r   )   r   g      ?bilinear)r   r   r   )rR   rR   rR   zbody.conv1.convzhead.fc)
urlrj   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierr@   )r   r   r@   r@   rA   _cfg^  s   r   ztimm/)	hf_hub_idi+  )r   rj   )r     r   )   r   )r   r   r   )
ztresnet_m.miil_in21k_ft_in1ktresnet_m.miil_in21kztresnet_m.miil_in1kztresnet_l.miil_in1kztresnet_xl.miil_in1ktresnet_m.miil_in1k_448tresnet_l.miil_in1k_448tresnet_xl.miil_in1k_448ztresnet_v2_l.miil_in21k_ft_in1kztresnet_v2_l.miil_in21kr   c                 K   s,   t g dd}tdd| it |fi |S )N)r   r&      r   )r   	tresnet_mr   )r   rt   r   r   r   
model_argsr@   r@   rA   r   }  s   r   c                 K   .   t g ddd}tdd| it |fi |S )N)r&   r      r   g333333?r   r   	tresnet_lr   )r   r   r   r@   r@   rA   r        r   c                 K   r   )N)r&   r      r   g?r   
tresnet_xlr   )r  r   r   r@   r@   rA   r    r   r  c                 K   s0   t g dddd}tdd| it |fi |S )N)r   r&      r   rR   T)r   r   r   tresnet_v2_lr   )r  r   r   r@   r@   rA   r    s   r  r   r   r   r   )tresnet_m_miil_in21ktresnet_m_448tresnet_l_448tresnet_xl_448r   )r_   )-__doc__collectionsr   	functoolsr   typingr   r   r   r   rm   torch.nnr-   timm.layersr   r	   r
   r   r   r   _builderr   	_featuresr   _manipulater   r   	_registryr   r   r   __all__r   r   rM   r   r   r   r   default_cfgsr   r   r  r  rI   r@   r@   r@   rA   <module>   sl     (0 N




