torch F.cosine_similarity()使用

这篇具有很好参考价值的文章主要介绍了torch F.cosine_similarity()使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

torch F.cosine_similarity()使用,# torch,python,矩阵

看名字就知道是算余弦相似度,但是有个烦人的参数dim,本文主要解决如下几个问题

  •     dim 参数到底有什么作用?如何设置dim参数
  •     两个矩阵使用该函数算余弦相似度到底是按列向量来算还是按行向量来算?
  •     如果想要算矩阵中每个行向量两两之间的相似度,如何计算?

1. dim的作用

  •  实验一: dim=0
import torch.nn.functional as F
import torch
import math

a = torch.tensor([[1, 2], [3, 4]], dtype=torch.float)
b = torch.tensor([[5, 6], [7, 8]], dtype=torch.float)


def check(vec_a, vec_b):
    dot = 0
    for i in range(len(vec_a)):
        dot += vec_a[i]*vec_b[i]
    vec_a_sq_sum = math.sqrt(sum([item*item for item in vec_a]))
    vec_b_sq_sum = math.sqrt(sum([item*item for item in vec_b]))
    return dot/(vec_a_sq_sum*vec_b_sq_sum)

if __name__ == "__main__":
	res = F.cosine_similarity(a, b, dim=0)
	print(res)
	check1 = check([1,3], [5,7])
	check2 = check([2,4], [6,8])
	print(check1)
	print(check2)

如上计算a, b的余弦相似度,dim=0,得到如下结果: 

tensor([0.9558, 0.9839])
0.95577900872195
0.9838699100999074

因此对于二维矩阵,dim=0表示对应列的列向量之间进行cos相似度计算

  • 实验2: dim = 1
if __name__ == "__main__":
    res = F.cosine_similarity(a, b, dim=1)
    print(res)
    check1 = check([1,2], [5,6])
    check2 = check([3,4], [7,8])
    print(check1)
    print(check2)

得到如下结果

tensor([0.9734, 0.9972])
0.973417168333576
0.997164120486613

因此dim=1表示相对应的行向量之间的余弦相似度计算, 默认情况下dim=1,即当不设置dim参数时,是计算行向量之间的相似度

2. 如何计算两两之间的相似度?

从上面可以看出,输入两个2*2的矩阵,F.cosine_similarity 函数输出的是1*2的结果,即指算了对应行或对应列向量之间的相似度,那么如何计算行向量两两之间的相似度呢,即输入两个2*2的矩阵,输出为2*2的相似度矩阵

将上面main函数改成如下:

if __name__ == "__main__":
    x = a.unsqueeze(1)
    y = b.unsqueeze(0)
    print("x", x)
    print("y", y)
    res = F.cosine_similarity(x, y, dim=-1)
    print("res", res)
    check11 = check([1,2], [5,6])
    check12 = check([1,2], [7,8])
    check21 = check([3,4], [5,6])
    check22 = check([3,4], [7,8])

    print(check11, check12, check21, check22)

输出如下结果:

x tensor([[[1., 2.]],
       	 [[3., 4.]]])
y tensor([[[5., 6.],
         [7., 8.]]])
res tensor([[0.9734, 0.9676],
        [0.9987, 0.9972]])
0.973417168333576 0.9676172723968437 0.9986876634765887 0.997164120486613

可看到上面程序实现了行向量间两两求相似度的需求

个人猜测其原理如下:
x.shape=[2, 1, 2],y.shape=[1, 2, 2],在三维情况下dim=-1(dim=2)表示行,从x中取一行,x_vec.shape = [1,2] , 从y中取一行, y_vec.shape = [2,2],这样计算相似度为两个,同理进行下一行计算,有点像numpy中矩阵自动扩展计算类似

3. 总结

如果想要按行计算相似度,dim设置成-1即可,如果要想两两计算相似度,需要使用unsqueeze函数进行增加矩阵维度。文章来源地址https://www.toymoban.com/news/detail-720055.html

到了这里,关于torch F.cosine_similarity()使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • torch中的矩阵乘法与广播机制

    1. 两个张量“ 可广播 ”规则: 每个张量至少有一个维度。 当迭代维度大小时,从最后一个维度开始,满足以下条件:(1)维度大小相等,(2)其中一个维度为1,(3)或者其中一个维度不存在。 举例: 2. 可广播张量计算规则: 如果两个张量可以广播,则得到的张量大小

    2024年02月06日
    浏览(19)
  • torch.cdist高效计算大矩阵相似度

    问题定义 现有矩阵 A ∈ R N × C , B ∈ R M × C Ain R^{Ntimes C}, Bin R^{Mtimes C} A ∈ R N × C , B ∈ R M × C ,需要计算矩阵 A A A 和 B B B 的相似度(欧式距离)矩阵 S ∈ R N × M Sin R^{Ntimes M} S ∈ R N × M , N N N 和 M M M 很大。可以使用pytorch提供的 torch.cdist 方法,记得使用GPU计算。

    2024年02月14日
    浏览(33)
  • 机器学习中的数学——距离定义(八):余弦距离(Cosine Distance)

    分类目录:《机器学习中的数学》总目录 相关文章: · 距离定义:基础知识 · 距离定义(一):欧几里得距离(Euclidean Distance) · 距离定义(二):曼哈顿距离(Manhattan Distance) · 距离定义(三):闵可夫斯基距离(Minkowski Distance) · 距离定义(四):切比雪夫距离(

    2023年04月08日
    浏览(26)
  • python:torch.no_grad()的作用 + requires_grad,grad_fn,grad的含义及使用

    requires_grad: grad_fn: grad: 说法1: 说法2: 代码: 保证param原地数值改变操作下requires_grad=True不变。 参考资料: requires_grad,grad_fn,grad的含义及使用 测试torch.no_grad()的作用 pytorch中torch.no_grad有什么用? PyTorch 中的“with torch no_grad”有什么作用?

    2024年02月17日
    浏览(32)
  • 使用python实现矩阵

    使用python构建一个类,模拟矩阵,可以进行各种矩阵的计算,与各种方便的用法 由于矩阵是一个二维数组,应当支持诸如matrix[1, 2],matrix[1:3, 2],matrix[1:3, 2:4]之类的取值 所以我们需要使用slice类的indice方法实现__getitem__,并支持切片 由于要支持切片,所以需要在方法中新建一

    2024年02月05日
    浏览(13)
  • Python安装torch(含torch和torchvision对应版本)

    torch 、torchvision和python的对应版本如下: torch  torchvision  python master / nightly master / nightly =3.6 1.7.1  0.8.2 =3.6 1.7.0  0.8.1 =3.6 1.7.0 0.8.0 =3.6 1.6.0 0.7.0 =3.6 1.5.1 0.6.1 =3.5 1.5.0 0.6.0 =3.5 1.4.0 0.5.0   ==2.7, =3.5, =3.8 1.3.1  0.4.2 ==2.7, =3.5, =3.7 1.3.0 0.4.1 ==2.7, =3.5, =3.7 1.2.0 0.4.0 ==2.7, =3.5, =3.7 1.1.0  

    2024年01月16日
    浏览(36)
  • 【python】使用numpy创建同心矩阵

    输入一个正奇数N,创建一个N*N的矩阵满足: 1. 矩阵中心的元素为N,其外层被N-1包围; 2. N-1的外层被N-2包围; 3. 依次循环,直到形成一个N*N的矩阵。 很容易可以计算得出,矩阵元素从内到外递减,最外层的元素为(N+1)/2. 我们可以使用numpy从外向内地填充矩阵;首先生成一个

    2024年02月13日
    浏览(31)
  • chatgpt赋能python:如何使用Python创建0矩阵

    在Python中,矩阵是一种非常常见的数据结构,经常在科学计算、人工智能、数据分析等领域中使用。创建0矩阵是矩阵操作中的一项基本任务。本文将介绍如何使用Python创建0矩阵。 0矩阵(Zero Matrix)是一个所有元素都为0的矩阵。它的行数和列数可以是任意值,也可以是一个行

    2024年02月06日
    浏览(34)
  • Python 使用numpy.bincount计算混淆矩阵

    Confusion matrix using numpy.bincount. np.bincount 用于统计一个非负数组中元素的出现次数。函数格式如下: 通常默认数组 x x

    2024年02月07日
    浏览(30)
  • 使用Python解析getPerspectiveTransform透视变换矩阵的原理

    使用Python解析getPerspectiveTransform透视变换矩阵的原理 在计算机视觉领域中,图像处理和分析通常需要将图像投影到平面或其他几何形状上。透视变换是一种常用方法,可以将图像从一个视角转换到另一个视角。OpenCV提供了getPerspectiveTransform函数,可通过4对点的坐标来确定透视

    2024年01月20日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包