Ë
    éÓ^jà!  ã                   ó  — d Z ddlmZmZmZ ddlZddlmZ ddlmc m	Z
 ddlmZ ddlmZmZmZ  G d„ dej"                  «      Ze G d	„ d
ej"                  «      «       Z G d„ dej"                  «      Ze G d„ dej"                  «      «       Zy)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.
é    )ÚOptionalÚTupleÚUnionNé   )Úregister_notrace_module)Úget_paddingÚget_padding_valueÚpad_samec                   ó¶   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 ddededeeeeef   f   deeeeef   f   deeeeeef   f      deeeeef   f   ded	ed
e	fˆ fd„Z
d„ Zˆ x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
    Ú
in_channelÚout_channelsÚkernel_sizeÚstrideÚpaddingÚdilationÚgroupsÚbiasÚepsc                 ód   •— |€t        |||«      }t        ‰| �	  |||||||||
|¬«
       |	| _        y )N©r   r   r   r   r   ÚdeviceÚdtype)r   ÚsuperÚ__init__r   )Úselfr   r   r   r   r   r   r   r   r   r   r   Ú	__class__s               €ú_/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/std_conv.pyr   zStdConv2d.__init__#   sL   ø€ ð ˆ?Ü! +¨v°xÓ@ˆGÜ‰ÑØ˜ k¸&Ø h°vÀDÐQWÐ_dð 	ô 	fð ˆ�ó    c           	      óf  — t        j                  | j                  j                  d| j                  d«      d d dd| j
                  ¬«      j                  | j                  «      }t        j                  ||| 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(   s      r   ÚforwardzStdConv2d.forward8   sŠ   € Ü—‘Ø�K‰K×Ñ  4×#4Ñ#4°bÓ9ØØØØØ—‘ô
÷ ‰*�T—[‘[Ó
!ð 	ô �H‰H�Q˜ §	¡	¨4¯;©;¸¿¹ÀdÇmÁmÐUY×U`ÑU`ÓaˆØˆr   )r   Nr   r   Fç�íµ ÷Æ°>NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úintr   r   r   ÚboolÚfloatr   r.   Ú__classcell__©r   s   @r   r   r      sÑ   ø„ ñð 34Ø=AØ45ØØØØØñàðð ðð ˜s E¨#¨s¨(¡OÐ3Ñ4ð	ð
 ˜#˜u S¨# X™Ð.Ñ/ðð ˜e C¨¨s°C¨x©Ð$8Ñ9Ñ:ðð ˜C  s¨C x¡Ð0Ñ1ðð ðð ðð õö*
r   r   c                   óœ   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 ddededeeeeef   f   deeeeef   f   dedeeeeef   f   ded	ed
e	fˆ fd„Z
d„ Zˆ x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   r   r   r   r   r   r   r   r   c                 óx   •— t        ||||¬«      \  }}t        ‰| �	  |||||||||
|¬«
       || _        |	| _        y )N©r   r   r   )r	   r   r   Úsame_padr   )r   r   r   r   r   r   r   r   r   r   r   r   Ú
is_dynamicr   s                €r   r   zStdConv2dSame.__init__L   sU   ø€ ô 0°¸ÈVÐ^fÔgÑˆ�Ü‰ÑØ˜ k¸&È'Ð\dØ ¨V¸5ð 	ô 	Bð #ˆŒØˆ�r   c           	      óÖ  — | j                   r,t        || j                  | j                  | j                  «      }t        j                  | j                  j                  d| j                  d«      d d dd| j                  ¬«      j                  | j                  «      }t        j                  ||| j                  | j                  | j                  | j                  | j                  «      }|S r!   )r=   r
   r   r   r   r&   r'   r(   r)   r   r   r*   r+   r   r   r   r,   s      r   r.   zStdConv2dSame.forwarda   s¯   € Ø�=Š=Ü˜˜D×,Ñ,¨d¯k©k¸4¿=¹=ÓIˆAÜ—‘Ø�K‰K×Ñ  4×#4Ñ#4°bÓ9ØØØØØ—‘ô
÷ ‰*�T—[‘[Ó
!ð 	ô �H‰H�Q˜ §	¡	¨4¯;©;¸¿¹ÀdÇmÁmÐUY×U`ÑU`ÓaˆØˆr   )r   ÚSAMEr   r   Fr/   NN)r0   r1   r2   r3   r4   r   r   Ústrr5   r6   r   r.   r7   r8   s   @r   r:   r:   E   sº   ø„ ñð 34Ø!Ø45ØØØØØñàðð ðð ˜s E¨#¨s¨(¡OÐ3Ñ4ð	ð
 ˜#˜u S¨# X™Ð.Ñ/ðð ðð ˜C  s¨C x¡Ð0Ñ1ðð ðð ðð õö*r   r:   c                   óÐ   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 ddededeeeeef   f   deeeeef   f   deeeeeef   ef      deeeeef   f   ded	e	d
e
de
de
fˆ fd„Zdˆ fd„Zd„ Zˆ x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.
    Úin_channelsr   r   r   r   r   r   r   Úgammar   Ú	gain_initc           	      ób  •— ||dœ}|€t        |||«      }t        ‰| �  |||f|||||dœ|¤Ž |	| j                  d   j	                  «       dz  z  | _        |
| _        || _        t        j                  t        j                  | j                  dddffi |¤Ž«      | _        | j                  «        y )N©r   r   ©r   r   r   r   r   r   ç      à¿r   )r   r   r   r(   ÚnumelÚscaler   rF   ÚnnÚ	ParameterÚtorchÚemptyr   ÚgainÚreset_parameters)r   rD   r   r   r   r   r   r   r   rE   r   rF   r   r   Úddr   s                  €r   r   zScaledStdConv2d.__init__y   s»   ø€ ð  ¨Ñ/ˆØˆ?Ü! +¨v°xÓ@ˆGÜ‰ÑØ˜ {ð	,Ø;AÈ7Ð]eØ ñ	,à(*ò	,ð ˜TŸ[™[¨™^×1Ñ1Ó3°tÑ;Ñ;ˆŒ
ØˆŒØ"ˆŒä—L‘L¤§¡¨d×.?Ñ.?ÀÀAÀqÐ-IÑ!PÈRÑ!PÓQˆŒ	à×ÑÕr   c                 ó¸   •— t        | d«      rMt        j                  j                  j	                  | j
                  | j                  «       t        ‰| �!  «        y y ©NrQ   ©	ÚhasattrrO   rM   ÚinitÚ	constant_rQ   rF   r   rR   ©r   r   s    €r   rR   z ScaledStdConv2d.reset_parameters—   ó=   ø€ ä�4˜Ô Ü�H‰H�M‰M×#Ñ# D§I¡I¨t¯~©~Ô>ä‰GÑ$Õ&ð !r   c           	      ó°  — t        j                  | j                  j                  d| j                  d«      d d | j
                  | j                  z  j                  d«      dd| j                  ¬«      j                  | j                  «      }t        j                  ||| j                  | j                  | j                  | j                  | j                  «      S ©Nr   r"   Tr#   )r(   r$   r%   r   )r&   r'   r(   r)   r   rQ   rL   Úviewr   r*   r+   r   r   r   r   r   r,   s      r   r.   zScaledStdConv2d.forwardŸ   s¡   € Ü—‘Ø�K‰K×Ñ  4×#4Ñ#4°bÓ9ØØØ—I‘I §
¡
Ñ*×0Ñ0°Ó4ØØØ—‘ô
÷ ‰*�T—[‘[Ó
!ð 	ô �x‰x˜˜6 4§9¡9¨d¯k©k¸4¿<¹<ÈÏÉÐX\×XcÑXcÓdÐdr   )
r   Nr   r   Tç      ð?r/   r_   NN©ÚreturnN)r0   r1   r2   r3   r4   r   r   r   rA   r5   r6   r   rR   r.   r7   r8   s   @r   rC   rC   p   só   ø„ ñð 34ØBFØ45ØØØØØ"ØØñ àð ð ð ð ˜s E¨#¨s¨(¡OÐ3Ñ4ð	 ð
 ˜#˜u S¨# X™Ð.Ñ/ð ð ˜e C¨¨s°C¨x©¸#Ð$=Ñ>Ñ?ð ð ˜C  s¨C x¡Ð0Ñ1ð ð ð ð ð ð ð ð ð ð õ õ<'ö
er   rC   c                   ó´   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 ddededeeeeef   f   deeeeef   f   dedeeeeef   f   ded	ed
e	de	de	fˆ fd„Z
dˆ fd„Zd„ Zˆ x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.
    rD   r   r   r   r   r   r   r   rE   r   rF   c           	      óv  •— ||dœ}t        ||||¬«      \  }}t        ‰| �  |||f|||||dœ|¤Ž |	| j                  d   j	                  «       dz  z  | _        || _        |
| _        || _        t        j                  t        j                  | j                  dddffi |¤Ž«      | _        | j                  «        y )NrH   r<   rI   r   rJ   r   )r	   r   r   r(   rK   rL   r=   r   rF   rM   rN   rO   rP   r   rQ   rR   )r   rD   r   r   r   r   r   r   r   rE   r   rF   r   r   rS   r>   r   s                   €r   r   zScaledStdConv2dSame.__init__¶   sÅ   ø€ ð  ¨Ñ/ˆÜ/°¸ÈVÐ^fÔgÑˆ�Ü‰ÑØ˜ {ð	,Ø;AÈ7Ð]eØ ñ	,à(*ò	,ð ˜TŸ[™[¨™^×1Ñ1Ó3°tÑ;Ñ;ˆŒ
Ø"ˆŒØˆŒØ"ˆŒä—L‘L¤§¡¨d×.?Ñ.?ÀÀAÀqÐ-IÑ!PÈRÑ!PÓQˆŒ	à×ÑÕr   c                 ó¸   •— t        | d«      rMt        j                  j                  j	                  | j
                  | j                  «       t        ‰| �!  «        y y rU   rV   rZ   s    €r   rR   z$ScaledStdConv2dSame.reset_parametersÔ   r[   r   c           	      ó   — | j                   r,t        || j                  | j                  | j                  «      }t        j                  | j                  j                  d| j                  d«      d d | j                  | j                  z  j                  d«      dd| j                  ¬«      j                  | j                  «      }t        j                  ||| j                   | j                  | j"                  | j                  | j$                  «      S r]   )r=   r
   r   r   r   r&   r'   r(   r)   r   rQ   rL   r^   r   r*   r+   r   r   r   r,   s      r   r.   zScaledStdConv2dSame.forwardÜ   sÆ   € Ø�=Š=Ü˜˜D×,Ñ,¨d¯k©k¸4¿=¹=ÓIˆAÜ—‘Ø�K‰K×Ñ  4×#4Ñ#4°bÓ9ØØØ—I‘I §
¡
Ñ*×0Ñ0°Ó4ØØØ—‘ô
÷ ‰*�T—[‘[Ó
!ð 	ô �x‰x˜˜6 4§9¡9¨d¯k©k¸4¿<¹<ÈÏÉÐX\×XcÑXcÓdÐdr   )
r   r@   r   r   Tr_   r/   r_   NNr`   )r0   r1   r2   r3   r4   r   r   rA   r5   r6   r   rR   r.   r7   r8   s   @r   rc   rc   ¬   sÚ   ø„ ñð 34Ø!Ø45ØØØØØ"ØØñ àð ð ð ð ˜s E¨#¨s¨(¡OÐ3Ñ4ð	 ð
 ˜#˜u S¨# X™Ð.Ñ/ð ð ð ð ˜C  s¨C x¡Ð0Ñ1ð ð ð ð ð ð ð ð ð ð õ õ<'öer   rc   )r3   Útypingr   r   r   rO   Útorch.nnrM   Útorch.nn.functionalÚ
functionalr&   Ú_fxr   r   r   r	   r
   ÚConv2dr   r:   rC   rc   © r   r   ú<module>rn      s�   ðñ÷$ *Ñ )ã Ý ß Ð å (ß =Ñ =ô%�—	‘	ô %ðP ô'�B—I‘Ió 'ó ð'ôT9e�b—i‘iô 9eðx ô;e˜"Ÿ)™)ó ;eó ñ;er   