U
    ¯Ê¹jJ  ã                   @   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                       s8   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        )Zround_limitr   )ZbiasT)Zinplace)Úsuperr   Ú__init__r   r   ZConv2dÚfc1ÚactÚfc2r   Úgate©ÚselfÚchannelsÚrd_ratioÚrd_channelsÚ
rd_divisorÚ	act_layerÚ
gate_layerÚmlp_bias©Ú	__class__© úO/var/www/html/bwave/python/venv/lib/python3.8/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   ÚxZx_avgZ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                       s8   e Zd ZdZdddejddf‡ fdd„	Zd	d
„ Z‡  ZS )ÚLightChannelAttnzAAn experimental 'lightweight' that sums avg + max pool first
    r	   Nr   r
   Fc              	      s    t t| ƒ |||||||¡ d S ©N)r   r.   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%   Zx_poolÚx_attnr   r   r   r&   0   s    $zLightChannelAttn.forwardr'   r   r   r   r   r.   '   s       þr.   c                       s*   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©Z	apply_act)r   r3   r   r   Úconvr   r   ©r   Zkernel_sizer   r   r   r   r   9   s    zSpatialAttn.__init__c                 C   s>   t j|jddd�|jddd�gdd�}|  |¡}||  |¡ S )Nr   T©Údimr"   )r9   )ÚtorchÚcatr#   r$   r6   r   ©r   r%   r2   r   r   r   r&   >   s    &
zSpatialAttn.forward)r4   r
   ©r(   r)   r*   r+   r   r&   r-   r   r   r   r   r3   6   s   r3   c                       s*   e Zd ZdZd‡ fdd„	Zdd„ Z‡  ZS )	ÚLightSpatialAttnzSAn experimental 'lightweight' variant that sums avg_pool and max_pool results.
    r4   r
   c                    s.   t t| ƒ ¡  tdd|dd�| _t|ƒ| _d S )Nr   Fr5   )r   r>   r   r   r6   r   r   r7   r   r   r   r   G   s    zLightSpatialAttn.__init__c                 C   s<   d|j ddd� d|jddd�  }|  |¡}||  |¡ S )Nr0   r   Tr8   )r#   r$   r6   r   r<   r   r   r   r&   L   s    $
zLightSpatialAttn.forward)r4   r
   r=   r   r   r   r   r>   D   s   r>   c                       s6   e Zd Zddddejddf‡ fdd„	Zd	d
„ Z‡  ZS )Ú
CbamModuler	   Nr   r4   r
   Fc	           	   	      s8   t t| ƒ ¡  t|||||||d�| _t||d�| _d S )N©r   r   r   r   r   r   )r   )r   r?   r   r   Úchannelr3   Úspatial©	r   r   r   r   r   Zspatial_kernel_sizer   r   r   r   r   r   r   S   s         þzCbamModule.__init__c                 C   s   |   |¡}|  |¡}|S r/   ©rA   rB   ©r   r%   r   r   r   r&   \   s    

zCbamModule.forward©r(   r)   r*   r   r,   r   r&   r-   r   r   r   r   r?   R   s        þ	r?   c                       s6   e Zd Zddddejddf‡ fdd„	Zd	d
„ Z‡  ZS )ÚLightCbamModuler	   Nr   r4   r
   Fc	           	   	      s4   t t| ƒ ¡  t|||||||d�| _t|ƒ| _d S )Nr@   )r   rG   r   r.   rA   r>   rB   rC   r   r   r   r   c   s         þzLightCbamModule.__init__c                 C   s   |   |¡}|  |¡}|S r/   rD   rE   r   r   r   r&   l   s    

zLightCbamModule.forwardrF   r   r   r   r   rG   b   s        þ	rG   )r+   r:   r   Ztorch.nn.functionalZ
functionalr1   Zconv_bn_actr   Z
create_actr   r   Zhelpersr   ÚModuler   r.   r3   r>   r?   rG   r   r   r   r   Ú<module>   s   	