
    RЦi                     F    S r SSKrSSKJr   " S S\R                  5      rg)a  Global Response Normalization Module

Based on the GRN layer presented in
`ConvNeXt-V2 - Co-designing and Scaling ConvNets with Masked Autoencoders` - https://arxiv.org/abs/2301.00808

This implementation
* works for both NCHW and NHWC tensor layouts
* uses affine param names matching existing torch norm layers
* slightly improves eager mode performance via fused addcmul

Hacked together by / Copyright 2023 Ross Wightman
    N)nnc                   N   ^  \ rS rSrSr    S	S\S\S\4U 4S jjjrS r	Sr
U =r$ )
GlobalResponseNorm   z(Global Response Normalization layer
    dimepschannels_lastc                 Z  > XES.n[         TU ]  5         X l        U(       a  SU l        SU l        SU l        OSU l        SU l        SU l        [        R                  " [        R                  " U40 UD65      U l
        [        R                  " [        R                  " U40 UD65      U l        g )N)devicedtype)      )r   r   r   r   )r      r   )r   r   r   r   )super__init__r   spatial_dimchannel_dimwb_shaper   	Parametertorchzerosweightbias)selfr   r   r	   r   r   dd	__class__s          N/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/layers/grn.pyr   GlobalResponseNorm.__init__   s     /%D!D)DM%D D)DMll5;;s#9b#9:LLS!7B!78	    c                 P   UR                  SU R                  SS9nX"R                  U R                  SS9U R                  -   -  nU[
        R                  " U R                  R                  U R                  5      U R                  R                  U R                  5      X-  5      -   $ )Nr   T)pr   keepdim)r   r#   )normr   meanr   r   r   addcmulr   viewr   r   )r   xx_gx_ns       r   forwardGlobalResponseNorm.forward,   s    ffqd..f=XX$"2"2DXADHHLM5==!>@P@PQUQ^Q^@_abahiiir    )r   r   r   r   r   r   )gư>TNN)__name__
__module____qualname____firstlineno____doc__intfloatboolr   r+   __static_attributes____classcell__)r   s   @r   r   r      sH    
 "&99 9  	9 9.j jr    r   )r1   r   r   Moduler    r    r   <module>r9      s$     j jr    