U
    ¯Ê¹jy  ã                   @   sR   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	dS )z_ Cross Entropy w/ smoothing or soft targets

Hacked together by / Copyright 2021 Ross Wightman
é    Nc                       s:   e Zd ZdZd‡ fdd„	Zejejejdœdd„Z‡  ZS )	ÚLabelSmoothingCrossEntropyz$ NLL loss with label smoothing.
    çš™™™™™¹?c                    s.   t t| ƒ ¡  |dk st‚|| _d| | _d S )Ng      ð?)Úsuperr   Ú__init__ÚAssertionErrorÚ	smoothingÚ
confidence)Úselfr   ©Ú	__class__© úV/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/loss/cross_entropy.pyr      s    z#LabelSmoothingCrossEntropy.__init__©ÚxÚtargetÚreturnc                 C   sX   t j|dd�}|jd| d¡d� }| d¡}|jdd� }| j| | j|  }| ¡ S )Néÿÿÿÿ©Údimé   )r   Úindex)ÚFÚlog_softmaxZgatherZ	unsqueezeZsqueezeÚmeanr   r   )r	   r   r   ZlogprobsZnll_lossZsmooth_lossÚlossr   r   r   Úforward   s    
z"LabelSmoothingCrossEntropy.forward)r   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚtorchÚTensorr   Ú__classcell__r   r   r
   r   r      s   r   c                       s4   e Zd Z‡ fdd„Zejejejdœdd„Z‡  ZS )ÚSoftTargetCrossEntropyc                    s   t t| ƒ ¡  d S )N)r   r#   r   )r	   r
   r   r   r      s    zSoftTargetCrossEntropy.__init__r   c                 C   s&   t j| tj|dd� dd�}| ¡ S )Nr   r   )r    Úsumr   r   r   )r	   r   r   r   r   r   r   r   "   s    zSoftTargetCrossEntropy.forward)r   r   r   r   r    r!   r   r"   r   r   r
   r   r#      s   r#   )
r   r    Ztorch.nnÚnnZtorch.nn.functionalZ
functionalr   ÚModuler   r#   r   r   r   r   Ú<module>   s
   