Ë
    éÓ^j;  ã                   ó`   — 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       €úX/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/loss/jsd.pyr	   zJsdCrossEntropy.__init__   sJ   ø€ Ü‰ÑÔØ$ˆŒØˆŒ
ØÐ  Y°¢]Ü&@ÀÓ&KˆDÕ#ä&+§h¡h×&?Ñ&?Ó&AˆDÕ#ó    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)ÚaxisgH¯¼šò×z>Ú	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ˆ
Ø˜DŸO™OÑ+¨v¯|©|¸A©Ò>Ð>Ð>Ü—{‘{ 6¨:Ó6ˆð ×&Ñ& |°A¡¸¸{À
Ð8KÓLˆØ8DÖE¨f”—‘˜6 qÖ)ÐEˆÐEô —{‘{¤5§;¡;¨uÓ#5×#:Ñ#:ÀÐ#:Ó#BÀDÈ!ÓL×PÑPÓRˆØ�—
‘
œSØINö"PØ>Eô #$§(¡(Ø˜'¨[ö#:ò "Pó Qñ QÜSVÐW\Ó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ô�b—i‘iõ r   