
    Ng	                         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dS )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            	       H     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          |
          | _        || _        |                                  d S )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/html/ai-engine/env/lib/python3.11/site-packages/timm/layers/global_context.pyr   zGlobalContext.__init__   s    mT""++---!),,	MU_8QADIIII[_(H)<jVXYYYK 	 "8[IZefffDLLDL 	"$X{i\ghhhDNN!DN$Z00	,    c                     | j         ,t          j                            | j         j        dd           | j        0t          j                            | j        j        j                   d S d S )Nfan_inrelu)modenonlinearity)r   r   initkaiming_normal_weightr   zeros_fc2)r   s    r&   r   zGlobalContext.reset_parameters+   s_    >%G##DN$9W]#^^^<#GNN4<+233333 $#r'   c                 B   |j         \  }}}}| j        |                     |                              |d||z            }t          j        |d                              d          }|                    ||||z                                d          |z  }|                    ||dd          }n|                    dd          }| j        -|                     |          }|| 	                    |          z  }| 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   W
1a>%>>!$$,,Q1q599D9Tr***44Q77Dii1a!e,,66q99D@Gll1aA..GGfff66G>%NN7++EDIIe$$$A<#LL))EE	Ar'   )	__name__
__module____qualname__r   ReLUr   r   rG   __classcell__)r%   s   @r&   r   r      ss        *.4`eDQ"'^g           ,4 4 4      r'   r   )__doc__torchr   torch.nn.functional
functionalr:   
create_actr   r   helpersr   mlpr   normr	   Moduler    r'   r&   <module>rW      s                    7 7 7 7 7 7 7 7 # # # # # #            0 0 0 0 0BI 0 0 0 0 0r'   