o
    پiD                     @   s  d Z ddlmZ ddlZddlmZ ddlmZmZ ddl	m
Z
 ddlmZmZ ddlmZ dd	lmZ d
gZG dd dejZG dd
 d
ejZdddZdddZeeddeddedddZeddefddZeddefddZeddefddZdS ) z ConvMixer

    )OptionalNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)SelectAdaptivePool2d   )register_modelgenerate_default_cfgs)build_model_with_cfg)checkpoint_seq	ConvMixerc                       s$   e Zd Z fddZdd Z  ZS )Residualc                    s   t    || _d S N)super__init__fn)selfr   	__class__ I/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/convmixer.pyr      s   

zResidual.__init__c                 C   s   |  || S r   )r   r   xr   r   r   forward   s   zResidual.forward)__name__
__module____qualname__r   r   __classcell__r   r   r   r   r      s    r   c                       s   e Zd Zddddddejf fdd	Zejjdd
dZ	ejjd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 ZddefddZdd Z  ZS )!r   	           avgg        c
                    s   t    || _ | _| _d| _ttj|||d  t	| _
tj fddt|D  | _t|dd| _t|| _|dkrOt|| _d S t | _d S )NF)kernel_sizestridec                    sV   g | ]'}t tt t jd d  t t jdd  t qS )same)groupspaddingr   )r#   )nn
Sequentialr   Conv2dBatchNorm2d).0i	act_layerdimr#   r   r   
<listcomp>4   s    	z&ConvMixer.__init__.<locals>.<listcomp>T	pool_typeflattenr   )r   r   num_classesnum_featureshead_hidden_sizegrad_checkpointingr(   r)   r*   r+   stemrangeblocksr   poolingDropout	head_dropLinearIdentityhead)r   r0   depthr#   
patch_sizein_chansr5   global_pool	drop_rater/   kwargsr   r.   r   r      s"   
	(zConvMixer.__init__Fc                 C   s   t ddd}|S )Nz^stemz^blocks\.(\d+))r9   r;   )dict)r   coarsematcherr   r   r   group_matcherC   s   zConvMixer.group_matcherTc                 C   s
   || _ d S r   )r8   )r   enabler   r   r   set_grad_checkpointingH   s   
z ConvMixer.set_grad_checkpointingreturnc                 C   s   | j S r   )rA   )r   r   r   r   get_classifierL   s   zConvMixer.get_classifierNr5   rE   c                 C   sF   || _ |d urt|dd| _|dkrt| j|| _d S t | _d S )NTr2   r   )r5   r   r<   r(   r?   r6   r@   rA   )r   r5   rE   r   r   r   reset_classifierP   s   *zConvMixer.reset_classifierc                 C   s8   |  |}| jrtj st| j|}|S | |}|S r   )r9   r8   torchjitis_scriptingr   r;   r   r   r   r   forward_featuresV   s   

zConvMixer.forward_features
pre_logitsc                 C   s&   |  |}| |}|r|S | |S r   )r<   r>   rA   )r   r   rU   r   r   r   forward_head^   s   

zConvMixer.forward_headc                 C   s   |  |}| |}|S r   )rT   rV   r   r   r   r   r   c   s   

zConvMixer.forwardF)Tr   )r   r   r   r(   GELUr   rQ   rR   ignorerK   rM   ModulerO   intr   strrP   rT   boolrV   r   r   r   r   r   r   r      s&    'Fc                 K   s(   | dd r
tdtt| |fi |S )Nfeatures_onlyz3features_only not implemented for ConvMixer models.)getRuntimeErrorr
   r   )variant
pretrainedrG   r   r   r   _create_convmixeri   s   rc    c                 K   s   | ddd ddt tddd
|S )Nr!   )r       re   gQ?bicubicrA   zstem.0)
urlr5   
input_size	pool_sizecrop_pctinterpolationmeanstd
classifier
first_convr   )rg   rG   r   r   r   _cfgp   s   rp   ztimm/)	hf_hub_id)zconvmixer_1536_20.in1kzconvmixer_768_32.in1kzconvmixer_1024_20_ks9_p14.in1krN   c                 K   *   t dddddd|}td| fi |S )Ni      r   r   r0   rB   r#   rC   convmixer_1536_20r   rH   rc   rb   rG   
model_argsr   r   r   ru         ru   c                 K   s.   t dddddtjd|}td| fi |S )Ni       r   )r0   rB   r#   rC   r/   convmixer_768_32r   )rH   r(   ReLUrc   rw   r   r   r   r{      s   r{   c                 K   rr   )Ni   rs   r      rt   convmixer_1024_20_ks9_p14r   rv   rw   r   r   r   r~      ry   r~   rW   )rd   )__doc__typingr   rQ   torch.nnr(   	timm.datar   r   timm.layersr   	_registryr   r	   _builderr
   _manipulater   __all__rZ   r   r   rc   rp   default_cfgsru   r{   r~   r   r   r   r   <module>   s2    	
N
