o
    پiJ                     @   s   d Z ddlZddlmZ ddlm  mZ ddlmZ ddlm	Z	m
Z
 ddlmZ G dd	 d	ejZG d
d deZG dd dejZG dd dejZG dd dejZG dd dejZdS )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                       8   e Zd ZdZdddejddf fdd	Zd	d
 Z  ZS )ChannelAttnzT Original CBAM channel attention module, currently avg + max pool variant only.
          ?Nr   sigmoidFc                    sf   t t|   |st|| |dd}tj||d|d| _|dd| _tj||d|d| _t	|| _
d S )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__ D/home/ubuntu/.local/lib/python3.10/site-packages/timm/layers/cbam.pyr      s   zChannelAttn.__init__c              
   C   sR   |  | | |jddd}|  | | |jddd}|| ||  S )N      Tkeepdim)r   r   r   meanamaxr   )r   xx_avgx_maxr!   r!   r"   forward!   s     zChannelAttn.forward	__name__
__module____qualname____doc__r   ReLUr   r-   __classcell__r!   r!   r   r"   r	      s    r	   c                       r   )LightChannelAttnzAAn experimental 'lightweight' that sums avg + max pool first
    r
   Nr   r   Fc              	      s    t t| ||||||| d S N)r   r5   r   r   r   r!   r"   r   *   s   
zLightChannelAttn.__init__c                 C   sH   d|j ddd d|jddd  }| | | |}|t| S )N      ?r#   Tr&   )r(   r)   r   r   r   Fr   )r   r*   x_poolx_attnr!   r!   r"   r-   0   s   $zLightChannelAttn.forwardr.   r!   r!   r   r"   r5   '   s    r5   c                       *   e Zd ZdZd fdd	Zdd Z  ZS )	SpatialAttnz, Original CBAM spatial attention module
       r   c                    s.   t t|   tdd|dd| _t|| _d S )Nr$   r   F	apply_act)r   r<   r   r   convr   r   r   kernel_sizer   r   r!   r"   r   9      zSpatialAttn.__init__c                 C   s>   t j|jddd|jdddgdd}| |}|| | S )Nr   Tdimr'   )rE   )torchcatr(   r)   r@   r   r   r*   r:   r!   r!   r"   r-   >   s   &
zSpatialAttn.forwardr=   r   r/   r0   r1   r2   r   r-   r4   r!   r!   r   r"   r<   6       r<   c                       r;   )	LightSpatialAttnzSAn experimental 'lightweight' variant that sums avg_pool and max_pool results.
    r=   r   c                    s.   t t|   tdd|dd| _t|| _d S )Nr   Fr>   )r   rL   r   r   r@   r   r   rA   r   r!   r"   r   G   rC   zLightSpatialAttn.__init__c                 C   s<   d|j ddd d|jddd  }| |}|| | S )Nr7   r   TrD   )r(   r)   r@   r   rH   r!   r!   r"   r-   L   s   $
zLightSpatialAttn.forwardrI   rJ   r!   r!   r   r"   rL   D   rK   rL   c                       6   e Zd Zddddejddf fdd	Zd	d
 Z  ZS )
CbamModuler
   Nr   r=   r   Fc	           	   	      s8   t t|   t|||||||d| _t||d| _d S )Nr   r   r   r   r   r   )r   )r   rN   r   r	   channelr<   spatial	r   r   r   r   r   spatial_kernel_sizer   r   r   r   r!   r"   r   S   s   zCbamModule.__init__c                 C      |  |}| |}|S r6   rP   rQ   r   r*   r!   r!   r"   r-   \      

zCbamModule.forwardr/   r0   r1   r   r3   r   r-   r4   r!   r!   r   r"   rN   R   
    
	rN   c                       rM   )LightCbamModuler
   Nr   r=   r   Fc	           	   	      s4   t t|   t|||||||d| _t|| _d S )NrO   )r   rZ   r   r5   rP   rL   rQ   rR   r   r!   r"   r   c   s   zLightCbamModule.__init__c                 C   rT   r6   rU   rV   r!   r!   r"   r-   l   rW   zLightCbamModule.forwardrX   r!   r!   r   r"   rZ   b   rY   rZ   )r2   rF   r   torch.nn.functional
functionalr8   conv_bn_actr   
create_actr   r   helpersr   Moduler	   r5   r<   rL   rN   rZ   r!   r!   r!   r"   <module>   s    	