
    kh	                         d Z ddlmZ ddlmc mZ ddlmZmZ ddl	m
Z
 ddlmZ ddlmZ  G d	 d
ej                        Zy)a   Global Context Attention Block

Paper: `GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond`
    - https://arxiv.org/abs/1904.11492

Official code consulted as reference: https://github.com/xvjiarui/GCNet

Hacked together by / Copyright 2021 Ross Wightman
    )nnN   )create_act_layerget_act_layer)make_divisible)ConvMlp)LayerNorm2dc            	       R     e Zd Zdddddddej                  df	 fd	Zd Zd	 Z xZS )
GlobalContextTFg      ?Nr   sigmoidc                    t         t        |           t        |	      }	|rt	        j
                  |ddd      nd | _        |t        ||z  |d      }|rt        |||	t              | _
        nd | _
        |rt        |||	t              | _        nd | _        t        |
      | _        || _        | j                          y )Nr   T)kernel_sizebiasg        )round_limit)	act_layer
norm_layer)superr   __init__r   r   Conv2d	conv_attnr   r   r	   mlp_add	mlp_scaler   gateinit_last_zeroreset_parameters)selfchannelsuse_attnfuse_add
fuse_scaler   rd_ratiord_channels
rd_divisorr   
gate_layer	__class__s              V/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/layers/global_context.pyr   zGlobalContext.__init__   s    mT+-!),	MU8QADI[_(H)<jVXYK"8[IZefDLDL$X{i\ghDN!DN$Z0	,    c                    | j                   6t        j                  j                  | j                   j                  dd       | j
                  >t        j                  j                  | j
                  j                  j                         y y )Nfan_inrelu)modenonlinearity)r   r   initkaiming_normal_weightr   zeros_fc2)r   s    r&   r   zGlobalContext.reset_parameters+   s_    >>%GG##DNN$9$9W]#^<<#GGNN4<<++223 $r'   c                    |j                   \  }}}}| j                  | j                  |      j                  |d||z        }t        j                  |d      j                  d      }|j                  ||||z        j                  d      |z  }|j                  ||dd      }n|j                  dd      }| j                  %| j                  |      }|| j                  |      z  }| j                  | j                  |      }||z   }|S )Nr   )dim   )   r5   T)r4   keepdim)shaper   reshapeFsoftmax	unsqueezeviewmeanr   r   r   )	r   xBCHWattncontextmlp_xs	            r&   forwardzGlobalContext.forward1   s    WW
1a>>%>>!$,,Q1q59D99Tr*44Q7Dii1a!e,66q9D@Gll1aA.Gfff6G>>%NN7+EDIIe$$A<<#LL)EE	Ar'   )	__name__
__module____qualname__r   ReLUr   r   rG   __classcell__)r%   s   @r&   r   r      s,    *.4`eDQ"''^g ,4r'   r   )__doc__torchr   torch.nn.functional
functionalr:   
create_actr   r   helpersr   mlpr   normr	   Moduler    r'   r&   <module>rW      s1       7 #  0BII 0r'   