U
    ¯Ê¹j§^  ã                   @   s¸  d Z ddl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mZmZmZmZmZmZ ddlmZ ddlmZmZ dd	lmZmZmZ d
dgZG dd
„ d
ejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZ G dd„ dejƒZ!G dd„ dejƒZ"dleje#e$dœdd„Z%dd„ Z&dmdd„Z'dnd d!„Z(ee(ƒ e(ƒ e(ƒ e(d"d#d$�e(d"d%d&d'�e(ƒ e(d"d(d$�e(d"d)d&d'�e(d"d*d+d,d-d.d/d0�e(d"d1d+d,d-d.d2�e(ee	d3�e(d"d4ee	d5�e(d"d6ee	d5�e(d"d7ee	d5�e(d"d8ee	d5�e(d"d9ee	d5�e(d"d:ee	d5�e(d"d;ee	d5�e(d"d<ee	d5�e(d"d=ee	d5�e(d"d>ee	d5�e(d"d?ee	d5�e(d"d@ee	d5�e(ƒ e(d"dAd$�e(ƒ dBœƒZ)edoe"dCœdDdE„ƒZ*edpe"dCœdFdG„ƒZ+edqe"dCœdHdI„ƒZ,edre"dCœdJdK„ƒZ-edse"dCœdLdM„ƒZ.edte"dCœdNdO„ƒZ/edue"dCœdPdQ„ƒZ0edve"dCœdRdS„ƒZ1edwe"dCœdTdU„ƒZ2edxe"dCœdVdW„ƒZ3edye"dCœdXdY„ƒZ4edze"dCœdZd[„ƒZ5ed{e"dCœd\d]„ƒZ6ed|e"dCœd^d_„ƒZ7ed}e"dCœd`da„ƒZ8ee9dbdcdddedfdgdhdidjdUdWdkœƒ dS )~uj   MLP-Mixer, ResMLP, and gMLP in PyTorch

This impl originally based on MLP-Mixer paper.

Official JAX impl: https://github.com/google-research/vision_transformer/blob/linen/vit_jax/models_mixer.py

Paper: 'MLP-Mixer: An all-MLP Architecture for Vision' - https://arxiv.org/abs/2105.01601

@article{tolstikhin2021,
  title={MLP-Mixer: An all-MLP Architecture for Vision},
  author={Tolstikhin, Ilya and Houlsby, Neil and Kolesnikov, Alexander and Beyer, Lucas and Zhai, Xiaohua and Unterthiner,
        Thomas and Yung, Jessica and Keysers, Daniel and Uszkoreit, Jakob and Lucic, Mario and Dosovitskiy, Alexey},
  journal={arXiv preprint arXiv:2105.01601},
  year={2021}
}

Also supporting ResMlp, and a preliminary (not verified) implementations of gMLP

Code: https://github.com/facebookresearch/deit
Paper: `ResMLP: Feedforward networks for image classification...` - https://arxiv.org/abs/2105.03404
@misc{touvron2021resmlp,
      title={ResMLP: Feedforward networks for image classification with data-efficient training},
      author={Hugo Touvron and Piotr Bojanowski and Mathilde Caron and Matthieu Cord and Alaaeldin El-Nouby and
        Edouard Grave and Armand Joulin and Gabriel Synnaeve and Jakob Verbeek and HervÃ© JÃ©gou},
      year={2021},
      eprint={2105.03404},
}

Paper: `Pay Attention to MLPs` - https://arxiv.org/abs/2105.08050
@misc{liu2021pay,
      title={Pay Attention to MLPs},
      author={Hanxiao Liu and Zihang Dai and David R. So and Quoc V. Le},
      year={2021},
      eprint={2105.08050},
}

A thank you to paper authors for releasing code and weights.

Hacked together by / Copyright 2021 Ross Wightman
é    N)Úpartial)ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)Ú
PatchEmbedÚMlpÚGluMlpÚGatedMlpÚDropPathÚlecun_normal_Ú	to_2tupleé   )Úbuild_model_with_cfg)Únamed_applyÚcheckpoint_seq)Úgenerate_default_cfgsÚregister_modelÚregister_model_deprecationsÚ
MixerBlockÚMlpMixerc                       sB   e Zd ZdZdeeejdd�ejddf‡ fdd„	Z	dd	„ Z
‡  ZS )
r   z– Residual Block w/ token mixing and channel MLPs
    Based on: 'MLP-Mixer: An all-MLP Architecture for Vision' - https://arxiv.org/abs/2105.01601
    ©ç      à?ç      @ç�íµ ÷Æ°>©Úepsç        c	                    sz   t ƒ  ¡  ‡ fdd„t|ƒD ƒ\}	}
|ˆ ƒ| _|||	||d�| _|dkrPt|ƒnt ¡ | _|ˆ ƒ| _	|ˆ |
||d�| _
d S )Nc                    s   g | ]}t |ˆ  ƒ‘qS © )Úint)Ú.0Úx©Údimr   úT/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/mlp_mixer.pyÚ
<listcomp>H   s     z'MixerBlock.__init__.<locals>.<listcomp>©Ú	act_layerÚdropr   )ÚsuperÚ__init__r   Únorm1Ú
mlp_tokensr	   ÚnnÚIdentityÚ	drop_pathÚnorm2Úmlp_channels)Úselfr!   Úseq_lenÚ	mlp_ratioÚ	mlp_layerÚ
norm_layerr%   r&   r-   Z
tokens_dimZchannels_dim©Ú	__class__r    r"   r(   <   s    


zMixerBlock.__init__c              	   C   sH   ||   |  |  |¡ dd¡¡ dd¡¡ }||   |  |  |¡¡¡ }|S ©Nr   é   )r-   r*   r)   Ú	transposer/   r.   ©r0   r   r   r   r"   ÚforwardO   s    *zMixerBlock.forward)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r+   Ú	LayerNormÚGELUr(   r;   Ú__classcell__r   r   r5   r"   r   8   s   ÷c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚAffinec                    s>   t ƒ  ¡  t t dd|f¡¡| _t t dd|f¡¡| _d S )Nr   )	r'   r(   r+   Ú	ParameterÚtorchÚonesÚalphaZzerosÚbeta)r0   r!   r5   r   r"   r(   V   s    
zAffine.__init__c                 C   s   t  | j| j|¡S ©N)rE   ZaddcmulrH   rG   r:   r   r   r"   r;   [   s    zAffine.forward)r<   r=   r>   r(   r;   rB   r   r   r5   r"   rC   U   s   rC   c                       s:   e Zd ZdZdeeejdddf‡ fdd„	Zdd„ Z	‡  Z
S )	ÚResBlockz¥ Residual MLP block w/ LayerScale and Affine 'norm'

    Based on: `ResMLP: Feedforward networks for image classification...` - https://arxiv.org/abs/2105.03404
    é   g-Cëâ6?r   c
                    s”   t ƒ  ¡  t|| ƒ}
||ƒ| _t ||¡| _|	dkr>t|	ƒnt ¡ | _	||ƒ| _
|||
||d�| _t |t |¡ ¡| _t |t |¡ ¡| _d S )Nr   r$   )r'   r(   r   r)   r+   ÚLinearÚlinear_tokensr	   r,   r-   r.   r/   rD   rE   rF   Úls1Úls2)r0   r!   r1   r2   r3   r4   r%   Úinit_valuesr&   r-   Úchannel_dimr5   r   r"   r(   d   s    


zResBlock.__init__c              
   C   sT   ||   | j|  |  |¡ dd¡¡ dd¡ ¡ }||   | j|  |  |¡¡ ¡ }|S r7   )r-   rN   rM   r)   r9   rO   r/   r.   r:   r   r   r"   r;   z   s    0 zResBlock.forward)r<   r=   r>   r?   r   rC   r+   rA   r(   r;   rB   r   r   r5   r"   rJ   _   s   örJ   c                       s6   e Zd ZdZejf‡ fdd„	Zdd„ Zdd„ Z‡  Z	S )ÚSpatialGatingUnitzc Spatial Gating Unit

    Based on: `Pay Attention to MLPs` - https://arxiv.org/abs/2105.08050
    c                    s.   t ƒ  ¡  |d }||ƒ| _t ||¡| _d S )Nr8   )r'   r(   Únormr+   rL   Úproj)r0   r!   r1   r4   Zgate_dimr5   r   r"   r(   …   s    

zSpatialGatingUnit.__init__c                 C   s(   t jj| jjdd� t j | jj¡ d S )Nr   ©Ústd)r+   ÚinitÚnormal_rT   ÚweightÚones_Úbias©r0   r   r   r"   Úinit_weights‹   s    zSpatialGatingUnit.init_weightsc                 C   s>   |j ddd�\}}|  |¡}|  | dd¡¡}|| dd¡ S )Nr8   éÿÿÿÿr    éþÿÿÿ)ÚchunkrS   rT   r9   )r0   r   ÚuÚvr   r   r"   r;   �   s    
zSpatialGatingUnit.forward)
r<   r=   r>   r?   r+   r@   r(   r]   r;   rB   r   r   r5   r"   rR   €   s   rR   c                       sB   e Zd ZdZdeeejdd�ejddf‡ fdd„	Z	dd	„ Z
‡  ZS )
ÚSpatialGatingBlockzp Residual Block w/ Spatial Gating

    Based on: `Pay Attention to MLPs` - https://arxiv.org/abs/2105.08050
    rK   r   r   r   c	                    s^   t ƒ  ¡  t|| ƒ}	||ƒ| _tt|d�}
|||	||
|d�| _|dkrPt|ƒnt 	¡ | _
d S )N)r1   )r%   Z
gate_layerr&   r   )r'   r(   r   rS   r   rR   r/   r	   r+   r,   r-   )r0   r!   r1   r2   r3   r4   r%   r&   r-   rQ   Zsgur5   r   r"   r(   œ   s    

zSpatialGatingBlock.__init__c                 C   s   ||   |  |  |¡¡¡ }|S rI   )r-   r/   rS   r:   r   r   r"   r;   ®   s    zSpatialGatingBlock.forward)r<   r=   r>   r?   r   r   r+   r@   rA   r(   r;   rB   r   r   r5   r"   rc   —   s   ÷rc   c                       s¼   e Zd Zdddddddeeeejdd	�ejd
d
d
dddf‡ fdd„	Z	e
jj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   r   r   r   FÚavgc              
      s¸   t ƒ  ¡  |ˆ_|ˆ_ˆ ˆ_ˆ_dˆ_t|||ˆ|r:ˆnd d�ˆ_t	j
‡ ‡‡‡‡‡‡‡‡f	dd„t|ƒD ƒŽ ˆ_ˆˆƒˆ_t	 |¡ˆ_|dkržt	 ˆˆj¡nt	 ¡ ˆ_ˆj|d� d S )NF)Úimg_sizeÚ
patch_sizeÚin_chansÚ	embed_dimr4   c                    s(   g | ] }ˆˆˆj jˆˆˆˆ ˆˆd �‘qS ))r3   r4   r%   r&   r-   )ÚstemZnum_patches)r   Ú_©	r%   Úblock_layerÚdrop_path_ratern   r3   r2   r4   Úproj_drop_rater0   r   r"   r#   ×   s   öøz%MlpMixer.__init__.<locals>.<listcomp>r   )Únlhb)r'   r(   Únum_classesÚglobal_poolZnum_featuresrn   Úgrad_checkpointingr   ro   r+   Z
SequentialÚrangeÚblocksrS   ZDropoutÚ	head_droprL   r,   Úheadr]   )r0   rv   rk   rm   rl   Ú
num_blocksrn   r2   rr   r3   r4   r%   Z	drop_ratert   rs   ru   Z	stem_normrw   r5   rq   r"   r(   µ   s&    

ûõ

 zMlpMixer.__init__c                 C   s.   |rt  | j¡ nd}ttt|d�| d� d S )Nr   )Ú	head_bias)Úmodule)ÚmathÚlogrv   r   r   Ú_init_weights)r0   ru   r~   r   r   r"   r]   é   s    zMlpMixer.init_weightsc                 C   s   t dddgd�S )Nz^stem)z^blocks\.(\d+)N)z^norm)iŸ† )ro   rz   )Údict)r0   Zcoarser   r   r"   Úgroup_matcherî   s    þzMlpMixer.group_matcherTc                 C   s
   || _ d S rI   )rx   )r0   Úenabler   r   r"   Úset_grad_checkpointingõ   s    zMlpMixer.set_grad_checkpointingc                 C   s   | j S rI   )r|   r\   r   r   r"   Úget_classifierù   s    zMlpMixer.get_classifierNc                 C   sD   || _ |d k	r |dkst‚|| _|dkr6t | j|¡nt ¡ | _d S )N)Ú rj   r   )rv   ÚAssertionErrorrw   r+   rL   rn   r,   r|   )r0   rv   rw   r   r   r"   Úreset_classifierý   s
    zMlpMixer.reset_classifierc                 C   s@   |   |¡}| jr(tj ¡ s(t| j|ƒ}n
|  |¡}|  |¡}|S rI   )ro   rx   rE   ÚjitZis_scriptingr   rz   rS   r:   r   r   r"   Úforward_features  s    


zMlpMixer.forward_features)Ú
pre_logitsc                 C   s2   | j dkr|jdd�}|  |¡}|r(|S |  |¡S )Nrj   r   r    )rw   Úmeanr{   r|   )r0   r   r�   r   r   r"   Úforward_head  s    

zMlpMixer.forward_headc                 C   s   |   |¡}|  |¡}|S rI   )rŒ   r�   r:   r   r   r"   r;     s    

zMlpMixer.forward)F)F)T)N)F)r<   r=   r>   r   r   r   r+   r@   rA   r(   rE   r‹   Úignorer]   r„   r†   r‡   rŠ   rŒ   Úboolr�   r;   rB   r   r   r5   r"   r   ³   s<   î4

	r   F)r   Únamer~   c                 C   s   t | tjƒr¢| d¡r6tj | j¡ tj | j|¡ nj|r^t	| jƒ | jdk	r tj | j¡ nBtj 
| j¡ | jdk	r d|kr’tjj| jdd� ntj | j¡ nzt | tjƒrÒt	| jƒ | jdk	rÐtj | j¡ nJt | tjtjtjfƒ�rtj | j¡ tj | j¡ nt| dƒ�r|  ¡  dS )zA Mixer weight initialization (trying to match Flax defaults)
    r|   NZmlpr   rU   r]   )Ú
isinstancer+   rL   Ú
startswithrW   Zzeros_rY   Z	constant_r[   r
   Zxavier_uniform_rX   ZConv2dr@   ZBatchNorm2dZ	GroupNormrZ   Úhasattrr]   )r   r’   r~   Zflaxr   r   r"   r‚     s,    





r‚   c                 C   s€   d| kr|i }|   ¡ D ]b\}}| dd¡}| dd¡}| dd¡}| dd	¡}| d
¡s`| d¡rn| ddd¡}|||< q|S | S )z Remap checkpoints if needed zpatch_embed.proj.weightzpatch_embed.zstem.zattn.zlinear_tokens.zmlp.zmlp_channels.Zgamma_Zlsz.alphaz.betar   r^   )ÚitemsÚreplaceÚendswithZreshape)Z
state_dictÚmodelZout_dictÚkrb   r   r   r"   Úcheckpoint_filter_fn;  s    
r›   c                 K   s0   |  dd ¡rtdƒ‚tt| |fdti|—Ž}|S )NZfeatures_onlyz3features_only not implemented for MLP-Mixer models.Zpretrained_filter_fn)ÚgetÚRuntimeErrorr   r   r›   )ÚvariantÚ
pretrainedÚkwargsr™   r   r   r"   Ú_create_mixerL  s    ýüûr¡   rˆ   c                 K   s    | ddd dddddddd	œ|–S )
Nrd   )rf   re   re   ç      ì?ZbicubicT)r   r   r   z	stem.projr|   )Úurlrv   Z
input_sizeZ	pool_sizeÚcrop_pctÚinterpolationZfixed_input_sizerŽ   rV   Z
first_convÚ
classifierr   )r£   r    r   r   r"   Ú_cfgZ  s          ûúr§   ztimm/zlhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_mixer_b16_224-76587d61.pth)Ú	hf_hub_idr£   zrhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_mixer_b16_224_in21k-617b3de2.pthiSU  )r¨   r£   rv   zlhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_mixer_l16_224-92f9adc4.pthzrhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-vitjx/jx_mixer_l16_224_in21k-846aa33c.pthzvhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tresnet/mixer_b16_224_miil_in21k-2a558a71.pth)r   r   r   )ç      ð?r©   r©   r¢   ZbilineariÕ+  )r¨   r£   rŽ   rV   r¤   r¥   rv   zphttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-tresnet/mixer_b16_224_miil-9229a591.pth)r¨   r£   rŽ   rV   r¤   r¥   )rŽ   rV   zohttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/gmixer_24_224_raa-7daf7ae6.pth)r¨   r£   rŽ   rV   z9https://dl.fbaipublicfiles.com/deit/resmlp_12_no_dist.pthz9https://dl.fbaipublicfiles.com/deit/resmlp_24_no_dist.pthz9https://dl.fbaipublicfiles.com/deit/resmlp_36_no_dist.pthz:https://dl.fbaipublicfiles.com/deit/resmlpB_24_no_dist.pthz6https://dl.fbaipublicfiles.com/deit/resmlp_12_dist.pthz6https://dl.fbaipublicfiles.com/deit/resmlp_24_dist.pthz6https://dl.fbaipublicfiles.com/deit/resmlp_36_dist.pthz7https://dl.fbaipublicfiles.com/deit/resmlpB_24_dist.pthz6https://dl.fbaipublicfiles.com/deit/resmlpB_24_22k.pthz6https://dl.fbaipublicfiles.com/deit/resmlp_12_dino.pthz6https://dl.fbaipublicfiles.com/deit/resmlp_24_dino.pthznhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-weights/gmlp_s16_224_raa-10536d42.pth)zmixer_s32_224.untrainedzmixer_s16_224.untrainedzmixer_b32_224.untrainedú mixer_b16_224.goog_in21k_ft_in1kzmixer_b16_224.goog_in21kzmixer_l32_224.untrainedú mixer_l16_224.goog_in21k_ft_in1kzmixer_l16_224.goog_in21kúmixer_b16_224.miil_in21kú mixer_b16_224.miil_in21k_ft_in1kzgmixer_12_224.untrainedzgmixer_24_224.ra3_in1kzresmlp_12_224.fb_in1kzresmlp_24_224.fb_in1kzresmlp_36_224.fb_in1kzresmlp_big_24_224.fb_in1kúresmlp_12_224.fb_distilled_in1kúresmlp_24_224.fb_distilled_in1kúresmlp_36_224.fb_distilled_in1kú#resmlp_big_24_224.fb_distilled_in1kú"resmlp_big_24_224.fb_in22k_ft_in1kzresmlp_12_224.fb_dinozresmlp_24_224.fb_dinozgmlp_ti16_224.untrainedzgmlp_s16_224.ra3_in1kzgmlp_b16_224.untrained)Úreturnc                 K   s,   t f ddddœ|—Ž}tdd| i|—Ž}|S )zv Mixer-S/32 224x224
    Paper: 'MLP-Mixer: An all-MLP Architecture for Vision' - https://arxiv.org/abs/2105.01601
    é    rh   ri   ©rl   r}   rn   Úmixer_s32_224rŸ   )r¶   ©rƒ   r¡   ©rŸ   r    Z
model_argsr™   r   r   r"   r¶   É  s    r¶   c                 K   s,   t f ddddœ|—Ž}tdd| i|—Ž}|S )zw Mixer-S/16 224x224
    Paper:  'MLP-Mixer: An all-MLP Architecture for Vision' - https://arxiv.org/abs/2105.01601
    rg   rh   ri   rµ   Úmixer_s16_224rŸ   )r¹   r·   r¸   r   r   r"   r¹   Ó  s    r¹   c                 K   s,   t f ddddœ|—Ž}tdd| i|—Ž}|S )zw Mixer-B/32 224x224
    Paper:  'MLP-Mixer: An all-MLP Architecture for Vision' - https://arxiv.org/abs/2105.01601
    r´   é   é   rµ   Úmixer_b32_224rŸ   )r¼   r·   r¸   r   r   r"   r¼   Ý  s    r¼   c                 K   s,   t f ddddœ|—Ž}tdd| i|—Ž}|S )z˜ Mixer-B/16 224x224. ImageNet-1k pretrained weights.
    Paper:  'MLP-Mixer: An all-MLP Architecture for Vision' - https://arxiv.org/abs/2105.01601
    rg   rº   r»   rµ   Úmixer_b16_224rŸ   )r½   r·   r¸   r   r   r"   r½   ç  s    r½   c                 K   s,   t f ddddœ|—Ž}tdd| i|—Ž}|S )zx Mixer-L/32 224x224.
    Paper:  'MLP-Mixer: An all-MLP Architecture for Vision' - https://arxiv.org/abs/2105.01601
    r´   é   é   rµ   Úmixer_l32_224rŸ   )rÀ   r·   r¸   r   r   r"   rÀ   ñ  s    rÀ   c                 K   s,   t f ddddœ|—Ž}tdd| i|—Ž}|S )z˜ Mixer-L/16 224x224. ImageNet-1k pretrained weights.
    Paper:  'MLP-Mixer: An all-MLP Architecture for Vision' - https://arxiv.org/abs/2105.01601
    rg   r¾   r¿   rµ   Úmixer_l16_224rŸ   )rÁ   r·   r¸   r   r   r"   rÁ   û  s    rÁ   c              	   K   s4   t f ddddttjdœ|—Ž}tdd| i|—Ž}|S )	zV Glu-Mixer-12 224x224
    Experiment by Ross Wightman, adding SwiGLU to MLP-Mixer
    rg   rº   é€  ©r©   r   ©rl   r}   rn   r2   r3   r%   Úgmixer_12_224rŸ   )rÅ   ©rƒ   r   r+   ZSiLUr¡   r¸   r   r   r"   rÅ     s        þþrÅ   c              	   K   s4   t f ddddttjdœ|—Ž}tdd| i|—Ž}|S )	zV Glu-Mixer-24 224x224
    Experiment by Ross Wightman, adding SwiGLU to MLP-Mixer
    rg   r¾   rÂ   rÃ   rÄ   Úgmixer_24_224rŸ   )rÇ   rÆ   r¸   r   r   r"   rÇ     s        þþrÇ   c              	   K   s2   t f ddddttdœ|—Ž}tdd| i|—Ž}|S )	zx ResMLP-12
    Paper: `ResMLP: Feedforward networks for image classification...` - https://arxiv.org/abs/2105.03404
    rg   rº   rÂ   rK   ©rl   r}   rn   r2   rr   r4   Úresmlp_12_224rŸ   )rÉ   )rƒ   rJ   rC   r¡   r¸   r   r   r"   rÉ     s         ÿÿrÉ   c              
   K   s:   t f ddddttdd�tdœ|—Ž}td
d	| i|—Ž}|S )zx ResMLP-24
    Paper: `ResMLP: Feedforward networks for image classification...` - https://arxiv.org/abs/2105.03404
    rg   r¾   rÂ   rK   gñhãˆµøä>©rP   rÈ   Úresmlp_24_224rŸ   )rË   ©rƒ   r   rJ   rC   r¡   r¸   r   r   r"   rË   (  s       
 þþrË   c              
   K   s:   t f ddddttdd�tdœ|—Ž}td
d	| i|—Ž}|S )zx ResMLP-36
    Paper: `ResMLP: Feedforward networks for image classification...` - https://arxiv.org/abs/2105.03404
    rg   é$   rÂ   rK   r   rÊ   rÈ   Úresmlp_36_224rŸ   )rÎ   rÌ   r¸   r   r   r"   rÎ   4  s       
 þþrÎ   c              
   K   s:   t f ddddttdd�tdœ|—Ž}td
d	| i|—Ž}|S )zz ResMLP-B-24
    Paper: `ResMLP: Feedforward networks for image classification...` - https://arxiv.org/abs/2105.03404
    rh   r¾   r»   rK   r   rÊ   rÈ   Úresmlp_big_24_224rŸ   )rÏ   rÌ   r¸   r   r   r"   rÏ   @  s       
 þþrÏ   c              	   K   s2   t f ddddttdœ|—Ž}tdd| i|—Ž}|S )	zU gMLP-Tiny
    Paper: `Pay Attention to MLPs` - https://arxiv.org/abs/2105.08050
    rg   é   é€   é   ©rl   r}   rn   r2   rr   r3   Úgmlp_ti16_224rŸ   )rÔ   ©rƒ   rc   r   r¡   r¸   r   r   r"   rÔ   L  s        þþrÔ   c              	   K   s2   t f ddddttdœ|—Ž}tdd| i|—Ž}|S )	zV gMLP-Small
    Paper: `Pay Attention to MLPs` - https://arxiv.org/abs/2105.08050
    rg   rÐ   é   rÒ   rÓ   Úgmlp_s16_224rŸ   )r×   rÕ   r¸   r   r   r"   r×   X  s        þþr×   c              	   K   s2   t f ddddttdœ|—Ž}tdd| i|—Ž}|S )	zU gMLP-Base
    Paper: `Pay Attention to MLPs` - https://arxiv.org/abs/2105.08050
    rg   rÐ   ri   rÒ   rÓ   Úgmlp_b16_224rŸ   )rØ   rÕ   r¸   r   r   r"   rØ   d  s        þþrØ   rª   r«   r­   r¬   r®   r¯   r°   r±   r²   )Zmixer_b16_224_in21kZmixer_l16_224_in21kZmixer_b16_224_miilZmixer_b16_224_miil_in21kZresmlp_12_distilled_224Zresmlp_24_distilled_224Zresmlp_36_distilled_224Zresmlp_big_24_distilled_224Zresmlp_big_24_224_in22ft1kZresmlp_12_224_dinoZresmlp_24_224_dino)r   F)F)rˆ   )F)F)F)F)F)F)F)F)F)F)F)F)F)F)F):r?   r€   Ú	functoolsr   rE   Ztorch.nnr+   Z	timm.datar   r   Ztimm.layersr   r   r   r   r	   r
   r   Z_builderr   Z_manipulater   r   Ú	_registryr   r   r   Ú__all__ÚModuler   rC   rJ   rR   rc   r   ÚstrÚfloatr‚   r›   r¡   r§   Zdefault_cfgsr¶   r¹   r¼   r½   rÀ   rÁ   rÅ   rÇ   rÉ   rË   rÎ   rÏ   rÔ   r×   rØ   r<   r   r   r   r"   Ú<module>   sn  ($
!f"

þýþý    ý   ý
 ý ý ü ý ý ý ý ý ý ý ý ýþ d						
õ