U
    HÉcÁ  ã                   @   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                   @   s   e Zd Zedd„ ƒZdS )ÚSiLUc                 C   s   | t  | ¡ S ©N)ÚtorchÚsigmoid©Úx© r   úG/var/www/html/VideoAnalyticsDashboard/src/./yolov5/utils/activations.pyÚforward   s    zSiLU.forwardN©Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr
   r   r   r   r	   r      s   r   c                   @   s   e Zd Zedd„ ƒZdS )Ú	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      s   r   c                   @   s   e Zd Zedd„ ƒZdS )ÚMishc                 C   s   | t  | ¡ ¡  S r   )r   ÚsoftplusÚtanhr   r   r   r	   r
      s    zMish.forwardNr   r   r   r   r	   r      s   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
   .   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*   4   s    
zFReLU.__init__c                 C   s   t  ||  |  |¡¡¡S r   )r   Úmaxr/   r-   r"   r   r   r	   r
   9   s    zFReLU.forward)r   )r   r   r   r*   r
   Ú__classcell__r   r   r2   r	   r&   3   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#   r0   r2   r   r	   r*   D   s    
zAconC.__init__c                 C   s.   | j | j | }|t | j| ¡ | j|  S r   )r9   r:   r   r   r<   )r#   r   Údpxr   r   r	   r
   J   s    zAconC.forward©r   r   r   Ú__doc__r*   r
   r5   r   r   r2   r	   r6   >   s   r6   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*   r4   r+   r7   r   r8   r9   r:   r,   Úfc1Úfc2)r#   r0   r1   ÚsÚrÚc2r2   r   r	   r*   U   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   rC   rB   r9   r:   )r#   r   Úyr<   r=   r   r   r	   r
   _   s    zMetaAconC.forward)r   r   rA   r>   r   r   r2   r	   r@   O   s   
r@   )r?   r   Útorch.nnr+   Ztorch.nn.functionalÚ
functionalr   ÚModuler   r   r   r   r&   r6   r@   r   r   r   r	   Ú<module>   s   