
    Ng	                     f    d Z ddlmZmZ ddlZddlmZ ddlmc mZ	  G d dej
                  ZdS )zY Binary Cross Entropy w/ a few extras

Hacked together by / Copyright 2021 Ross Wightman
    )OptionalUnionNc                        e Zd ZdZ	 	 	 	 	 	 ddee         deej                 ded	e	d
ee
ej        ef                  f
 fdZdej        dej        dej        fdZ xZS )BinaryCrossEntropyz BCE with optional one-hot from dense targets, label smoothing, thresholding
    NOTE for experiments comparing CE to BCE /w label smoothing, may remove
    皙?NmeanFtarget_thresholdweight	reductionsum_classes
pos_weightc                 p   t          t          |                                            d|cxk    rdk     sn J |.t          |t          j                  st	          j        |          }|| _        || _        |rdn|| _	        || _
        |                     d|           |                     d|           d S )Ng              ?noner
   r   )superr   __init__
isinstancetorchTensortensor	smoothingr	   r   r   register_buffer)selfr   r	   r
   r   r   r   	__class__s          Z/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/loss/binary_cross_entropy.pyr   zBinaryCrossEntropy.__init__   s     	 $''00222Y$$$$$$$$$$!j%,77 6"\*55
" 0#.=I&Xv...\:66666    xtargetreturnc                    |j         d         }||j         d         k    sJ |j         |j         k    r|j         d         }| j        |z  }d| j        z
  |z   }|                                                    dd          }t	          j        ||f||j        |j                                      d||          }| j	        3|
                    | j	                                      |j                  }t          j        ||| j        | j        | j                  }| j        r'|                    d                                          }|S )Nr   r      )devicedtype)r$   )r   r   )shaper   longviewr   fullr#   r$   scatter_r	   gttoF binary_cross_entropy_with_logitsr
   r   r   r   sumr   )r   r   r   
batch_sizenum_classes	off_valueon_valuelosss           r   forwardzBinaryCrossEntropy.forward%   sB   WQZ
V\!_,,,,<17""'"+K4IDN*Y6H[[]]''A..FZ[)xqw0 0 0 19FH0M0M 
  ,YYt45588v|8LLF1vKn	
 
 
  	'88B<<$$&&Dr   )r   NNr   FN)__name__
__module____qualname____doc__r   floatr   r   strboolr   r   r4   __classcell__)r   s   @r   r   r      s         
 04-1# %?C7 7 'uo7 U\*	7
 7 7 !u|U':!;<7 7 7 7 7 7* u|         r   r   )r8   typingr   r   r   torch.nnnntorch.nn.functional
functionalr,   Moduler    r   r   <module>rD      s     # " " " " " " "                5 5 5 5 5 5 5 5 5 5r   