U
    ¯Ê¹jÿ  ã                   @   sŠ   d Z ddlZddlmZ ddlm  mZ ddlmZ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dS )a    Convolution with Weight Standardization (StdConv and ScaledStdConv)

StdConv:
@article{weightstandardization,
  author    = {Siyuan Qiao and Huiyu Wang and Chenxi Liu and Wei Shen and Alan Yuille},
  title     = {Weight Standardization},
  journal   = {arXiv preprint arXiv:1903.10520},
  year      = {2019},
}
Code: https://github.com/joe-siyuan-qiao/WeightStandardization

ScaledStdConv:
Paper: `Characterizing signal propagation to close the performance gap in unnormalized ResNets`
    - https://arxiv.org/abs/2101.08692
Official Deepmind JAX code: https://github.com/deepmind/deepmind-research/tree/master/nfnets

Hacked together by / copyright Ross Wightman, 2021.
é    Né   )Úget_paddingÚget_padding_valueÚpad_samec                       s*   e Zd ZdZd
‡ fdd„	Zdd	„ Z‡  ZS )Ú	StdConv2dzÓConv2d with Weight Standardization. Used for BiT ResNet-V2 models.

    Paper: `Micro-Batch Training with Batch-Channel Normalization and Weight Standardization` -
        https://arxiv.org/abs/1903.10520v2
    r   NFç�íµ ÷Æ°>c
           
   
      s:   |d krt |||ƒ}tƒ j||||||||d� |	| _d S )N©ÚstrideÚpaddingÚdilationÚgroupsÚbias)r   ÚsuperÚ__init__Úeps)
ÚselfÚ
in_channelÚout_channelsÚkernel_sizer	   r
   r   r   r   r   ©Ú	__class__© úS/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/layers/std_conv.pyr       s          þzStdConv2d.__init__c              	   C   sR   t j| j d| jd¡d d dd| jd� | j¡}t  ||| j| j	| j
| j| j¡}|S ©Nr   éÿÿÿÿTç        )ÚtrainingÚmomentumr   )ÚFÚ
batch_normÚweightÚreshaper   r   Ú
reshape_asÚconv2dr   r	   r
   r   r   ©r   Úxr    r   r   r   Úforward*   s        þþ zStdConv2d.forward)r   Nr   r   Fr   ©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r&   Ú__classcell__r   r   r   r   r      s             þ
r   c                       s*   e Zd ZdZd
‡ fdd„	Zdd	„ Z‡  ZS )ÚStdConv2dSamezëConv2d with Weight Standardization. TF compatible SAME padding. Used for ViT Hybrid model.

    Paper: `Micro-Batch Training with Batch-Channel Normalization and Weight Standardization` -
        https://arxiv.org/abs/1903.10520v2
    r   ÚSAMEFr   c
              
      s@   t ||||d�\}}
tƒ j||||||||d� |
| _|	| _d S )N©r	   r   r   )r   r   r   Úsame_padr   )r   r   r   r   r	   r
   r   r   r   r   Ú
is_dynamicr   r   r   r   8   s          þzStdConv2dSame.__init__c              	   C   sl   | j rt|| j| j| jƒ}tj| j d| j	d¡d d dd| j
d� | j¡}t ||| j| j| j| j| j¡}|S r   )r0   r   r   r	   r   r   r   r    r!   r   r   r"   r#   r   r
   r   r$   r   r   r   r&   B   s        þþ zStdConv2dSame.forward)r   r.   r   r   Fr   r'   r   r   r   r   r-   2   s             þ
r-   c                       s*   e Zd ZdZd‡ fdd„	Zd	d
„ Z‡  ZS )ÚScaledStdConv2da4  Conv2d layer with Scaled Weight Standardization.

    Paper: `Characterizing signal propagation to close the performance gap in unnormalized ResNets` -
        https://arxiv.org/abs/2101.08692

    NOTE: the operations used in this impl differ slightly from the DeepMind Haiku impl. The impact is minor.
    r   NTç      ð?r   c              
      sp   |d krt |||ƒ}tƒ j||||||||d� t t | jdddf|¡¡| _|	| j	d  
¡ d  | _|
| _d S )Nr   r   r   ç      à¿)r   r   r   ÚnnÚ	ParameterÚtorchÚfullr   Úgainr    ÚnumelÚscaler   )r   Úin_channelsr   r   r	   r
   r   r   r   Úgammar   Ú	gain_initr   r   r   r   U   s          þzScaledStdConv2d.__init__c              	   C   s^   t j| j d| jd¡d d | j| j  d¡dd| jd� 	| j¡}t  
||| j| j| j| j| j¡S ©Nr   r   Tr   )r    r   r   r   )r   r   r    r!   r   r9   r;   Úviewr   r"   r#   r   r	   r
   r   r   r$   r   r   r   r&   a   s        ýýzScaledStdConv2d.forward)r   Nr   r   Tr3   r   r3   r'   r   r   r   r   r2   L   s   	              þr2   c                       s*   e Zd ZdZd‡ fdd„	Zd	d
„ Z‡  ZS )ÚScaledStdConv2dSamea\  Conv2d layer with Scaled Weight Standardization and Tensorflow-like SAME padding support

    Paper: `Characterizing signal propagation to close the performance gap in unnormalized ResNets` -
        https://arxiv.org/abs/2101.08692

    NOTE: the operations used in this impl differ slightly from the DeepMind Haiku impl. The impact is minor.
    r   r.   Tr3   r   c              
      sv   t ||||d�\}}tƒ j||||||||d� t t | jdddf|¡¡| _|	| j	d  
¡ d  | _|| _|
| _d S )Nr/   r   r   r   r4   )r   r   r   r5   r6   r7   r8   r   r9   r    r:   r;   r0   r   )r   r<   r   r   r	   r
   r   r   r   r=   r   r>   r1   r   r   r   r   r   s          þzScaledStdConv2dSame.__init__c              	   C   sx   | j rt|| j| j| jƒ}tj| j d| j	d¡d d | j
| j  d¡dd| jd� | j¡}t ||| j| j| j| j| j¡S r?   )r0   r   r   r	   r   r   r   r    r!   r   r9   r;   r@   r   r"   r#   r   r
   r   r$   r   r   r   r&   ~   s        ýýzScaledStdConv2dSame.forward)r   r.   r   r   Tr3   r   r3   r'   r   r   r   r   rA   i   s   	              þrA   )r+   r7   Ztorch.nnr5   Ztorch.nn.functionalZ
functionalr   r
   r   r   r   ZConv2dr   r-   r2   rA   r   r   r   r   Ú<module>   s   