
    Ng;                     ^    d dl Z d dlmZ d dlmc mZ ddlmZ  G d dej                  Z	dS )    N   )LabelSmoothingCrossEntropyc                   *     e Zd ZdZd fd	Zd Z x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                     t                                                       || _        || _        ||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__s       I/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/loss/jsd.pyr   zJsdCrossEntropy.__init__   sg    $
 Y]]&@&K&KD###&+h&?&?&A&AD###    c                    |j         d         | j        z  }|| j        z  |j         d         k    sJ t          j        ||          }|                     |d         |d |                   }d |D             }t          j        t          j        |                              d          dd                                          || j	        t          fd|D                       z  t          |          z  z  }|S )Nr   c                 :    g | ]}t          j        |d           S )r   )dim)Fsoftmax).0logitss     r   
<listcomp>z,JsdCrossEntropy.__call__.<locals>.<listcomp>!   s'    EEEf6q)))EEEr   )axisgHz>r   c                 >    g | ]}t          j        |d           S )	batchmean)	reduction)r   kl_div)r   p_splitlogp_mixtures     r   r   z,JsdCrossEntropy.__call__.<locals>.<listcomp>%   sG     "P "P "P>E #$('[#: #: #: "P "P "Pr   )shaper   r   splitr   clampstackmeanlogr   sumlen)r   outputtarget
split_sizelogits_splitlossprobsr&   s          @r   __call__zJsdCrossEntropy.__call__   s   \!_7
DO+v|A>>>>{6:66 &&|A{
{8KLLEEEEE {5;u#5#5#:#:#:#B#BD!LLPPRR
S "P "P "P "PIN"P "P "P Q Q QSVW\S]S]^ 	^r   )r   r   r	   )__name__
__module____qualname____doc__r   r5   __classcell__)r   s   @r   r   r      s\         B B B B B B      r   r   )
r   torch.nnr   torch.nn.functional
functionalr   cross_entropyr   Moduler    r   r   <module>rA      s                    5 5 5 5 5 5    bi     r   