
    kh                         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y)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                   h     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                 V   t         t        |           |	| _        t	        |
      }
|| _        |rWt        j                         | _        |dk(  rg|J d       | j                  j                  dt        |||dd             |rZ| j                  j                  dt        j                  |             n)|dz  dk(  sJ t        t        j                  |            }t        |      D ]  }| j                  j                  d	|dz    t        ||d
dd             |r5| j                  j                  d|dz    t        j                  |             ||dz
  k7  ss| j                  j                  d|dz     |
d              nWd | _        | j
                  dk(  rd| _        d| _        n2|dz  dk(  sJ | j
                  dz  dz
  | _        | j
                  | _        |st%        ||z  |d      }|rt'        |||
      nt        j(                         | _        t-        |      | _        y )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/teggl/fontify/venv/lib/python3.12/site-packages/timm/layers/gather_excite.pyr   zGatherExcite.__init__   s    	lD*,&!),	--/DK{ ,r.rr,&&]8X9]^jnoqKK**UR^^H5MNzQ&tyy01x WAKK**q1ug%haPQ]abd "..a!eW~r~~h?WXHqL(..QUG}iPT>UVW DK{{azQ&++/A-++(H)<jVXYKJQ78[IFWYWbWbWd$Z0	    c           	         |j                   dd  }| j                  | j                  |      }n| j                  dk(  r<|j                  dd      }| j                  rd|z  d|j                  dd      z  z   }nt        j                  || j                  | j                  | j                  dz  d	
      }| j                  rCd|z  dt        j                  || j                  | j                  | j                  dz        z  z   }| j                  |      }|j                   d   dk7  s|j                   d   dk7  rt        j                  ||      }|| 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   s,   wwrs|;;";;q>D{{avv&4v8##:affVTf.J(JJD||477477DGGqLdik##:all1$''Z^ZaZakokrkrvwkw.x(xxDxx~::b>Q$**R.A"5==D1D499T?""r:   )
__name__
__module____qualname____doc__r   ReLUr"   r   rM   __classcell__)r8   s   @r9   r   r      s7     '+qRV!gg"..Y(1T#r:   r   )rQ   r$   torchr   torch.nn.functional
functionalrG   
create_actr   r   r   helpersr   r*   r	   Moduler    r:   r9   <module>r[      s6        7 ( # A#299 A#r:   