U
    ¯Ê¹jö  ã                   @   sü   d 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edœdd„ƒZe
d edœdd„ƒZe
d!edœdd„ƒZdS )"z ConvMixer

é    N©Ú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__© úT/var/www/html/bwave/python/venv/lib/python3.8/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d„ ƒZddd„Zdd„ Zdedœ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r’t ˆ|¡nt ¡ | _d S )NF)Úkernel_sizeZstridec                    sV   g | ]N}t  tt  t jˆˆˆˆd d�ˆ ƒ t  ˆ¡¡ƒt jˆˆdd�ˆ ƒ t  ˆ¡¡‘qS )Zsame)ÚgroupsÚpaddingr   )r"   )ÚnnÚ
Sequentialr   ÚConv2dÚBatchNorm2d)Ú.0Úi©Ú	act_layerÚdimr"   r   r   Ú
<listcomp>2   s   	÷ýøz&ConvMixer.__init__.<locals>.<listcomp>T©Z	pool_typeÚflattenr   )r   r   Únum_classesÚnum_featuresÚgrad_checkpointingr%   r&   r'   r(   ÚstemÚrangeÚblocksr   ÚpoolingZDropoutÚ	head_dropÚLinearÚIdentityÚhead)r   r-   Údepthr"   Ú
patch_sizeZin_chansr1   Úglobal_poolZ	drop_rater,   Úkwargsr   r+   r   r      s"    
ý	÷ÿzConvMixer.__init__Fc                 C   s   t ddd�}|S )Nz^stemz^blocks\.(\d+))r4   r6   )Údict)r   ZcoarseZmatcherr   r   r   Úgroup_matcherA   s    zConvMixer.group_matcherTc                 C   s
   || _ d S r   )r3   )r   Úenabler   r   r   Úset_grad_checkpointingF   s    z ConvMixer.set_grad_checkpointingc                 C   s   | j S r   )r;   )r   r   r   r   Úget_classifierJ   s    zConvMixer.get_classifierNc                 C   s@   || _ |d k	rt|dd�| _|dkr2t | j|¡nt ¡ | _d S )NTr/   r   )r1   r   r7   r%   r9   r2   r:   r;   )r   r1   r>   r   r   r   Úreset_classifierN   s    zConvMixer.reset_classifierc                 C   s6   |   |¡}| jr(tj ¡ s(t| j|ƒ}n
|  |¡}|S r   )r4   r3   ÚtorchÚjitZis_scriptingr
   r6   r   r   r   r   Úforward_featuresT   s
    

zConvMixer.forward_features)Ú
pre_logitsc                 C   s&   |   |¡}|  |¡}|r|S |  |¡S r   )r7   r8   r;   )r   r   rI   r   r   r   Úforward_head\   s    

zConvMixer.forward_headc                 C   s   |   |¡}|  |¡}|S r   )rH   rJ   r   r   r   r   r   a   s    

zConvMixer.forward)F)T)N)F)r   r   r   r%   ZGELUr   rF   rG   ÚignorerA   rC   rD   rE   rH   ÚboolrJ   r   r   r   r   r   r   r      s$   ö'

Fc                 K   s$   |  dd ¡rtdƒ‚tt| |f|ŽS )NZfeatures_onlyz3features_only not implemented for ConvMixer models.)ÚgetÚRuntimeErrorr	   r   )ÚvariantÚ
pretrainedr?   r   r   r   Ú_create_convmixerg   s    rQ   Ú c                 K   s   | ddd ddt tdddœ
|–S )Nr    )r   éà   rS   g¸…ëQ¸î?Zbicubicr;   zstem.0)
Úurlr1   Z
input_sizeZ	pool_sizeZcrop_pctÚinterpolationZmeanZstdÚ
classifierZ
first_convr   )rT   r?   r   r   r   Ú_cfgn   s         ûúrW   ztimm/)Z	hf_hub_id)zconvmixer_1536_20.in1kzconvmixer_768_32.in1kzconvmixer_1024_20_ks9_p14.in1k)Úreturnc                 K   s&   t f dddddœ|—Ž}td| f|ŽS )Ni   é   r   r   ©r-   r<   r"   r=   Úconvmixer_1536_20©r@   rQ   ©rP   r?   Z
model_argsr   r   r   r[   �   s    r[   c                 K   s*   t f ddddtjdœ|—Ž}td| f|ŽS )Ni   é    r   )r-   r<   r"   r=   r,   Úconvmixer_768_32)r@   r%   ZReLUrQ   r]   r   r   r   r_   ‡   s    r_   c                 K   s&   t f dddddœ|—Ž}td| f|ŽS )Ni   rY   r   é   rZ   Úconvmixer_1024_20_ks9_p14r\   r]   r   r   r   ra   �   s    ra   )F)rR   )F)F)F)Ú__doc__rF   Ztorch.nnr%   Z	timm.datar   r   Ztimm.layersr   Ú	_registryr   r   Z_builderr	   Z_manipulater
   Ú__all__ÚModuler   r   rQ   rW   Zdefault_cfgsr[   r_   ra   r   r   r   r   Ú<module>   s.   	N

ý