pytorch 深度学习之余弦相似度

news/2024/12/29 6:40:11/

文章目录

    • 用处
    • 定理
    • 代码
    • F.normalize() 和 F.norm() 的区别

用处

此方法特别重要,经常可以用来修改论文,提出创新点.

定理

余弦相似度是通过计算两个向量之间的夹角余弦值来衡量它们的相似性。给定两个非零向量 x 和 y,它们之间的余弦相似度可以使用以下公式计算:

cosine_similarity(x, y) = (x · y) / (||x|| * ||y||)

其中,

  • (x · y) 表示向量 x 和 y 的点积(内积),是两个向量对应元素相乘再求和的结果。
  • ||x|| 表示向量 x 的范数,通常使用 L2 范数表示,即向量 x 的所有元素平方和的平方根。
  • ||y|| 表示向量 y 的范数,也是使用 L2 范数进行计算。

使用上述公式,我们可以将两个向量的点积除以它们的范数的乘积,得到余弦相似度的标量结果,取值范围在 -1 到 1 之间。越接近 1 表示两个向量越相似,越接近 -1 表示两个向量越不相似,0 表示两个向量正交(无关)。

代码

  • 代码1:

如果您想在指定的维度(channels, height, width)上计算范数并保持计算过程中的维度,可以进行如下修改:

import torch.nn.functional as Fdef cosine_similarity(tensor_1, tensor_2):normalized_tensor_1 = F.normalize(tensor_1, p=2, dim=(1, 2, 3))normalized_tensor_2 = F.normalize(tensor_2, p=2, dim=(1, 2, 3))cosine_sim = torch.sum(normalized_tensor_1 * normalized_tensor_2, dim=(1, 2, 3), keepdim=True)return cosine_sim

在这里,我们使用 dim=(1, 2, 3) 将计算范数的维度指定为 (channels, height, width),并使用 keepdim=True 保持了计算过程中的维度。

这样,函数将在指定的维度上进行范数计算,并返回一个与输入张量形状相同的张量,其中的每个元素是沿着指定维度(channels, height, width)计算得到的余弦相似度值,并保持了指定维度的维度大小。

  • 代码2:

如果你希望使用 torch.norm() 函数计算张量的范数,可以对上述代码进行如下修改:

import torchdef cosine_similarity(tensor_1, tensor_2):normalized_tensor_1 = tensor_1 / torch.norm(tensor_1, p=2, dim=(1, 2, 3), keepdim=True)normalized_tensor_2 = tensor_2 / torch.norm(tensor_2, p=2, dim=(1, 2, 3), keepdim=True)cosine_sim = torch.sum(normalized_tensor_1 * normalized_tensor_2, dim=(1, 2, 3), keepdim=True)return cosine_sim

在这个修改后的代码中,我们使用了 torch.norm() 函数计算指定维度上的张量范数,并将其作为分母来归一化输入张量。参数 p=2 表示使用 L2 范数计算。

然后,我们使用 torch.sum() 函数在指定的维度上求和,并保持计算过程中的维度,得到余弦相似度的向量。

请确保已经导入了 torch 模块。

F.normalize() 和 F.norm() 的区别

F.normalize()F.norm() 是两个不同的函数,它们在功能和使用方式上有所不同。

  1. F.normalize() 函数是用来对张量进行归一化处理的。它接受一个输入张量和一个参数 p,并根据指定的范数类型对输入张量进行归一化。常见的范数类型包括 L1 范数、L2 范数等。归一化后的张量将具有单位长度,方便进行一些距离度量或相似度计算的操作。

  2. F.norm() 函数是用来计算张量的范数的。它接受一个输入张量和一个参数 p,并返回指定范数类型的计算结果。常见的范数类型包括 L1 范数、L2 范数等。F.norm() 函数返回的是一个标量结果,而不是对输入张量进行归一化处理。

总结:
F.normalize() 函数用于对张量进行归一化处理,返回归一化后的张量;
F.norm() 函数用于计算张量的范数,返回范数的标量结果。


http://www.ppmy.cn/news/1221725.html

相关文章

python科研绘图:带正态分布的直方图

带正态分布的直方图是一种用直方图表示数据分布的图表,其中数据经过了正态分布的拟合。正态分布是一种常见的概率分布,具有平均值和标准差。在带正态分布的直方图中,数据被分成不同的区间,每个区间的频数或频率可以用颜色或标签表…

手撕无头单链表

💓 博客主页:江池俊的博客⏩ 收录专栏:数据结构探索👉专栏推荐:✅C语言初阶之路 ✅C语言进阶之路💻代码仓库:江池俊的代码仓库🔥编译环境:Visual Studio 2022&#x1f38…

YOLOv5项目实战(3)— 如何批量命名数据集中的图片

前言:Hello大家好,我是小哥谈。本节课就教大家如何去批量命名数据集中的图片,希望大家学习之后可以有所收获!~🌈 前期回顾: YOLOv5项目实战(1)— 如何去训练模型 YOLOv5项目实战(2࿰

PTA 7-24 求素数

本题目要求读入1个正整数A,判断A是否为素数。 小贴士:反过来考虑,只要有一次整除了,就不是素数,循环break,不要继续算了。还可以加入标志法,flag的初值为1,一,旦整除了,…

折爱心教程(简单版本)

文章目录 1.折出双三角形2.向中心折叠3.形成正方形4.对折正反面相同5.向中心折6.外侧角向中心折7.顶部三角形向下折叠注意参考资料 我怎么也没有想到,身为混迹职场多年的老油子,竟然还能遇到折纸这种硬性task。 可是给的教程步骤省略太多了,看…

Linux进程间通信模式

管道是一种单向传输数据的机制,它其实是一段缓存,里面的数据只能从一端写入,从另一端读出。如果想互相通信,我们需要创建两个管道才行。 管道分为两种类型,“|” 表示的管道称为匿名管道,意思就是这个类型…

java绘制心形爱心

java绘制心形爱心 绘制java心形的核心就是实现:上代码:可以直接复制使用生成效果heart() 展示效果heart2() 展示效果 下面实现另一个需求:需求描述要生成二维码,就要引入依赖:上代码效果:这个就是包含刘亦菲…

【混合编程】Matlab和C++混编

文章目录 编译第一步:使用下面命令编译cpp文件第二步:写mexFunction 在matlab中使用C和C数值传递matlab → \to → cc → \to → matlab 字符串的传入与传出matlab → \to → cc → \to → matlab 编译 第一步:使用下面命令编译cpp文件 …