U
    ¯Ê¹j³	  ã                   @   sP   d Z ddlmZmZ ddlZddlmZ ddlm  mZ	 G dd„ dej
ƒZdS )zY Binary Cross Entropy w/ a few extras

Hacked together by / Copyright 2021 Ross Wightman
é    )ÚOptionalÚUnionNc                	       s`   e Zd ZdZdee eej ee	ee
ejef  dœ‡ fdd„Zejejejd	œd
d„Z‡  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                    s‚   t t| ƒ ¡  d|  kr"dk s(n t‚|d k	rFt|tjƒsFt |¡}|| _|| _	|rZdn|| _
|| _|  d|¡ |  d|¡ d S )Ng        ç      ð?Únoner   r   )Úsuperr   Ú__init__ÚAssertionErrorÚ
isinstanceÚtorchÚTensorZtensorÚ	smoothingr   r	   r
   Zregister_buffer)Úselfr   r   r   r	   r
   r   ©Ú	__class__© ú]/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/loss/binary_cross_entropy.pyr      s    	
zBinaryCrossEntropy.__init__)ÚxÚtargetÚreturnc                 C   sÐ   |j d }||j d kst‚|j |j kr~|j d }| j| }d| j | }| ¡  dd¡}tj||f||j|jd� 	d||¡}| j
d k	rž| | j
¡j|jd�}tj||| j| j| jd�}| jrÌ| d¡ ¡ }|S )Nr   éÿÿÿÿr   é   )ÚdeviceÚdtype)r    )r   r	   )Úshaper   r   ÚlongÚviewr   Úfullr   r    Zscatter_r   ÚgtÚtoÚFZ binary_cross_entropy_with_logitsr   r   r	   r
   Úsumr   )r   r   r   Z
batch_sizeZnum_classesZ	off_valueZon_valueZlossr   r   r   Úforward%   s:    


 ý  ý
 üzBinaryCrossEntropy.forward)r   NNr   FN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úfloatr   r   ÚstrÚboolr   r   r)   Ú__classcell__r   r   r   r   r      s         ùùr   )r-   Útypingr   r   r   Ztorch.nnÚnnZtorch.nn.functionalZ
functionalr'   ÚModuler   r   r   r   r   Ú<module>   s
   