a
    dJ                     @   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__ Y/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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   	