
    khJ                     >   d 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
    N)nn   )ConvNormAct)create_act_layerget_act_layer)make_divisiblec                   J     e Zd ZdZdddej
                  ddf fd	Zd Z xZS )	ChannelAttnzT Original CBAM channel attention module, currently avg + max pool variant only.
          ?Nr   sigmoidFc                    t         t        |           |st        ||z  |d      }t	        j
                  ||d|      | _         |d      | _        t	        j
                  ||d|      | _        t        |      | _
        y )Ng        )round_limitr   )biasT)inplace)superr
   __init__r   r   Conv2dfc1actfc2r   gate	selfchannelsrd_ratiord_channels
rd_divisor	act_layer
gate_layermlp_bias	__class__s	           L/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/layers/cbam.pyr   zChannelAttn.__init__   sm     	k4)+(H)<jVXYK99X{AHET*99[(AHE$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   ReLUr   r/   __classcell__r!   s   @r"   r
   r
      s&     &+gg)e	1,r#   r
   c                   J     e Zd ZdZdddej
                  ddf fd	Zd Z xZS )	LightChannelAttnzAAn experimental 'lightweight' that sums avg + max pool first
    r   Nr   r   Fc           	      8    t         t        |   |||||||       y N)r   r9   r   r   s	           r"   r   zLightChannelAttn.__init__*   s&     	.hZJPX	Zr#   c                     d|j                  dd      z  d|j                  dd      z  z   }| j                  | j                  | j	                  |                  }|t        j                  |      z  S )N      ?r%   Tr(   )r*   r+   r   r   r   Fr   )r   r,   x_poolx_attns       r"   r/   zLightChannelAttn.forward0   se    qvvfdv33cAFF6SWF<X6XX$((488F#345199V$$$r#   r0   r7   s   @r"   r9   r9   '   s'     &+gg)eZ%r#   r9   c                   *     e Zd ZdZd fd	Zd Z xZS )SpatialAttnz, Original CBAM spatial attention module
    c                 r    t         t        |           t        dd|d      | _        t        |      | _        y )Nr&   r   F	apply_act)r   rB   r   r   convr   r   r   kernel_sizer   r!   s      r"   r   zSpatialAttn.__init__9   s.    k4)+1kUC	$Z0	r#   c                     t        j                  |j                  dd      |j                  dd      gd      }| j	                  |      }|| j                  |      z  S )Nr   Tdimr)   )rK   )torchcatr*   r+   rF   r   r   r,   r@   s      r"   r/   zSpatialAttn.forward>   sT    AFFq$F7At9TU[\]6"499V$$$r#      r   r1   r2   r3   r4   r   r/   r6   r7   s   @r"   rB   rB   6       1
%r#   rB   c                   *     e Zd ZdZd fd	Zd Z xZS )LightSpatialAttnzSAn experimental 'lightweight' variant that sums avg_pool and max_pool results.
    c                 r    t         t        |           t        dd|d      | _        t        |      | _        y )Nr   FrD   )r   rT   r   r   rF   r   r   rG   s      r"   r   zLightSpatialAttn.__init__G   s/    .01kUC	$Z0	r#   c                     d|j                  dd      z  d|j                  dd      z  z   }| j                  |      }|| j                  |      z  S )Nr=   r   TrJ   )r*   r+   rF   r   rN   s      r"   r/   zLightSpatialAttn.forwardL   sS    qvv!Tv22S166aQU6;V5VV6"499V$$$r#   rO   rQ   r7   s   @r"   rT   rT   D   rR   r#   rT   c                   H     e Zd Zddddej                  ddf fd	Zd Z xZS )	
CbamModuler   Nr   rP   r   Fc	           	      |    t         t        |           t        |||||||      | _        t        ||      | _        y )Nr   r   r   r   r   r    )r   )r   rX   r   r
   channelrB   spatial
r   r   r   r   r   spatial_kernel_sizer   r   r    r!   s
            r"   r   zCbamModule.__init__S   sA     	j$(*"x[!Y:X`b ##6:Nr#   c                 J    | j                  |      }| j                  |      }|S r;   r[   r\   r   r,   s     r"   r/   zCbamModule.forward\   !    LLOLLOr#   r1   r2   r3   r   r5   r   r/   r6   r7   s   @r"   rX   rX   R   s#    %* !RWWUZOr#   rX   c                   H     e Zd Zddddej                  ddf fd	Zd Z xZS )	LightCbamModuler   Nr   rP   r   Fc	           	      x    t         t        |           t        |||||||      | _        t        |      | _        y )NrZ   )r   re   r   r9   r[   rT   r\   r]   s
            r"   r   zLightCbamModule.__init__c   s?     	ot-/'x[!Y:X`b ((;<r#   c                 J    | j                  |      }| j                  |      }|S r;   r`   ra   s     r"   r/   zLightCbamModule.forwardl   rb   r#   rc   r7   s   @r"   re   re   b   s"    %* !RWWUZ=r#   re   )r4   rL   r   torch.nn.functional
functionalr>   conv_bn_actr   
create_actr   r   helpersr   Moduler
   r9   rB   rT   rX   re    r#   r"   <module>ro      s}        $ 7 #,")) ,(%{ %%")) %%ryy %  bii r#   