cosine损失

1. 余弦相似度的计算

pytorch存在一个计算两个向量的余弦相似度的方法,torch.cosine_similarity(Input1, Input2)
输入: ( N , D ) (N, D) (N,D) ( N , D ) (N, D) (N,D),返回 ( N ) (N) (N)

2. cosine损失的计算

Pytorch自带的Loss为:CosineEmbeddingLoss

公式:
在这里插入图片描述
margin默认为0。

详情见官方文档

3.代码实现

这里用两种不同的方式实现了cosine loss的功能。

import torch
import torch.nn as nn
from torch.nn import CosineEmbeddingLoss
import numpy as np


def cosine_similarity(x, y):
    num = x.dot(y.T)
    denom = np.linalg.norm(x) * np.linalg.norm(y)
    return num / denom


def cal_score(score, target):
    if target == 1:
        return 1 - score
    else:
        return max(0, score)


def criterion_my(x1, x2, target, reduction='mean'):
    batch_size, hidden_size = x1.size()
    scores = torch.cosine_similarity(x1, x2)
    for i in range(batch_size):
        scores[i] = cal_score(scores[i], target[i].item())
    if reduction == 'mean':
        return scores.mean()
    elif reduction == 'sum':
        return scores.sum()


def criterion_my2(x1, x2, target, reduction='mean'):
    batch_size, hidden_size = x1.size()
    scores = torch.zeros(batch_size)
    for i in range(batch_size):
        score = cosine_similarity(x1[i], x2[i])
        scores[i] = cal_score(score, target[i].item())
    if reduction == 'mean':
        return scores.mean()
    elif reduction == 'sum':
        return scores.sum()


if __name__ == '__main__':
    A = torch.tensor([[1.0617, 1.3397, -0.2303],
                      [0.3459, -0.9821, 1.2511]])

    B = torch.tensor([[-1.3730, 0.0183, -1.2268],
                      [0.4486, -0.6504, 1.5173]])
    Tar = torch.tensor([1, -1])

    criterion = nn.CosineEmbeddingLoss()
    score = criterion(A, B, Tar)

    score_my = criterion_my(A, B, Tar)
    score_my2 = criterion_my2(A, B, Tar)

    print(score)
    print(score_my)
    print(score_my2)  # tensor(1.1646)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐