
    ^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)<jVXYK99X{AKHKKT*99[(AKH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    $((166&$6+G"HIJ$((166&$6+G"HIJ499UU]+++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 BII1 c4		?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JPXagot 	 	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    qvvfdv33cAFF6SWF<X6XX$((488F#345199V$$$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 BIIv c4		?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     	1kU6Y^_	$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    AFFq$F7At9TU[\]6"499V$$$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 c4		?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    qvv!Tv22S166aQU6;V5VV6"499V$$$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:TQSTr*   c                 J    | j                  |      }| j                  |      }|S Nrh   ri   r%   r3   s     r)   r6   zCbamModule.forward   !    LLOLL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 BIIU c4		?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^     /'	
#!!	
 	
 ((;Br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 BIIC c4		?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%")) %(%ryy %( Dbii r*   