
    Ng                         d Z ddl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   Gather-Excite Attention Block

Paper: `Gather-Excite: Exploiting Feature Context in CNNs` - https://arxiv.org/abs/1810.12348

Official code here, but it's only partial impl in Caffe: https://github.com/hujie-frank/GENet

I've tried to support all of the extent both w/ and w/o params. I don't believe I've seen another
impl that covers all of the cases.

NOTE: extent=0 + extra_params=False is equivalent to Squeeze-and-Excitation

Hacked together by / Copyright 2021 Ross Wightman
    N)nn   )create_act_layerget_act_layer)create_conv2d)make_divisible)ConvMlpc                   T     e Zd ZdZddddddddej        ej        df fd		Zd
 Z xZ	S )GatherExcitez$ Gather-Excite Attention Module
    NFr   Tg      ?r   sigmoidc                    t          t          |                                            |	| _        t	          |
          }
|| _        |rct          j                    | _        |dk    rj|
J d            | j        	                    dt          |||dd                     |r-| j        	                    dt          j        |                     n%|dz  dk    sJ t          t          j        |                    }t          |          D ]}| j        	                    d	|dz    t          ||d
dd                     |r3| j        	                    d|dz    t          j        |                     ||dz
  k    r+| j        	                    d|dz     |
d                     nJd | _        | j        dk    rd| _        d| _        n)|dz  dk    sJ | j        dz  dz
  | _        | j        | _        |st%          ||z  |d          }|rt'          |||
          nt          j                    | _        t-          |          | _        d S )Nr   zBspatial feature size must be specified for global extent w/ paramsconv1r   T)kernel_sizestride	depthwisenorm1   conv   normact)inplaceg        )round_limit)	act_layer)superr   __init__add_maxpoolr   extentr   
Sequentialgather
add_moduler   BatchNorm2dintmathlog2rangegkgsr   r	   Identitymlpr   gate)selfchannels	feat_sizeextra_paramsr   use_mlprd_ratiord_channels
rd_divisorr   r   
norm_layer
gate_layernum_convi	__class__s                  U/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/layers/gather_excite.pyr   zGatherExcite.__init__   s    	lD!!**,,,&!),,	 	&-//DK{{ ,,.r,,,&&]8X9]^jnoooq q q OK**8R^H5M5MNNNzQty0011x W WAK**&q1u%haPQ]abbbd d d " Y..~a!e~~r~h?W?WXXXHqL((..}QU}}iiPT>U>U>UVVVW DK{azQ+/A-+ 	Z(H)<jVXYYYKJQd78[IFFFFWYWbWdWd$Z00			    c           	         |j         dd          }| j        |                     |          }n| j        dk    r?|                    dd          }| j        r d|z  d|                    dd          z  z   }net          j        || j        | j	        | j        dz  d	
          }| j        r3d|z  dt          j
        || j        | j	        | j        dz            z  z   }|                     |          }|j         d         dk    s|j         d         dk    rt          j        ||          }||                     |          z  S )Nr   )r   r   T)dimkeepdimsg      ?)keepdimr   F)r   r   paddingcount_include_pad)r   r   r@   r   )size)shaper    r   meanr   amaxF
avg_pool2dr'   r(   
max_pool2dr*   interpolater+   )r,   xrC   x_ges       r9   forwardzGatherExcite.forwardF   sF   wrss|;";;q>>DD{avv&4v88# K:affVTf.J.J(JJD|4747DGqLdik k k# y:al1$'Z^Zakokrvwkw.x.x.x(xxDxx~~:b>Q$*R.A"5"5=D111D499T??""r:   )
__name__
__module____qualname____doc__r   ReLUr"   r   rM   __classcell__)r8   s   @r9   r   r      sw          '+qRV!g".Y(1 (1 (1 (1 (1 (1T# # # # # # #r:   r   )rQ   r$   torchr   torch.nn.functional
functionalrG   
create_actr   r   r   helpersr   r*   r	   Moduler    r:   r9   <module>r[      s                     7 7 7 7 7 7 7 7 ( ( ( ( ( ( # # # # # #      A# A# A# A# A#29 A# A# A# A# A#r:   