U
    ¯Ê¹j;  ã                   @   sH   d dl Z d dlmZ d dlm  mZ ddlmZ G dd„ dejƒZ	dS )é    Né   )ÚLabelSmoothingCrossEntropyc                       s*   e Zd ZdZd	‡ fdd„	Zdd„ Z‡  ZS )
ÚJsdCrossEntropyaL   Jensen-Shannon Divergence + Cross-Entropy Loss

    Based on impl here: https://github.com/google-research/augmix/blob/master/imagenet.py
    From paper: 'AugMix: A Simple Data Processing Method to Improve Robustness and Uncertainty -
    https://arxiv.org/abs/1912.02781

    Hacked together by / Copyright 2020 Ross Wightman
    é   é   çš™™™™™¹?c                    sB   t ƒ  ¡  || _|| _|d k	r2|dkr2t|ƒ| _ntj ¡ | _d S )Nr   )	ÚsuperÚ__init__Ú
num_splitsÚalphar   Úcross_entropy_lossÚtorchÚnnZCrossEntropyLoss)Úselfr
   r   Z	smoothing©Ú	__class__© úL/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/loss/jsd.pyr	      s    
zJsdCrossEntropy.__init__c                    s¦   |j d | j }|| j |j d ks(t‚t ||¡}|  |d |d |… ¡}dd„ |D ƒ}t t |¡jdd�dd¡ 	¡ ‰ || j
t‡ fdd„|D ƒƒ t|ƒ 7 }|S )Nr   c                 S   s   g | ]}t j|d d�‘qS )r   )Údim)ÚFZsoftmax)Ú.0Zlogitsr   r   r   Ú
<listcomp>!   s     z,JsdCrossEntropy.__call__.<locals>.<listcomp>)ZaxisgH¯¼šò×z>r   c                    s   g | ]}t jˆ |d d�‘qS )Z	batchmean)Z	reduction)r   Zkl_div)r   Zp_split©Zlogp_mixturer   r   r   %   s   ÿ  ÿ)Úshaper
   ÚAssertionErrorr   Úsplitr   ÚclampÚstackZmeanÚlogr   ÚsumÚlen)r   ÚoutputÚtargetZ
split_sizeZlogits_splitZlossZprobsr   r   r   Ú__call__   s     ÿÿzJsdCrossEntropy.__call__)r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r#   Ú__classcell__r   r   r   r   r      s   	r   )
r   Ztorch.nnr   Ztorch.nn.functionalZ
functionalr   Zcross_entropyr   ÚModuler   r   r   r   r   Ú<module>   s   