o
    پi;                     @   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                    sD   t    || _|| _|d ur|dkrt|| _d S tj | _d S )Nr   )	super__init__
num_splitsalphar   cross_entropy_losstorchnnCrossEntropyLoss)selfr
   r   	smoothing	__class__ A/home/ubuntu/.local/lib/python3.10/site-packages/timm/loss/jsd.pyr	      s   
zJsdCrossEntropy.__init__c                    s   |j d | j }|| j |j d ksJ 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)Fsoftmax).0logitsr   r   r   
<listcomp>!   s    z,JsdCrossEntropy.__call__.<locals>.<listcomp>)axisgHz>r   c                    s   g | ]
}t j |d dqS )	batchmean)	reduction)r   kl_div)r   p_splitlogp_mixturer   r   r   %   s
    
)shaper
   r   splitr   clampstackmeanlogr   sumlen)r   outputtarget
split_sizelogits_splitlossprobsr   r!   r   __call__   s    zJsdCrossEntropy.__call__)r   r   r   )__name__
__module____qualname____doc__r	   r1   __classcell__r   r   r   r   r      s    	r   )
r   torch.nnr   torch.nn.functional
functionalr   cross_entropyr   Moduler   r   r   r   r   <module>   s
    