
    kh;                     `    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	y)    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kD  rt	        |      | _        y t        j                  j                         | _        y )Nr   )	super__init__
num_splitsalphar   cross_entropy_losstorchnnCrossEntropyLoss)selfr
   r   	smoothing	__class__s       I/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/loss/jsd.pyr	   zJsdCrossEntropy.__init__   sJ    $
 Y]&@&KD#&+hh&?&?&AD#    c                 ^   |j                   d   | j                  z  }|| j                  z  |j                   d   k(  sJ t        j                  ||      }| j	                  |d   |d |       }|D cg c]  }t        j                  |d       }}t        j                  t        j                  |      j                  d      dd      j                         }|| j                  t        |D 	cg c]  }	t        j                  ||	d       c}	      z  t        |      z  z  }|S c c}w c c}	w )Nr   r   )dim)axisgHz>	batchmean)	reduction)shaper
   r   splitr   Fsoftmaxclampstackmeanlogr   sumkl_divlen)
r   outputtarget
split_sizelogits_splitlosslogitsprobslogp_mixturep_splits
             r   __call__zJsdCrossEntropy.__call__   s   \\!_7
DOO+v||A>>>{{6:6 &&|A{
8KL8DEf6q)EE {{5;;u#5#:#:#:#BD!LPPR

SIN"P>E #$(('[#: "P Q QSVW\S]^ 	^ F"Ps   0D%-D*)      g?)__name__
__module____qualname____doc__r	   r.   __classcell__)r   s   @r   r   r      s    Br   r   )
r   torch.nnr   torch.nn.functional
functionalr   cross_entropyr   Moduler    r   r   <module>r<      s$        5bii r   