U
    ¯Ê¹je2  ã                   @   sª  d Z ddlmZ ddl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mZ ddlmZ ddl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d.dd„Zd/d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d0ed œd!d"„ƒZ!ed1ed œd#d$„ƒZ"ed2ed œd%d&„ƒZ#ed3ed œd'd(„ƒZ$ee%d)d*d+d,d-œƒ dS )4zŽ
TResNet: High Performance GPU-Dedicated Architecture
https://arxiv.org/pdf/2003.13630.pdf

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

é    )ÚOrderedDict)ÚpartialN)ÚSpaceToDepthÚ
BlurPool2dÚClassifierHeadÚSEModuleÚConvNormActAaÚConvNormActÚDropPathé   )Úbuild_model_with_cfg)Úcheckpoint_seq)Úregister_modelÚgenerate_default_cfgsÚregister_model_deprecationsÚTResNetc                       s*   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�}|dkrFt||dd|d�| _	nt
||dd||d�| _	t||dddd d	�| _tjd
d�| _t|| j d dƒ}	|rªt|| j |	d�nd | _|dkrÀt|ƒnt ¡ | _d S )Nçü©ñÒMbP?©Znegative_sloper   é   ©Úkernel_sizeÚstrideÚ	act_layeré   ©r   r   r   Úaa_layerF©r   r   Z	apply_actr   T©Zinplaceé   é@   ©Zrd_channelsr   )Úsuperr   Ú__init__Ú
downsampler   r   ÚnnÚ	LeakyReLUr	   Úconv1r   Úconv2ÚReLUÚactÚmaxÚ	expansionr   Úser
   ÚIdentityÚ	drop_path)
ÚselfÚinplanesÚplanesr   r%   Úuse_ser   Údrop_path_rater   Zrd_chs©Ú	__class__© úR/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/tresnet.pyr$      s&    
     ÿzBasicBlock.__init__c                 C   s^   | j d k	r|   |¡}n|}|  |¡}|  |¡}| jd k	rB|  |¡}|  |¡| }|  |¡}|S ©N)r%   r(   r)   r.   r0   r+   ©r1   ÚxZshortcutÚoutr8   r8   r9   Úforward6   s    





zBasicBlock.forward)r   NTNr   ©Ú__name__Ú
__module__Ú__qualname__r-   r$   r>   Ú__classcell__r8   r8   r6   r9   r      s        ør   c                       s*   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�| _	|dkr^t||dd|d�| _
nt||dd||d�| _
t|| j d d	ƒ}	|r˜t||	d
�nd | _t||| j dddd d�| _|dkrÊt|ƒnt ¡ | _tjdd�| _d S )Nr   r   r   r   r   r   r   é   r!   r"   Fr   r   Tr   )r#   rD   r$   r%   r   r   r&   r'   r	   r(   r)   r   r,   r-   r   r.   Úconv3r
   r/   r0   r*   r+   )
r1   r2   r3   r   r%   r4   r   r   r5   Zreduction_chsr6   r8   r9   r$   G   sN        ÿ    ÿ
     ÿ     ÿzBottleneck.__init__c                 C   sh   | j d k	r|   |¡}n|}|  |¡}|  |¡}| jd k	rB|  |¡}|  |¡}|  |¡| }|  |¡}|S r:   )r%   r(   r)   r.   rF   r0   r+   r;   r8   r8   r9   r>   i   s    






zBottleneck.forward)r   NTNNr   r?   r8   r8   r6   r9   rD   D   s         ÷"rD   c                       s†   e Zd Zd‡ fdd„	Zddd„Zejjddd„ƒZejjd dd„ƒZ	ejjdd„ ƒZ
d!dd„Zdd„ Zd"edœdd„Zdd„ Z‡  ZS )#r   r   éè  ç      ð?FÚfastr   c	              
      sÈ  || _ || _d| _tt| ƒ ¡  t}	tj}
t	d| ƒ| _
t	d| ƒ| _|rj| j
d d | _
| jd d | _dd„ t d|t|ƒ¡ |¡D ƒ}t|d | jdd	|
d
�}| j|r°tnt| j|d dd|	|d d�}| j|rÚt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|�ržtjnd ddd�t| jd |�rÀt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 ]F}t|tj ƒ�rVtj!j"|j#ddd� t|tj$ƒ�r0|j#j% &dd ¡ �q0|  ¡ D ]B}t|tƒ�r¢tj! '|j(j)j#¡ t|tƒ�r€tj! '|j*j)j#¡ �q€d S )!NFr!   rE   c                 S   s   g | ]}|  ¡ ‘qS r8   )Útolist)Ú.0r<   r8   r8   r9   Ú
<listcomp>“   s     z$TResNet.__init__.<locals>.<listcomp>r   é   r   r   )r   r   r   T)r   r4   r   r5   r   r    Ús2dr(   Úlayer1Úlayer2Úlayer3Úlayer4Ú )Znum_chsZ	reductionÚmodulezbody.layer1zbody.layer2zbody.layer3é    zbody.layer4)Ú	pool_typeÚ	drop_rateZfan_outZ
leaky_relu)ÚmodeZnonlinearityg{®Gáz„?)+Únum_classesrW   Úgrad_checkpointingr#   r   r$   r   r&   r'   Úintr2   r3   ÚtorchZlinspaceÚsumÚsplitr	   Ú_make_layerrD   r   Ú
Sequentialr   r   ÚbodyÚdictr-   Zfeature_infoZnum_featuresr   ÚheadÚmodulesÚ
isinstanceZConv2dÚinitZkaiming_normal_ÚweightZLinearÚdataZnormal_Zzeros_r)   ZbnrF   )r1   ÚlayersZin_chansrY   Úwidth_factorÚv2Úglobal_poolrW   r5   r   r   Zdprr(   rO   rP   rQ   rR   Úmr6   r8   r9   r$   y   s–    "
     þ
     þ     þ     þú

"û	zTResNet.__init__r   TNc                 C   sÜ   d }|dks| j ||j krlg }	|dkr@|	 tjddddd�¡ |	t| j ||j dddd d�g7 }	tj|	Ž }g }	t|ƒD ]X}
|	 || j ||
dkr”|nd|
dkr¢|nd ||t|t	ƒrº||
 n|d�¡ ||j | _ qxtj|	Ž S )	Nr   r   TF)r   r   Z	ceil_modeZcount_include_padr   r   )r   r%   r4   r   r5   )
r2   r-   Úappendr&   Z	AvgPool2dr	   r`   Úrangere   Úlist)r1   Úblockr3   Úblocksr   r4   r   r5   r%   ri   Úir8   r8   r9   r_   Æ   s6         ÿ

ù	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+))Ústemrr   )rb   )r1   ZcoarseZmatcherr8   r8   r9   Úgroup_matcherß   s    zTResNet.group_matcherc                 C   s
   || _ d S r:   )rZ   )r1   Úenabler8   r8   r9   Úset_grad_checkpointingä   s    zTResNet.set_grad_checkpointingc                 C   s   | j jS r:   )rc   Úfc)r1   r8   r8   r9   Úget_classifierè   s    zTResNet.get_classifierc                 C   s   | j j||d� d S )N)rV   )rc   Úreset)r1   rY   rl   r8   r8   r9   Úreset_classifierì   s    zTResNet.reset_classifierc                 C   s^   | j rPtj ¡ sP| j |¡}| j |¡}t| jj| jj	| jj
| jjg|dd�}n
|  |¡}|S )NT)Úflatten)rZ   r\   ÚjitZis_scriptingra   rN   r(   r   rO   rP   rQ   rR   ©r1   r<   r8   r8   r9   Úforward_featuresï   s    ü û
zTResNet.forward_features)Ú
pre_logitsc                 C   s   |r|S |   |¡S r:   )rc   )r1   r<   r€   r8   r8   r9   Úforward_headý   s    zTResNet.forward_headc                 C   s   |   |¡}|  |¡}|S r:   )r   r�   r~   r8   r8   r9   r>      s    

zTResNet.forward)r   rG   rH   FrI   r   r   )r   TNr   )F)T)N)F)r@   rA   rB   r$   r_   r\   r}   Úignoreru   rw   ry   r{   r   Úboolr�   r>   rC   r8   r8   r6   r9   r   x   s&          ÷M


c                 C   sÒ   d| kr| S dd l }|  d| ¡} |  d| ¡} i }|  ¡ D ]”\}}| ddd„ |¡}| dd	d„ |¡}| d
dd„ |¡}| ddd„ |¡}| ddd„ |¡}| ddd„ |¡}| d¡rÄ| ¡  d¡}|||< q8|S )Nzbody.conv1.conv.weightr   ÚmodelÚ
state_dictzconv(\d+)\.0.0c                 S   s   dt |  d¡ƒ› d�S ©NÚconvr   ú.conv©r[   Úgroup©r<   r8   r8   r9   Ú<lambda>  ó    z&checkpoint_filter_fn.<locals>.<lambda>zconv(\d+)\.0.1c                 S   s   dt |  d¡ƒ› d�S ©Nr‡   r   ú.bnr‰   r‹   r8   r8   r9   rŒ     r�   zconv(\d+)\.0c                 S   s   dt |  d¡ƒ› d�S r†   r‰   r‹   r8   r8   r9   rŒ     r�   zconv(\d+)\.1c                 S   s   dt |  d¡ƒ› d�S rŽ   r‰   r‹   r8   r8   r9   rŒ     r�   zdownsample\.(\d+)\.0c                 S   s   dt |  d¡ƒ› d�S )Núdownsample.r   rˆ   r‰   r‹   r8   r8   r9   rŒ     r�   zdownsample\.(\d+)\.1c                 S   s   dt |  d¡ƒ› d�S )Nr�   r   r�   r‰   r‹   r8   r8   r9   rŒ     r�   z	bn.weightgñhãˆµøä>)ÚreÚgetÚitemsÚsubÚendswithÚabsÚadd)r…   r„   r‘   Zout_dictÚkÚvr8   r8   r9   Úcheckpoint_filter_fn  s"    

rš   Fc                 K   s"   t t| |fttddd�dœ|—ŽS )N)r   r   r   r    T)Zout_indicesZflatten_sequential)Zpretrained_filter_fnZfeature_cfg)r   r   rš   rb   )ÚvariantÚ
pretrainedÚkwargsr8   r8   r9   Ú_create_tresnet  s    ý
ûúrž   rS   c                 K   s   | ddddddddd	d
œ
|–S )NrG   )r   éà   rŸ   )é   r    g      ì?Zbilinear)r   r   r   )rH   rH   rH   zbody.conv1.convzhead.fc)
ÚurlrY   Ú
input_sizeÚ	pool_sizeZcrop_pctÚinterpolationZmeanZstdZ
first_convÚ
classifierr8   )r¡   r�   r8   r8   r9   Ú_cfg'  s          üûr¦   ztimm/)Ú	hf_hub_idiÕ+  )r§   rY   )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_in21k)Úreturnc                 K   s,   t ddddgd�}tdd| it |f|Ž—ŽS )Nr   r    é   )ri   Ú	tresnet_mrœ   )r°   ©rb   rž   ©rœ   r�   Z
model_argsr8   r8   r9   r°   F  s    r°   c                 K   s.   t ddddgdd�}td	d| it |f|Ž—ŽS )
Nr    é   é   r   g333333ó?©ri   rj   Ú	tresnet_lrœ   )r¶   r±   r²   r8   r8   r9   r¶   L  s    r¶   c                 K   s.   t ddddgdd�}td	d| it |f|Ž—ŽS )
Nr    r³   é   r   gÍÌÌÌÌÌô?rµ   Ú
tresnet_xlrœ   )r¸   r±   r²   r8   r8   r9   r¸   R  s    r¸   c                 K   s0   t ddddgddd�}td	d| it |f|Ž—ŽS )
Nr   r    é   rH   T)ri   rj   rk   Útresnet_v2_lrœ   )rº   r±   r²   r8   r8   r9   rº   X  s    rº   rª   r«   r¬   r­   )Ztresnet_m_miil_in21kZtresnet_m_448Ztresnet_l_448Ztresnet_xl_448)F)rS   )F)F)F)F)&Ú__doc__Úcollectionsr   Ú	functoolsr   r\   Ztorch.nnr&   Ztimm.layersr   r   r   r   r   r	   r
   Z_builderr   Z_manipulater   Ú	_registryr   r   r   Ú__all__ÚModuler   rD   r   rš   rž   r¦   Zdefault_cfgsr°   r¶   r¸   rº   r@   r8   r8   r8   r9   Ú<module>   sl   $-4 



 þ þ þ
ïü