U
    ¯Ê¹jÌ:  ã                
   @   sX  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
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 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d+dd„Zeedd�edd�eddd�eddddd �d!œƒZd,d#d$„Zed-d%d&„ƒZ ed.d'd(„ƒZ!ed/d)d*„ƒZ"dS )0zˆ
InceptionNeXt paper: https://arxiv.org/abs/2303.16900
Original implementation & weights from: https://github.com/sail-sg/inceptionnext
é    )ÚpartialN©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)Útrunc_normal_ÚDropPathÚ	to_2tupleÚget_paddingÚSelectAdaptivePool2dé   )Úbuild_model_with_cfg)Úcheckpoint_seq)Úregister_modelÚgenerate_default_cfgsc                       s*   e Zd ZdZd
‡ fdd„	Zdd	„ Z‡  ZS )ÚInceptionDWConv2dz% Inception depthwise convolution
    é   é   ç      À?r   c           	         s¨   t ƒ  ¡  t|| ƒ}t||d�}t||d�}tj||||||d�| _tj||d|fd|fd|f|d�| _tj|||df|df|df|d�| _|d|  |||f| _	d S )N©Údilation)Úpaddingr   Úgroupsr   r   r   )
ÚsuperÚ__init__Úintr	   ÚnnÚConv2dÚ	dwconv_hwÚdwconv_wÚdwconv_hÚsplit_indexes)	ÚselfÚin_chsZsquare_kernel_sizeZband_kernel_sizeZbranch_ratior   ÚgcZsquare_paddingZband_padding©Ú	__class__© úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/inception_next.pyr      s:    
    þ    þ    þzInceptionDWConv2d.__init__c                 C   sB   t j|| jdd�\}}}}t j||  |¡|  |¡|  |¡fdd�S )Nr   )Údim)ÚtorchÚsplitr    Úcatr   r   r   )r!   ÚxZx_idZx_hwZx_wZx_hr&   r&   r'   Úforward.   s    üûzInceptionDWConv2d.forward)r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r-   Ú__classcell__r&   r&   r$   r'   r      s       úr   c                       s8   e Zd ZdZddejdddf‡ fdd„	Zdd„ Z‡  ZS )	ÚConvMlpz¢ MLP using 1x1 convs that keeps spatial dims
    copied from timm: https://github.com/huggingface/pytorch-image-models/blob/v0.6.11/timm/models/layers/mlp.py
    NTç        c                    s€   t ƒ  ¡  |p|}|p|}t|ƒ}tj||d|d d�| _|rF||ƒnt ¡ | _|ƒ | _t 	|¡| _
tj||d|d d�| _d S )Nr   r   )Úkernel_sizeÚbias)r   r   r   r   r   Úfc1ÚIdentityÚnormÚactÚDropoutÚdropÚfc2)r!   Úin_featuresÚhidden_featuresZout_featuresÚ	act_layerÚ
norm_layerr6   r<   r$   r&   r'   r   >   s    

zConvMlp.__init__c                 C   s6   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S ©N)r7   r9   r:   r<   r=   ©r!   r,   r&   r&   r'   r-   S   s    




zConvMlp.forward)	r.   r/   r0   r1   r   ZReLUr   r-   r2   r&   r&   r$   r'   r3   9   s   ør3   c                       sD   e Zd ZdZdddejeejdd�ddf‡ fd	d
„	Zdd„ Z	‡  Z
S )ÚMlpClassifierHeadz MLP classification head
    éè  Úavgr   ç�íµ ÷Æ°>)Úepsr4   Tc	                    sx   t ƒ  ¡  t|dd�| _|| j ¡  }	t||	 ƒ}
tj|	|
|d�| _|ƒ | _	||
ƒ| _
tj|
||d�| _t |¡| _d S )NT©Ú	pool_typeÚflatten)r6   )r   r   r
   Úglobal_poolZ	feat_multr   r   ÚLinearr7   r:   r9   r=   r;   r<   )r!   r(   Únum_classesrJ   Ú	mlp_ratior@   rA   r<   r6   r>   r?   r$   r&   r'   r   `   s    

zMlpClassifierHead.__init__c                 C   s@   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S rB   )rL   r7   r:   r9   r<   r=   rC   r&   r&   r'   r-   u   s    





zMlpClassifierHead.forward)r.   r/   r0   r1   r   ÚGELUr   Z	LayerNormr   r-   r2   r&   r&   r$   r'   rD   \   s   ÷rD   c                       s>   e Zd ZdZdeejedejddf‡ fdd„	Z	dd	„ Z
‡  ZS )
ÚMetaNeXtBlockzÙ MetaNeXtBlock Block
    Args:
        dim (int): Number of input channels.
        drop_path (float): Stochastic depth rate. Default: 0.0
        ls_init_value (float): Init value for Layer Scale. Default: 1e-6.
    r   é   rG   r4   c
           
         sv   t ƒ  ¡  |||d�| _||ƒ| _||t|| ƒ|d�| _|rRt |t 	|¡ ¡nd | _
|	dkrht|	ƒnt ¡ | _d S )Nr   )r@   r4   )r   r   Útoken_mixerr9   r   Úmlpr   Ú	Parameterr)   ZonesÚgammar   r8   Ú	drop_path)
r!   r(   r   rS   rA   Z	mlp_layerrO   r@   Úls_init_valuerW   r$   r&   r'   r   ‡   s    

zMetaNeXtBlock.__init__c                 C   sV   |}|   |¡}|  |¡}|  |¡}| jd k	rD| | j dddd¡¡}|  |¡| }|S )Nr   éÿÿÿÿ)rS   r9   rT   rV   ÚmulZreshaperW   )r!   r,   Zshortcutr&   r&   r'   r-   ›   s    



zMetaNeXtBlock.forward)r.   r/   r0   r1   r   r   ÚBatchNorm2dr3   rP   r   r-   r2   r&   r&   r$   r'   rQ      s   
örQ   c                	       s:   e Zd Zdddddeejddf	‡ fdd„	Zdd	„ Z‡  ZS )
ÚMetaNeXtStageé   )r   r   Nç      ð?rR   c                    s°   t ƒ  ¡  d| _|dks(|d |d krPt |
|ƒtj||d||d d�¡| _n
t ¡ | _|pfdg| }g }t|ƒD ]*}| 	t
||d || |||	|
|d�¡ qttj|Ž | _d S )NFr   r   r]   )r5   Ústrider   r4   )r(   r   rW   rX   rS   r@   rA   rO   )r   r   Úgrad_checkpointingr   Ú
Sequentialr   Ú
downsampler8   ÚrangeÚappendrQ   Úblocks)r!   r"   Úout_chsr_   Údepthr   Údrop_path_ratesrX   rS   r@   rA   rO   Zstage_blocksÚir$   r&   r'   r   §   s8    
ûþ
ø

zMetaNeXtStage.__init__c                 C   s6   |   |¡}| jr(tj ¡ s(t| j|ƒ}n
|  |¡}|S rB   )rb   r`   r)   ÚjitZis_scriptingr   re   rC   r&   r&   r'   r-   Ô   s
    

zMetaNeXtStage.forward)	r.   r/   r0   r   r   rP   r   r-   r2   r&   r&   r$   r'   r\   ¦   s   ô-r\   c                       s¾   e Zd ZdZddddddeejejded	d	d
f‡ fdd„	Z	dd„ Z
ejjd$dd„ƒZejjdd„ ƒZddefdd„Zejjd%dd„ƒZejjdd„ ƒZdd„ Zd&edœd d!„Zd"d#„ Z‡  ZS )'ÚMetaNeXta²   MetaNeXt
        A PyTorch impl of : `InceptionNeXt: When Inception Meets ConvNeXt` - https://arxiv.org/abs/2303.16900

    Args:
        in_chans (int): Number of input image channels. Default: 3
        num_classes (int): Number of classes for classification head. Default: 1000
        depths (tuple(int)): Number of blocks at each stage. Default: (3, 3, 9, 3)
        dims (tuple(int)): Feature dimension at each stage. Default: (96, 192, 384, 768)
        token_mixers: Token mixer function. Default: nn.Identity
        norm_layer: Normalization layer. Default: nn.BatchNorm2d
        act_layer: Activation function for MLP. Default: nn.GELU
        mlp_ratios (int or tuple(int)): MLP ratios. Default: (4, 4, 4, 3)
        head_fn: classifier head
        drop_rate (float): Head dropout rate
        drop_path_rate (float): Stochastic depth rate. Default: 0.
        ls_init_value (float): Init value for Layer Scale. Default: 1e-6.
    r   rE   rF   é    ©r   r   é	   r   ©é`   éÀ   é€  i   )rR   rR   rR   r   r4   rG   c                    s  t ƒ  ¡  t|ƒ}t|ttfƒs*|g| }t|
ttfƒsB|
g| }
|| _|| _|| _g | _	t
 t
j||d ddd�||d ƒ¡| _dd„ t d|t|ƒ¡ |¡D ƒ}|d }d}d}t
 ¡ | _t|ƒD ]Æ}|dksÚ|dkrÞdnd}||krþ|dkrþ||9 }d}||9 }|dk�rdnd}|| }| j t|||dk�r:|nd||f|| || ||	|| ||
| d	�¡ |}|  j	t||d
|› �d�g7  _	qÆ|| _| jdk�rÔt|tƒ�r¼| j�s¼tdƒ‚|| j|| j|d�| _n$| j�rît| jdd�| _n
t
 ¡ | _|  | j¡ d S )Nr   rR   )r5   r_   c                 S   s   g | ]}|  ¡ ‘qS r&   )Útolist)Ú.0r,   r&   r&   r'   Ú
<listcomp>  s     z%MetaNeXt.__init__.<locals>.<listcomp>r   r]   )r   r]   )	r_   r   rg   rh   rX   r@   rS   rA   rO   zstages.)Znum_chsZ	reductionÚmoduleú4Cannot disable global pooling with MLP head present.©rJ   r<   TrI   ) r   r   ÚlenÚ
isinstanceÚlistÚtuplerN   rL   Ú	drop_rateZfeature_infor   ra   r   Ústemr)   ZlinspaceÚsumr*   Ústagesrc   rd   r\   ÚdictÚnum_featuresÚ
issubclassrD   ÚAssertionErrorÚheadr
   r8   ÚapplyÚ_init_weights)r!   Zin_chansrN   rL   Zoutput_strideÚdepthsÚdimsÚtoken_mixersrA   r@   Z
mlp_ratiosÚhead_fnr}   Zdrop_path_raterX   Z	num_stageZdp_ratesZprev_chsZcurr_strider   ri   r_   Zfirst_dilationrf   r$   r&   r'   r   ð   sf    



þ"
õ"
zMetaNeXt.__init__c                 C   s>   t |tjtjfƒr:t|jdd� |jd k	r:tj |jd¡ d S )Ng{®Gáz”?)Ústdr   )	rz   r   r   rM   r   Úweightr6   ÚinitZ	constant_)r!   Úmr&   r&   r'   r‡   ;  s    
zMetaNeXt._init_weightsFc                 C   s   t d|rdnddgd�S )Nz^stemz^stages\.(\d+))z^stages\.(\d+)\.downsample)r   )z^stages\.(\d+)\.blocks\.(\d+)N)r~   re   )r�   )r!   Zcoarser&   r&   r'   Úgroup_matcherA  s    þþzMetaNeXt.group_matcherc                 C   s   | j jS rB   )r…   r=   ©r!   r&   r&   r'   Úget_classifierK  s    zMetaNeXt.get_classifierr   Nc                 C   sn   |d k	r|| _ |dkrHt|tƒr.| j s.tdƒ‚|| j|| j | jd�| _n"| j r`t| j dd�| _n
t 	¡ | _d S )Nr   rw   rx   TrI   )
rL   rƒ   rD   r„   r‚   r}   r…   r
   r   r8   )r!   rN   rL   r‹   r&   r&   r'   Úreset_classifierO  s    
zMetaNeXt.reset_classifierTc                 C   s   | j D ]
}||_qd S rB   )r€   r`   )r!   ÚenableÚsr&   r&   r'   Úset_grad_checkpointing\  s    
zMetaNeXt.set_grad_checkpointingc                 C   s   t ƒ S rB   )Úsetr‘   r&   r&   r'   Úno_weight_decaya  s    zMetaNeXt.no_weight_decayc                 C   s   |   |¡}|  |¡}|S rB   )r~   r€   rC   r&   r&   r'   Úforward_featurese  s    

zMetaNeXt.forward_features)Ú
pre_logitsc                 C   s*   |r t | jdƒr| j |¡}|S |  |¡S )NrL   )Úhasattrr…   rL   )r!   r,   rš   r&   r&   r'   Úforward_headj  s
    zMetaNeXt.forward_headc                 C   s   |   |¡}|  |¡}|S rB   )r™   rœ   rC   r&   r&   r'   r-   q  s    

zMetaNeXt.forward)F)T)F)r.   r/   r0   r1   r   r   r[   rP   rD   r   r‡   r)   rj   Úignorer�   r’   r“   r–   r˜   r™   Úboolrœ   r-   r2   r&   r&   r$   r'   rk   Ý   s:   ñK	

rk   Ú c                 K   s   | dddddt tdddœ
|–S )	NrE   )r   éà   r    )é   r¡   g      ì?Zbicubiczstem.0zhead.fc2)
ÚurlrN   Ú
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationZmeanrŒ   Z
first_convÚ
classifierr   )r¢   Úkwargsr&   r&   r'   Ú_cfgw  s         ûúr©   ztimm/)Ú	hf_hub_idgffffffî?)rª   r¥   )r   rr   rr   )é   r«   r^   )rª   r£   r¤   r¥   )zinception_next_tiny.sail_in1kzinception_next_small.sail_in1kzinception_next_base.sail_in1kz!inception_next_base.sail_in1k_384Fc                 K   s$   t t| |fdtddd�i|—Ž}|S )NZfeature_cfg)r   r   r]   r   T)Zout_indicesZflatten_sequential)r   rk   r�   )ÚvariantÚ
pretrainedr¨   Úmodelr&   r&   r'   Ú_create_inception_next˜  s      ÿ
þýr¯   c                 K   s(   t ddtd�}tdd| it |f|Ž—ŽS )Nrm   ro   ©rˆ   r‰   rŠ   Úinception_next_tinyr­   )r±   ©r�   r   r¯   ©r­   r¨   Z
model_argsr&   r&   r'   r±   ¡  s     þr±   c                 K   s(   t ddtd�}tdd| it |f|Ž—ŽS )N©r   r   é   r   ro   r°   Úinception_next_smallr­   )r¶   r²   r³   r&   r&   r'   r¶   ª  s     þr¶   c                 K   s(   t ddtd�}tdd| it |f|Ž—ŽS )Nr´   )é€   é   i   i   r°   Úinception_next_baser­   )r¹   r²   r³   r&   r&   r'   r¹   ³  s     þr¹   )rŸ   )F)F)F)F)#r1   Ú	functoolsr   r)   Ztorch.nnr   Z	timm.datar   r   Ztimm.layersr   r   r   r	   r
   Z_builderr   Z_manipulater   Ú	_registryr   r   ÚModuler   r3   rD   rQ   r\   rk   r©   Zdefault_cfgsr¯   r±   r¶   r¹   r&   r&   r&   r'   Ú<module>   sR   '##'7 
ÿÿý  ýò
	