Ë
    éÓ^jS  ã                   óV  — d Z ddlmZmZmZmZ ddlZddlmZ ddlmc m	Z
 ddlmZ ddlmZmZ ddlmZ  G d	„ d
ej$                  «      Z G d„ de«      Z G d„ dej$                  «      Z G d„ dej$                  «      Z G d„ dej$                  «      Z G d„ dej$                  «      Zy)ak   CBAM (sort-of) Attention

Experimental impl of CBAM: Convolutional Block Attention Module: https://arxiv.org/abs/1807.06521

WARNING: Results with these attention layers have been mixed. They can significantly reduce performance on
some tasks, especially fine-grained it seems. I may end up removing this impl.

Hacked together by / Copyright 2020 Ross Wightman
é    )ÚOptionalÚTupleÚTypeÚUnionN)Únné   )ÚConvNormAct)Úcreate_act_layerÚget_act_layer)Úmake_divisiblec                   ó¬   ‡ — e Zd ZdZdddej
                  ddddfdeded	ee   d
ede	ej                     deee	ej                     f   fˆ fd„Zd„ Zˆ xZS )ÚChannelAttnzT Original CBAM channel attention module, currently avg + max pool variant only.
    ç      °?Nr   ÚsigmoidFÚchannelsÚrd_ratioÚrd_channelsÚ
rd_divisorÚ	act_layerÚ
gate_layerc
                 ó
  •— ||	dœ}
t         ‰| �  «        |st        ||z  |d¬«      }t        j                  ||dfd|i|
¤Ž| _         |d¬«      | _        t        j                  ||dfd|i|
¤Ž| _        t        |«      | _	        y )N©ÚdeviceÚdtypeg        )Úround_limitr   ÚbiasT)Úinplace)
ÚsuperÚ__init__r   r   ÚConv2dÚfc1ÚactÚfc2r
   Úgate)Úselfr   r   r   r   r   r   Úmlp_biasr   r   ÚddÚ	__class__s              €ú[/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/layers/cbam.pyr   zChannelAttn.__init__   s…   ø€ ð ¨Ñ/ˆÜ‰ÑÔÙÜ(¨°HÑ)<¸jÐVXÔYˆKÜ—9‘9˜X {°AÑK¸HÐKÈÑKˆŒÙ TÔ*ˆŒÜ—9‘9˜[¨(°AÑK¸HÐKÈÑKˆŒÜ$ ZÓ0ˆ�	ó    c           
      ó0  — | j                  | j                  | j                  |j                  dd¬«      «      «      «      }| j                  | j                  | j                  |j	                  dd¬«      «      «      «      }|| j                  ||z   «      z  S )N©é   é   T©Úkeepdim)r#   r"   r!   ÚmeanÚamaxr$   )r%   ÚxÚx_avgÚx_maxs       r)   ÚforwardzChannelAttn.forward-   st   € Ø—‘˜Ÿ™ $§(¡(¨1¯6©6°&À$¨6Ó+GÓ"HÓIÓJˆØ—‘˜Ÿ™ $§(¡(¨1¯6©6°&À$¨6Ó+GÓ"HÓIÓJˆØ�4—9‘9˜U U™]Ó+Ñ+Ð+r*   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚReLUÚintÚfloatr   r   ÚModuler   Ústrr   r6   Ú__classcell__©r(   s   @r)   r   r      sˆ   ø„ ñð
 &Ø)-ØØ)+¯©Ø6?ØØØñ1àð1ð ð1ð " #™ð	1ð
 ð1ð ˜BŸI™I‘ð1ð ˜c 4¨¯	©	¡?Ð2Ñ3õ1ö*,r*   r   c                   ó°   ‡ — e Zd ZdZdddej
                  ddddfdeded	ee   d
ede	ej                     deee	ej                     f   defˆ fd„Zd„ Zˆ xZS )ÚLightChannelAttnzAAn experimental 'lightweight' that sums avg + max pool first
    r   Nr   r   Fr   r   r   r   r   r   r&   c
                 ó6   •— t         ‰
| �  |||||||||	¬«	       y )Nr   )r   r   )r%   r   r   r   r   r   r   r&   r   r   r(   s             €r)   r   zLightChannelAttn.__init__6   s.   ø€ ô 	‰ÑØ�h ¨Z¸ÀJÐPXÐagÐotð 	õ 	vr*   c                 óê   — d|j                  dd¬«      z  d|j                  dd¬«      z  z   }| j                  | j                  | j	                  |«      «      «      }|t        j                  |«      z  S )Nç      à?r,   Tr/   )r1   r2   r#   r"   r!   ÚFr   )r%   r3   Úx_poolÚx_attns       r)   r6   zLightChannelAttn.forwardE   se   € Ø�q—v‘v˜f¨d�vÓ3Ñ3°c¸A¿F¹FÀ6ÐSW¸FÓ<XÑ6XÑXˆØ—‘˜$Ÿ(™( 4§8¡8¨FÓ#3Ó4Ó5ˆØ”1—9‘9˜VÓ$Ñ$Ð$r*   )r7   r8   r9   r:   r   r;   r<   r=   r   r   r>   r   r?   Úboolr   r6   r@   rA   s   @r)   rC   rC   3   sš   ø„ ñð
 $Ø)-ØØ)+¯©Ø6?Ø"ØØñvàðvð ðvð " #™ð	vð
 ðvð ˜BŸI™I‘ðvð ˜c 4¨¯	©	¡?Ð2Ñ3ðvð õvö%r*   rC   c                   ó`   ‡ — e Zd ZdZ	 	 	 	 ddedeeeej                     f   fˆ fd„Z
d„ Zˆ xZS )ÚSpatialAttnz, Original CBAM spatial attention module
    Úkernel_sizer   c                 ón   •— t         ‰| �  «        t        dd|d||¬«      | _        t	        |«      | _        y )Nr-   r   F©Ú	apply_actr   r   ©r   r   r	   Úconvr
   r$   ©r%   rM   r   r   r   r(   s        €r)   r   zSpatialAttn.__init__N   ó3   ø€ ô 	‰ÑÔÜ  1 k¸UÈ6ÐY^Ô_ˆŒ	Ü$ ZÓ0ˆ�	r*   c                 óÂ   — t        j                  |j                  dd¬«      |j                  dd¬«      gd¬«      }| j	                  |«      }|| j                  |«      z  S )Nr   T©Údimr0   )rW   )ÚtorchÚcatr1   r2   rR   r$   ©r%   r3   rI   s      r)   r6   zSpatialAttn.forwardY   sT   € Ü—‘˜AŸF™F q°$˜FÓ7¸¿¹ÀAÈt¸Ó9TÐUÐ[\Ô]ˆØ—‘˜6Ó"ˆØ�4—9‘9˜VÓ$Ñ$Ð$r*   ©é   r   NN©r7   r8   r9   r:   r<   r   r?   r   r   r>   r   r6   r@   rA   s   @r)   rL   rL   K   óD   ø„ ñð  !Ø6?ØØñ	1àð	1ð ˜c 4¨¯	©	¡?Ð2Ñ3õ	1ö%r*   rL   c                   ó`   ‡ — e Zd ZdZ	 	 	 	 ddedeeeej                     f   fˆ fd„Z
d„ Zˆ xZS )ÚLightSpatialAttnzSAn experimental 'lightweight' variant that sums avg_pool and max_pool results.
    rM   r   c                 ón   •— t         ‰| �  «        t        dd|d||¬«      | _        t	        |«      | _        y )Nr   FrO   rQ   rS   s        €r)   r   zLightSpatialAttn.__init__b   rT   r*   c                 ó¦   — d|j                  dd¬«      z  d|j                  dd¬«      z  z   }| j                  |«      }|| j                  |«      z  S )NrF   r   TrV   )r1   r2   rR   r$   rZ   s      r)   r6   zLightSpatialAttn.forwardm   sS   € Ø�q—v‘v !¨T�vÓ2Ñ2°S¸1¿6¹6ÀaÐQU¸6Ó;VÑ5VÑVˆØ—‘˜6Ó"ˆØ�4—9‘9˜VÓ$Ñ$Ð$r*   r[   r]   rA   s   @r)   r`   r`   _   r^   r*   r`   c                   ó²   ‡ — e Zd Zddddej                  d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   defˆ fd„Zd„ Zˆ xZS )Ú
CbamModuler   Nr   r\   r   Fr   r   r   r   Úspatial_kernel_sizer   r   r&   c           
      ó‚   •— |	|
dœ}t         ‰| �  «        t        |f||||||dœ|¤Ž| _        t	        |fd|i|¤Ž| _        y )Nr   ©r   r   r   r   r   r&   r   )r   r   r   ÚchannelrL   Úspatial©r%   r   r   r   r   re   r   r   r&   r   r   r'   r(   s               €r)   r   zCbamModule.__init__t   sd   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ"Øð	
àØ#Ø!ØØ!Øñ	
ð ñ	
ˆŒô #Ð#6ÑTÀ:ÐTÐQSÑTˆ�r*   c                 óJ   — | j                  |«      }| j                  |«      }|S ©N©rh   ri   ©r%   r3   s     r)   r6   zCbamModule.forward�   ó!   € Ø�L‰L˜‹OˆØ�L‰L˜‹OˆØˆr*   ©r7   r8   r9   r   r;   r<   r=   r   r   r>   r   r?   rJ   r   r6   r@   rA   s   @r)   rd   rd   s   s£   ø„ ð $Ø)-ØØ'(Ø)+¯©Ø6?Ø"ØØñUàðUð ðUð " #™ð	Uð
 ðUð "%ðUð ˜BŸI™I‘ðUð ˜c 4¨¯	©	¡?Ð2Ñ3ðUð õUö6r*   rd   c                   ó²   ‡ — e Zd Zddddej                  d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   defˆ fd„Zd„ Zˆ xZS )ÚLightCbamModuler   Nr   r\   r   Fr   r   r   r   re   r   r   r&   c           
      ó~   •— |	|
dœ}t         ‰| �  «        t        |f||||||dœ|¤Ž| _        t	        |fi |¤Ž| _        y )Nr   rg   )r   r   rC   rh   r`   ri   rj   s               €r)   r   zLightCbamModule.__init__–   s^   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ'Øð	
àØ#Ø!ØØ!Øñ	
ð ñ	
ˆŒô (Ð(;ÑB¸rÑBˆ�r*   c                 óJ   — | j                  |«      }| j                  |«      }|S rl   rm   rn   s     r)   r6   zLightCbamModule.forward±   ro   r*   rp   rA   s   @r)   rr   rr   •   s£   ø„ ð $Ø)-ØØ'(Ø)+¯©Ø6?Ø"ØØñCàðCð ðCð " #™ð	Cð
 ðCð "%ðCð ˜BŸI™I‘ðCð ˜c 4¨¯	©	¡?Ð2Ñ3ðCð õCö6r*   rr   )r:   Útypingr   r   r   r   rX   r   Útorch.nn.functionalÚ
functionalrG   Úconv_bn_actr	   Ú
create_actr
   r   Úhelpersr   r>   r   rC   rL   r`   rd   rr   © r*   r)   ú<module>r|      s„   ðñ÷ 0Ó /ã Ý ß Ð å $ß 7Ý #ô,�"—)‘)ô ,ô<%�{ô %ô0%�"—)‘)ô %ô(%�r—y‘yô %ô(�—‘ô ôD�b—i‘iõ r*   