
    RЦi	                     h    S r SSKJrJr  SSKrSSKJr  SSKJs  Jr	   " S S\R                  5      rg)zXBinary Cross Entropy w/ a few extras

Hacked together by / Copyright 2021 Ross Wightman
    )OptionalUnionNc                      ^  \ rS rSrSr      SS\\   S\\R                     S\	S\
S\\\R                  \4      4
U 4S jjjrS	\R                  S
\R                  S\R                  4S jrSrU =r$ )BinaryCrossEntropy   zBCE with optional one-hot from dense targets, label smoothing, thresholding
NOTE for experiments comparing CE to BCE /w label smoothing, may remove
target_thresholdweight	reductionsum_classes
pos_weightc                 J  > [         [        U ]  5         SUs=::  a  S:  d   e   eUb5  [        U[        R
                  5      (       d  [        R                  " U5      nXl        X l        U(       a  SOUU l	        XPl
        U R                  SU5        U R                  SU5        g )Ng              ?noner	   r   )superr   __init__
isinstancetorchTensortensor	smoothingr   r
   r   register_buffer)selfr   r   r	   r
   r   r   	__class__s          ]/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/loss/binary_cross_entropy.pyr   BinaryCrossEntropy.__init__   s     	 $02Y$$$$$$!j%,,77"\\*5
" 0#.I&Xv.\:6    xtargetreturnc                    UR                   S   nX2R                   S   :X  d   eUR                   UR                   :w  a  UR                   S   nU R                  U-  nSU R                  -
  U-   nUR                  5       R                  SS5      n[        R
                  " X44UUR                  UR                  S9R                  SX&5      nU R                  b2  UR                  U R                  5      R                  UR                  S9n[        R                  " XU R                  U R                  U R                   S9nU R"                  (       a  UR%                  S5      R'                  5       nU$ )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   summean)r   r   r   
batch_sizenum_classes	off_valueon_valuelosss           r   forwardBinaryCrossEntropy.forward%   s0   WWQZ
\\!_,,,<<177"''"+K4IDNN*Y6H[[]''A.FZZ)xxqww0 19F0M 
   ,YYt44588v||8LF11KKnn	
 88B<$$&Dr   )r
   r   r   r   )g?NNr/   FN)__name__
__module____qualname____firstlineno____doc__r   floatr   r   strboolr   r   r5   __static_attributes____classcell__)r   s   @r   r   r      s    
 04-1# %?C7 'uo7 U\\*	7
 7 7 !u||U':!;<7 7* u||   r   r   )r;   typingr   r   r   torch.nnnntorch.nn.functional
functionalr,   Moduler    r   r   <module>rH      s+    #    5 5r   