当前位置: 首页 > news >正文

pytorch 深度学习之余弦相似度

文章目录

    • 用处
    • 定理
    • 代码
    • 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() 函数用于计算张量的范数,返回范数的标量结果。

相关文章:

pytorch 深度学习之余弦相似度

文章目录 用处定理代码F.normalize() 和 F.norm() 的区别 用处 此方法特别重要,经常可以用来修改论文,提出创新点. 定理 余弦相似度是通过计算两个向量之间的夹角余弦值来衡量它们的相似性。给定两个非零向量 x 和 y,它们之间的余弦相似度…...

Postman的常规断言/动态参数断言/全局断言

近期在复习Postman的基础知识,在小破站上跟着百里老师系统复习了一遍,也做了一些笔记,希望可以给大家一点点启发。 断言,包括状态码断言和业务断言,状态码断言有一个,业务断言有多个。 一)常规的…...

ruoyi若依前端请求接口超时,增加响应时长

问题: 前端查询请求超时 解决: 找到request.js的timeout属性由10秒改成了20秒,因为默认是10秒,请求肯定是超出了10秒 祝您万事顺心,没事点个赞呗,关注一下也行啊,有啥要求您评论哈...

贪吃蛇小游戏

一. 准备工作 首先获取贪吃蛇小游戏所需要的头部、身体、食物以及贪吃蛇标题等图片。、 然后,创建贪吃蛇游戏的Java项目命名为snake_game,并在这个项目里创建一个文件夹命名为images,将图片素材导入文件夹。 再在src文件下创建两个包&#…...

cocos----1

1 前言 刚体(Rigidbody)是运动学(Kinematic)中的一个概念,指在运动中和受力作用后,形状和大小不变,而且内部各点的相对位置不变的物体。在 Unity3D 中,刚体组件赋予了游戏对…...

第十九章绘图

Java绘图类 Graphics 类 Grapics 类是所有图形上下文的抽象基类,它允许应用程序在组件以及闭屏图像上进行绘制。Graphics 类封装了Java 支持的基本绘图操作所需的状态信息,主要包括颜色、字体、画笔、文本、图像等。 Graphics 类提供了绘图常用的…...

rpmbuild 包名 version 操作系统信息部分来源 /etc/rpm/macros.dist

/etc/rpm/macros.dist openeuler bclinux src.rpm openssl-1.1.1f-13.oe1.src.rpm 打包名称结果 openeuler openssl-1.1.1f-13.aarch64.rpm bclinux openssl-1.1.1f-13.oe1.bclinux.aarch64.rpm 验证 修改openeuler配置文件macros.dist 重新在openeuler上执行rpmbuild…...

【Linux专题】SFTP 用户配置 ChrootDirectory

【赠送】IT技术视频教程,白拿不谢!思科、华为、红帽、数据库、云计算等等https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502 红帽认证 认证课程介绍:红帽RHCE9.0学什么内容,新版有什么变化-CSDN…...

openssl+ DES开发实例(Linux)

文章目录 一、DES介绍二、DES原理三、DES C实现源码 一、DES介绍 DES(Data Encryption Standard)是一种对称密钥加密算法,最初由 IBM 设计,于1977年成为美国国家标准,用于加密非机密但敏感的政府数据。DES 使用相同的…...

结构体几种实用的用法

结构体的初始化 结构体的初始化是指在声明结构体变量时,为其成员变量赋初值。结构体的初始化可以通过以下几种方式实现: 1. 在声明结构体变量的同时进行初始化: struct Student { char name[20]; int age; float score; } student {…...

React Native 源码分析(四)—— TurboModules JSI通信机制

本文会详细分析React Native 基于JSI的通信方式,除不会涉及Hemers引擎部分,其余代码都会详细分析,但比较简单的,不会很啰嗦,可以说是网上最完整详细的分析文章,代码通过断点截图,可以更方便查看运行的过程 1、React Native 源码分析(一)—— 启动流程 2、React Nativ…...

【C#学习】ToString() 格式化数值

格式字符串采用以下形式:Axx,其中 A 为格式说明符,指定格式化类型,xx 为精度说明符,控制格式化输出的有效位数或小数位数。 格式说明符 说明 示例 输出 C 货币 2.5.ToString(“C”) ¥2.50 D 十进制数 25.…...

install YAPI MongoDB

docker 运行 mongodb sudo docker run -d \ --name mongodb \ --restart always \ --netdocker \ -p 27017:27017 \ -v ./db:/data/db \ -e MONGO_INITDB_DATABASEyapi \ -e MONGO_INITDB_ROOT_USERNAMEroot \ -e MONGO_INITDB_ROOT_PASSWORD123456 \ mongo…...

大数据Doris(二十三):取消导入与其他导入案例参考

文章目录 取消导入与其他导入案例参考 一、取消导入...

SQL-LABS

less8 and 11-- 12 发现存在注入点 接下来我们会接着用联合查询 和以往的题目不一样没显错位,也就是没有报错的内容,尝试用盲注 布尔型 length()返回长度 substr()截取字符串(语法substr&a…...

【中间件篇-Redis缓存数据库07】Redis缓存使用问题及互联网运用

Redis缓存使用问题 数据一致性 只要使用到缓存,无论是本地内存做缓存还是使用 redis 做缓存,那么就会存在数据同步的问题。 我以 Tomcat 向 MySQL 中写入和删改数据为例,来给你解释一下,数据的增删改操作具体是如何进行的。 我…...

物理引擎介绍

物理引擎介绍 文章目录 物理引擎介绍Panda3D物理引擎在节点上启用物理场对节点应用物理效果例子一 重力例子二 旋转的推力力的类型线性力旋转力注意事项线性力的一个例子旋转力的一个例子Bullet 如何演示重力虽然碰撞检测解决了防止对象在大多数应用中碰撞的问题,但某些游戏和…...

Ubuntu18.04平台下Qt开发程序打包的一些问题总结

目录 前言 一、在Ubuntu18.04开发环境下打包有两种方式 1、利用linuxdeployqt软件进行打包 2、利用编写shell脚本的方式进行打包 二、详细介绍shell脚本打包的方式 1、新建一个空的文件夹 2、准备脚本copylib.sh 3、准备脚本xxxx.sh。 4、给上述两个脚本添加可执行权限…...

定时器setTimeout()、setInterval()详解

定时器是JavaScript中常用的一种功能,它可以通过代码控制在指定的时间间隔或者时间点执行特定的代码。常见的定时器有setTimeout()和setInterval()两种。 setTimeout() setTimeout()函数可以让代码在指定的时间后执行一次,其语法如下: setT…...

测试端口开通的几种方法

一、前言 在平时使用中,当测试服务器端口是否开通时,我们首先想到的是Telnet,如下: [rootk8s-master01 ~]# telnet 192.168.1.33 6443 Trying 192.168.1.33... Connected to 192.168.1.33. Escape character is ^].但是实际生产…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

Unity中的transform.up

2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...

codeforces C. Cool Partition

目录 题目简述: 思路: 总代码: https://codeforces.com/contest/2117/problem/C 题目简述: 给定一个整数数组,现要求你对数组进行分割,但需满足条件:前一个子数组中的值必须在后一个子数组中…...

SE(Secure Element)加密芯片与MCU协同工作的典型流程

以下是SE(Secure Element)加密芯片与MCU协同工作的典型流程,综合安全认证、数据保护及防篡改机制: 一、基础认证流程(参数保护方案) 密钥预置‌ SE芯片与MCU分别预置相同的3DES密钥(Key1、Key2…...