
    ^jX                         d Z ddlmZmZ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eZ G d	 d
ej                        ZeZ G d dej                        Zy)a   Squeeze-and-Excitation Channel Attention

An SE implementation originally based on PyTorch SE-Net impl.
Has since evolved with additional functionality / configuration.

Paper: `Squeeze-and-Excitation Networks` - https://arxiv.org/abs/1709.01507

Also included is Effective Squeeze-Excitation (ESE).
Paper: `CenterMask : Real-Time Anchor-Free Instance Segmentation` - https://arxiv.org/abs/1911.06667

Hacked together by / Copyright 2021 Ross Wightman
    )OptionalTupleTypeUnion)nn   )create_act_layer)make_divisiblec                        e Zd ZdZdddddej
                  ddddf
ded	ed
ee   dede	de	de
ej                     dee
ej                        deee
ej                     f   f fdZd Z xZS )SEModule   SE Module as defined in original SE-Nets with a few additions
    Additions include:
        * divisor can be specified to keep channels % div == 0 (default: 8)
        * reduction channels can be specified directly by arg (if rd_channels is set)
        * reduction channels can be specified by float rd_ratio (default: 1/16)
        * global max pooling can be added to the squeeze aggregation
        * customizable activation, normalization, and gate layer
          ?N   FTsigmoidchannelsrd_ratiord_channels
rd_divisoradd_maxpoolbias	act_layer
norm_layer
gate_layerc                 h   |
|d}t         |           || _        |st        ||z  |d      }t	        j
                  ||fd|d|| _        |r	 ||fi |nt	        j                         | _        t        |d      | _
        t	        j
                  ||fd|d|| _        t        |	      | _        y )Ndevicedtype        round_limitr   )kernel_sizer   Tinplace)super__init__r   r
   r   Conv2dfc1Identitybnr	   actfc2gate)selfr   r   r   r   r   r   r   r   r   r   r   dd	__class__s                e/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/squeeze_excite.pyr%   zSEModule.__init__   s     /&(H)<jVXYK99X{SSPRS3=*[/B/2;;=#It<99[(SSPRS$Z0	    c                 $   |j                  dd      }| j                  rd|z  d|j                  dd      z  z   }| j                  |      }| j	                  | j                  |            }| j                  |      }|| j                  |      z  S N)      T)keepdimg      ?)meanr   amaxr'   r*   r)   r+   r,   r-   xx_ses      r0   forwardzSEModule.forward7   s    vvfdv+:affVTf&B BBDxx~xx&xx~499T?""r1   __name__
__module____qualname____doc__r   ReLUintfloatr   boolr   Moduler   strr%   r<   __classcell__r/   s   @r0   r   r      s     &)- %)+486?11 1 "#	1
 1 1 1 BII1 !bii11 c4		?2312#r1   r   c            
       d     e Zd ZdZ	 	 	 	 ddededeeee	j                     f   f fdZd Z xZS )EffectiveSEModulez 'Effective Squeeze-Excitation
    From `CenterMask : Real-Time Anchor-Free Instance Segmentation` - https://arxiv.org/abs/1911.06667
    r   r   r   c                     ||d}t         |           || _        t        j                  ||dd||      | _        t        |      | _        y )Nr   r   r   )r!   paddingr   r   )r$   r%   r   r   r&   fcr	   r,   )	r-   r   r   r   r   r   _r.   r/   s	           r0   r%   zEffectiveSEModule.__init__I   sJ     /&))HhAqQW_de$Z0	r1   c                     |j                  dd      }| j                  rd|z  d|j                  dd      z  z   }| j                  |      }|| j	                  |      z  S r3   )r7   r   r8   rN   r,   r9   s      r0   r<   zEffectiveSEModule.forwardX   s]    vvfdv+:affVTf&B BBDwwt}499T?""r1   )Fhard_sigmoidNN)r>   r?   r@   rA   rC   rE   r   rG   r   r   rF   r%   r<   rH   rI   s   @r0   rK   rK   E   sN     !&6D11 1 c4		?23	1#r1   rK   c                        e Zd ZdZddddej
                  dddfdeded	ee   d
ede	de
ej                     deee
ej                     f   f fdZd Z xZS )SqueezeExciteClr   r   Nr   Tr   r   r   r   r   r   r   r   c
                    ||	d}
t         |           |st        ||z  |d      }t        j                  ||fd|i|
| _        t        |d      | _        t        j                  ||fd|i|
| _        t        |      | _	        y )Nr   r   r   r   Tr"   )
r$   r%   r
   r   Linearr'   r	   r*   r+   r,   )r-   r   r   r   r   r   r   r   r   r   r.   r/   s              r0   r%   zSqueezeExciteCl.__init__m   s     /(H)<jVXYK99X{DDD#It<99[(DDD$Z0	r1   c                     |j                  dd      }| j                  |      }| j                  |      }| j                  |      }|| j	                  |      z  S )N)r   r4   T)keepdims)r7   r'   r*   r+   r,   r9   s      r0   r<   zSqueezeExciteCl.forward   sN    vvftv,xx~xx~xx~499T?""r1   r=   rI   s   @r0   rS   rS   d   s     &)-)+6?11 1 "#	1
 1 1 BII1 c4		?231*#r1   rS   N)rA   typingr   r   r   r   torchr   
create_actr	   helpersr
   rF   r   SqueezeExciterK   EffectiveSqueezeExciterS    r1   r0   <module>r_      s[    0 /  ( #*#ryy *#Z #		 #8 + ##bii ##r1   