
    ^j                     F    d Z ddlZddlmZ  G d dej                        Zy)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                   @     e Zd ZdZ	 	 	 	 ddededef fdZd Z xZ	S )GlobalResponseNormz) Global Response Normalization layer
    dimepschannels_lastc                 L   ||d}t         |           || _        |rd| _        d| _        d| _        nd| _        d| _        d| _        t        j                  t        j                  |fi |      | _
        t        j                  t        j                  |fi |      | _        y )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          Z/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/grn.pyr   zGlobalResponseNorm.__init__   s     /%D!D)DM%D D)DMll5;;s#9b#9:LLS!7B!78	    c                 ^   |j                  d| j                  d      }||j                  | j                  d      | j                  z   z  }|t        j                  | j                  j                  | j                        | j                  j                  | j                        ||z        z   S )Nr   T)pr   keepdim)r   r!   )normr   meanr   r   r   addcmulr   viewr   r   )r   xx_gx_ns       r   forwardzGlobalResponseNorm.forward,   s    ffqd..f=SXX$"2"2DXADHHLM5==!>@P@PQUQ^Q^@_abehahiiir   )gư>TNN)
__name__
__module____qualname____doc__intfloatboolr   r)   __classcell__)r   s   @r   r   r      s=    
 "&99 9  	9.jr   r   )r-   r   r   Moduler    r   r   <module>r4      s$     j jr   