o

    8,h                     @   sN   d dl Z d dlmZ d dlm  mZ G dd dejZG dd dejZdS )    Nc                       &   e Zd Zd fdd	Zdd Z  ZS )ContrastiveLossffffff?allc                    s&   t   f || _|| _t | _d S N)super__init__temperatureneg_modennCrossEntropyLoss
cross_entropy)selfr	   r
   	__class__ :/root/Awesome-Backbones/configs/losses/contrastive_loss.pyr      s   zContrastiveLoss.__init__c                 C   s   | d}td||| j }t||j}| jdkr/tj|tj	d|j}|
|d}| ||| |j| d }|S )Nr   z
id, jd->ijZintra)dtypeg    e      ?)
sizetorcheinsumr	   arangetodevicer
   eyeboolmasked_fillr
   T)r   feat1feat2
batch_size
sim_matrixlabelsmasklossr   r   r   forward   s   

zContrastiveLoss.forward)r   r   __name__
__module____qualname__r   r&   
__classcell__r   r   r   r   r          r   c                       r   )ProjectedContrastiveLossr         ?c                    s$   t    || _|| _t | _d S r   )r   r   r	   loss_weightr   r   r
   )r   r	   r/   r   r   r   r   &   s   
z!ProjectedContrastiveLoss.__init__c                 C   sT   t d||| j }t |d|j}d| ||| |j|  }|| j	 S )Nz	nc,mc->nmr   r   )
r   r   r	   r   r   r   r   r
   r   r/   )r   r   r    r"   r#   r%   r   r   r   r&   ,   s   
z ProjectedContrastiveLoss.forward)r   r.   r'   r   r   r   r   r-   %   r,   r-   )	r   torch.nnr   torch.nn.functional
functionalFModuler   r-   r   r   r   r   <module>   s
     