Ë
    éÓ^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Ñ)<¸jÐVXÔYˆKÜ—9‘9˜X {ÐSÀÈÑSÐPRÑSˆŒÙ3=‘*˜[Ñ/¨BÒ/Ä2Ç;Á;Ã=ˆŒÜ# I°tÔ<ˆŒÜ—9‘9˜[¨(ÐSÀÈÑSÐPRÑ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€   € Ø�v‰v�f dˆvÓ+ˆØ×Òà˜‘:  a§f¡f¨V¸T fÓ&BÑ BÑBˆDØ�x‰x˜‹~ˆØ�x‰x˜Ÿ™ ›Ó&ˆØ�x‰x˜‹~ˆØ�4—9‘9˜T“?Ñ"Ð"r1   ©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚReLUÚintÚfloatr   Úboolr   ÚModuler   Ústrr%   r<   Ú__classcell__©r/   s   @r0   r   r      s¹   ø„ ñð &Ø)-ØØ %ØØ)+¯©Ø48Ø6?ØØñ1àð1ð ð1ð " #™ð	1ð
 ð1ð ð1ð ð1ð ˜BŸI™I‘ð1ð !  b§i¡i¡Ñ1ð1ð ˜c 4¨¯	©	¡?Ð2Ñ3õ1ö2#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   ø€ ð ¨Ñ/ˆÜ‰ÑÔØ&ˆÔÜ—)‘)˜H h¸AÀqÐQWÐ_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]   € Ø�v‰v�f dˆvÓ+ˆØ×Òà˜‘:  a§f¡f¨V¸T fÓ&BÑ BÑBˆDØ�w‰w�t‹}ˆØ�4—9‘9˜T“?Ñ"Ð"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ð ˜c 4¨¯	©	¡?Ð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Ñ)<¸jÐVXÔYˆKÜ—9‘9˜X {ÑD¸ÐDÀÑDˆŒÜ# I°tÔ<ˆŒÜ—9‘9˜[¨(Ñ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   € Ø�v‰v�f tˆvÓ,ˆØ�x‰x˜‹~ˆØ�x‰x˜‹~ˆØ�x‰x˜‹~ˆØ�4—9‘9˜T“?Ñ"Ð"r1   r=   rI   s   @r0   rS   rS   d   s’   ø„ ñð &Ø)-ØØØ)+¯©Ø6?ØØñ1àð1ð ð1ð " #™ð	1ð
 ð1ð ð1ð ˜BŸI™I‘ð1ð ˜c 4¨¯	©	¡?Ð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Ó /å å (Ý #ô*#ˆr�y‰yô *#ðZ €ô#˜Ÿ	™	ô #ð8 +Ð ô##�b—i‘iõ ##r1   