o
    ™ÄŽiy  ã                   @   s¬   d Z ddlZddlmZ ddlm  m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G dd„ dejƒZG dd„ dejƒZG dd„ dejƒZdS )z
Activation functions
é    Nc                   @   ó   e Zd Zedd„ ƒZdS )ÚSiLUc                 C   s   | t  | ¡ S ©N)ÚtorchÚsigmoid©Úx© r	   úT/home/jeff/fluffinator/venv/lib/python3.10/site-packages/yolov5/utils/activations.pyÚforward   s   zSiLU.forwardN©Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr   r	   r	   r	   r
   r      ó    r   c                   @   r   )Ú	Hardswishc                 C   s   | t  | d dd¡ d S )Né   g        g      @)ÚFÚhardtanhr   r	   r	   r
   r      s   zHardswish.forwardNr   r	   r	   r	   r
   r      r   r   c                   @   r   )ÚMishc                 C   s   | t  | ¡ ¡  S r   )r   ÚsoftplusÚtanhr   r	   r	   r
   r      s   zMish.forwardNr   r	   r	   r	   r
   r      r   r   c                   @   s(   e Zd ZG dd„ dejjƒZdd„ ZdS )ÚMemoryEfficientMishc                   @   s$   e Zd Zedd„ ƒZedd„ ƒZdS )zMemoryEfficientMish.Fc                 C   s    |   |¡ | t t |¡¡¡S r   )Úsave_for_backwardÚmulr   r   r   r   )Úctxr   r	   r	   r
   r   %   s   
zMemoryEfficientMish.F.forwardc                 C   s>   | j d }t |¡}t |¡ ¡ }|||| d||     S )Nr   é   )Úsaved_tensorsr   r   r   r   r   )r   Úgrad_outputr   ÚsxÚfxr	   r	   r
   Úbackward*   s   

zMemoryEfficientMish.F.backwardN)r   r   r   r   r   r"   r	   r	   r	   r
   r   #   s
    
r   c                 C   s   | j  |¡S r   )r   Úapply©Úselfr   r	   r	   r
   r   1   s   zMemoryEfficientMish.forwardN)r   r   r   r   ÚautogradÚFunctionr   r   r	   r	   r	   r
   r   !   s    r   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚFReLUr   c              	      s4   t ƒ  ¡  tj|||dd|dd| _t |¡| _d S )Nr   F)ÚgroupsÚbias)ÚsuperÚ__init__ÚnnÚConv2dÚconvÚBatchNorm2dÚbn)r%   Úc1Úk©Ú	__class__r	   r
   r,   7   s   
zFReLU.__init__c                 C   s   t  ||  |  |¡¡¡S r   )r   Úmaxr1   r/   r$   r	   r	   r
   r   <   s   zFReLU.forward)r   )r   r   r   r,   r   Ú__classcell__r	   r	   r4   r
   r(   5   s    r(   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚAconCzë ACON activation (activate or not)
    AconC: (p1*x-p2*x) * sigmoid(beta*(p1*x-p2*x)) + p2*x, beta is a learnable parameter
    according to "Activate or Not: Learning Customized Activation" <https://arxiv.org/pdf/2009.04759.pdf>.
    c                    sV   t ƒ  ¡  t t d|dd¡¡| _t t d|dd¡¡| _t t d|dd¡¡| _	d S )Nr   )
r+   r,   r-   Ú	Parameterr   ÚrandnÚp1Úp2ÚonesÚbeta)r%   r2   r4   r	   r
   r,   F   s   
zAconC.__init__c                 C   s.   | j | j | }|t | j| ¡ | j|  S r   )r;   r<   r   r   r>   )r%   r   Údpxr	   r	   r
   r   L   s   zAconC.forward©r   r   r   Ú__doc__r,   r   r7   r	   r	   r4   r
   r8   @   s    r8   c                       s*   e Zd ZdZd‡ fdd„	Zdd„ Z‡  ZS )	Ú	MetaAconCzö ACON activation (activate or not)
    MetaAconC: (p1*x-p2*x) * sigmoid(beta*(p1*x-p2*x)) + p2*x, beta is generated by a small network
    according to "Activate or Not: Learning Customized Activation" <https://arxiv.org/pdf/2009.04759.pdf>.
    r   é   c                    sx   t ƒ  ¡  t||| ƒ}t t d|dd¡¡| _t t d|dd¡¡| _tj	||||dd| _
tj	||||dd| _d S )Nr   T)r*   )r+   r,   r6   r-   r9   r   r:   r;   r<   r.   Úfc1Úfc2)r%   r2   r3   ÚsÚrÚc2r4   r	   r
   r,   W   s   
zMetaAconC.__init__c                 C   sZ   |j dddj ddd}t |  |  |¡¡¡}| j| j | }|t || ¡ | j|  S )Né   T)ÚdimÚkeepdimsr   )Úmeanr   r   rE   rD   r;   r<   )r%   r   Úyr>   r?   r	   r	   r
   r   a   s   zMetaAconC.forward)r   r   rC   r@   r	   r	   r4   r
   rB   Q   s    
rB   )rA   r   Útorch.nnr-   Útorch.nn.functionalÚ
functionalr   ÚModuler   r   r   r   r(   r8   rB   r	   r	   r	   r
   Ú<module>   s   