pytorch where纵横不对称坑

图文匹配中, S ∈ [ 0 , 1 ] n × n S\in [0,1]^{n\times n} S[0,1]n×n 是一个相似度矩阵,即 S i j S_{ij} Sij 是第 i 幅图 I i I_i Ii 与第 j 条句子 T j T_j Tj 的相似度,而 ( I i , T i ) i = 1 n (I_i, T_i)_{i=1}^n (Ii,Ti)i=1n 是 ground-truth pair。检索文本(text retrieval)要求以 I i I_i Ii 为 quey 时 T i T_i Ti 排第几(即其 ranking);反过来检索图像(image retrieval)要求 T i T_i Ti 为 query 时 I i I_i Ii 的 ranking。

Text retrieval(逐行检索)可如此写:

import torch# S[i][j] = sim(image_i, text_j)
S = torch.randperm(36).view(6, 6)
print("similarities:", S)# text retrieval 求 ranking
asc_tx = S.argsort(1, descending=True)
print("asc_tx:", asc_tx)
sid = torch.arange(S.size(0)) # [n]
print("sample id:", sid)
rank_tx = torch.where(sid.unsqueeze(1) == asc_tx) # [n, 1]
print("rank_tx:", rank_tx)# 两种判断是否为 top-1 的写法对拍,结果一致
print("top-1")
print(rank_tx[1] < 1)
print(sid == S.argmax(1))

结果:

similarities:
tensor([[ 5, 25, 28, 15, 29, 19],[ 3, 13, 21,  1,  0, 16],[ 9, 31, 12, 18, 32, 14],[17,  2, 26,  4, 10,  7],[ 8, 23, 11, 35, 34, 20],[24,  6, 27, 30, 22, 33]])asc_tx:
tensor([[4, 2, 1, 5, 3, 0],[2, 5, 1, 0, 3, 4],[4, 1, 3, 5, 2, 0],[2, 0, 4, 5, 3, 1],[3, 4, 1, 5, 2, 0],[5, 3, 2, 0, 4, 1]])sample id: tensor([0, 1, 2, 3, 4, 5])
rank_tx: (tensor([0, 1, 2, 3, 4, 5]), tensor([5, 2, 4, 4, 1, 0]))  # <- 第一个向量是行序号,升序,没问题top-1
tensor([False, False, False, False, False,  True])  # 一致
tensor([False, False, False, False, False,  True])  # 一致

这种写法的思路是用 torch.argsort 按行排序,然后用 torch.where 求每一行序号等于 sample ID 的位置,即为 ranking。torch.where 返回的结果 rank_tx 是两个向量,第一个是行座标,第二个是列座标,由于 text retrieval 是逐行检索,所以列座标是 ranking。从结果看,这种写法没问题。

但当用同样思路写 image retrieval(逐列检索)时,出问题了:

import torch# S[i][j] = sim(image_i, text_j)
S = torch.randperm(36).view(6, 6)
print("similarities:", S)sid = torch.arange(S.size(0)) # [n]
# print("sample id:", sid)# image retrieval
asc_im = S.argsort(0, descending=True) # 排序轴换成 0
print("asc_im:", asc_im)
rank_im = torch.where(sid.unsqueeze(0) == asc_im) # [1, n]
print("rank_im:", rank_im) # 不对劲# 两种 top-1 写法对拍不过
print("top-1")
print(rank_im[0] < 1) # 取第一个个向量,即行位置
print(sid == S.argmax(0))

结果:

similarities:
tensor([[19, 16,  1, 15, 24, 28],[33, 21,  8,  3,  2, 34],[14, 25,  7, 32, 17,  0],[30,  6, 26, 11, 27,  4],[31, 20, 29, 22, 35, 23],[12, 13,  5, 18, 10,  9]])asc_im:
tensor([[1, 2, 4, 2, 4, 1],[4, 1, 3, 4, 3, 0],[3, 4, 1, 5, 0, 4],[0, 0, 2, 0, 2, 5],[2, 5, 5, 3, 5, 3],[5, 3, 0, 1, 1, 2]])rank_im: (tensor([0, 1, 3, 3, 3, 4]), tensor([4, 1, 0, 2, 5, 3]))  # <- 第二个向量是列序号,是乱序!top-1
tensor([ True, False, False, False, False, False])  # 不一致
tensor([False, False, False, False,  True, False])  # 不一致

这种 image retrieval 的写法是按照前面 text retrieval 的写法对称改过来的:

  • argsort 排序轴 0 -> 1(按行 -> 按列)。这步没问题;
  • sid.unsqueeze(1) -> sid.unsqueeze(0),即换成求每列序号等于 sample ID 的位置。这步的结果就不对了,前面 rank_tx 的第一个向量是升序的行序号,而 rank_im 的第二个向量却是乱序的列序号!

这个现象就是题目所谓 torch.where 纵横不对称。从 rank_im 来看,torch.where 的策略是行主序搜索,即搜完一行再一行,保证其结果 rank_im 的第一个向量是非降的,rank_tx 也满足这点。

一个解决办法是:转置 argsort 结果,然后照抄逐行检索的写法:

import torch# S[i][j] = sim(image_i, text_j)
S = torch.randperm(36).view(6, 6)
print("similarities:", S)# image retrieval, corrected
asc_im = S.argsort(0, descending=True)
# rank_im = torch.where(sid.unsqueeze(0) == asc_im) # 出事写法
rank_im2 = torch.where(sid.unsqueeze(1) == asc_im.T) # 转置 argsort,按逐行检索写法来
print("rank_im2:", rank_im2)print("top-1")
# print(rank_im[0] < 1)
print(rank_im2[1] < 1) # 还是用第二个向量
print(sid == S.argmax(0))

结果:

similarities:
tensor([[16, 17, 11, 10, 23, 33],[13, 15, 27, 34,  7, 24],[26, 29, 20,  6, 18, 31],[ 0, 32, 14, 12, 25, 35],[ 1,  2,  4,  9, 19, 22],[28, 30,  3,  5,  8, 21]])rank_im2: (tensor([0, 1, 2, 3, 4, 5]), tensor([2, 4, 1, 1, 2, 5]))top-1
tensor([False, False, False, False, False, False])  # 一致
tensor([False, False, False, False, False, False])  # 一致

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JL-杰理芯片-认识TA的SDK的第四天

无蓝牙连接关机时间 关机时间&#xff1a;3分钟 60 * 5 300 低功耗 进入低功耗前&#xff0c;要关闭打印 内存D2、D4、D8 芯片&#xff08;主控&#xff09;的内存不能超过一定的数值&#xff0c;超过后就不能烧录 jl_isd.bin这个文件不能超过内存大小 而杰理的内存是…

UI组件解析!5种类型让你迅速掌握!

无论是网页开发项目还是移动应用程序开发&#xff0c;整个项目过程的每一步都需要综合考虑。UI组件是设计师在项目设计过程中经常使用的工具之一。下面将为您详细分析UI组件&#xff0c;产品小白也可以快速启动。 1. 什么是UI组件&#xff1f; UI组件&#xff0c;即用户界面组…

6-10 阶乘计算升级版

void Print_Factorial ( const int N ) {if(N<0){printf("Invalid input");return;} int nN;int a[10000]{};a[0]1; //0和1的阶乘都是1&#xff0c;同时又是用该个位去&#xff0c;所以初始化为1&#xff1b;int i,j;int len0;//当前数组所占的最大下标in…

webpack优化构建速度示例-resolve.extensions:

当项目不仅仅包含.js或.json文件&#xff0c;还包含其他类型文件(如.ts、.vue、.css)作为模块时&#xff0c;配置resolve.extensions可以不必要的文件搜索提高性能。 src/index.ts import { someFuction } from ./modulesomeFuction()src/module.tsimport {otherSomeFuction} f…

武汉军工保密认证的现场审核有哪些要求?

武汉军工保密认证的现场审核要求&#xff1a; 武汉军工保密认证对现场审核的要求主要包括严格的保密措施、规范的审核流程、全面的审核内容以及专业的审核团队。 军工保密认证要求严格的保密措施是其核心要求之一。在进行现场审核时&#xff0c;审核团队必须确保审核过程中的信…

2024CCPC郑州邀请赛暨河南省赛(A,B,C,D,F,G,H,J,K,L,M)

2024 National Invitational of CCPC (Zhengzhou), 2024 CCPC Henan Provincial Collegiate Programming Contest 2024 年中国大学生程序设计竞赛全国邀请赛&#xff08;郑州&#xff09;暨第六届 CCPC 河南省大学生程序设计竞赛 比赛链接 这场的题说实话难度其实都不大&…

从某个对象 p 获取一个字符串列表

你提供的这段代码看起来是用于从某个对象 p 获取一个字符串列表&#xff0c;并将每个字符串添加到一个名为 textEdit_recv 的文本编辑器控件中。这是一种在图形用户界面中显示接收到的数据的常见做法。代码本身在结构上看似合理&#xff0c;但要确认其正确性和效率&#xff0c;…

git 问题解决笔记

最近办公电脑坏了送去返修 申请了一个备用机 然后忘记了coding.net的密码 重新改了密码 电脑修好之后发现自己本来的项目拉不了代码了 如下 remote: CODING 提示: Authentication failed. remote: 认证失败&#xff0c;请确认您输入了正确的账号密码。 fatal: Authentication …

echarts图表自适应

项目场景&#xff1a; 图表根据分辨率的大小和浏览器的百分比自适应 问题描述&#xff1a; 图表在浏览器100%的时候正常显示&#xff0c;但是一旦改变百分比或者改变电脑的分辨率&#xff0c;图表就不会自适应。 window.onresize function () {myChart.resize();}; 之前用…

股指期货基差对哪类策略影响最大?

股指期货的基差对市场中性策略的业绩影响最大。市场中性策略是一种旨在通过同时持有多头和空头仓位来对冲市场风险的策略&#xff0c;从而在各种市场环境下都能获得稳定的收益。在这类策略中&#xff0c;投资者通常会买入一篮子股票&#xff08;多头仓位&#xff09;&#xff0…

24深圳杯ABCD题可执行代码+参考论文+图表

A题22页成品论文&#xff0b;代码&#xff0b;参考思路 内容&#xff1a; 简单麦麦https://www.jdmm.cc/file/2710544/ 基于三球定位的多个火箭残骸的准确定位 摘要 随着现代火箭技术快速发展&#xff0c;火箭残骸的精确回收已成为航天领域的一个 重要任务。火箭残骸在坠落…

【Maven】Nexus简单使用

1、安装配置介绍Nexus私服&#xff1a; 安装配置指路上一篇详细教程博客 【Maven】Nexus私服简介_下载安装_登录-CSDN博客 简单介绍原有仓库类型&#xff1a; proxy代理仓库&#xff1a;代理远程仓库&#xff0c;访问全球中央仓库或其他公共仓库&#xff0c;将资源存储在私…

CoreDump调试指南:1、CoreDump简介

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…

JAVA学习-练习试用Java实现“两数之和”

问题&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请在该数组中找出 和为目标值 的那 两个 整数&#xff0c;并返回它们的数组下标。 可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 可以按任意顺序…

JavaEE初阶-多线程进阶1

文章目录 前言一、常见的锁策略1.1 乐观锁与悲观锁1.2 重量级锁与轻量级锁1.3 自旋锁与挂起等待锁1.4 可重入锁与不可重入锁1.5 公平锁与非公平锁1.6 互斥锁与读写锁 二、synchronized的优化策略2.1 锁升级2.2 锁消除2.3 锁粗化 前言 多线程进阶的内容在面试中容易考&#xff…

好用的Tipard 蓝光转换器 (Tipard Blu-ray Converter) mac&win

Tipard Blu-ray Converter 是一款令人惊叹的蓝光解决方案软件&#xff0c;可将蓝光光盘/文件夹转换为 1:1 质量的数字格式&#xff0c;速度提高 30 倍&#xff0c;用于 4K UHD 和 1080p 高清视频。它可以将蓝光光盘和文件夹中的蓝光电影转换为MKV、MP4、WMV、MOV、AVI、FLV、VO…

汽车EDI:IAC Elmdon EDI 对接指南

近期收到客户C公司的需求&#xff0c;需要与其合作伙伴IAC Elmdon建立EDI连接&#xff0c;本文将主要为大家介绍IAC Elmdon EDI 对接指南&#xff0c;了解EDI项目的对接流程。 项目需求 传输协议&#xff1a;OFTP2 IAC Elmdon 与其供应商之间使用的传输协议为OFTP2。OFTP2是…

如何管理研发人员

在日益激烈的市场竞争中&#xff0c;企业的核心竞争力往往取决于其技术创新能力和研发实力。然而&#xff0c;随着企业研发的深入和技术的积累&#xff0c;研发人员泄密的风险也愈发严重。如何防止研发人员泄密&#xff0c;已经成为企业面临的重要问题。本文将从加强员工保密意…

财富加速器!AI智能无人直播,矩阵操作引领您卖货、卖团购券、拓客,助力财富梦想实现!

财富加速器&#xff01;AI智能无人直播&#xff0c;矩阵操作引领您卖货、卖团购券、拓客&#xff0c;助力财富梦想实现&#xff01; 在当今数字化时代&#xff0c;AI智能技术正以惊人的力量催生新的商机&#xff0c;为经济增长注入源源不断的动力。如果您渴望实现财富梦想&…

学习笔记:使用Ollama项目快速本地化部署Qwen 1.5模型

Ollama简介 Ollama是一个开源框架&#xff0c;专门设计用于在本地运行大型语言模型。它的主要特点是将模型权重、配置和数据捆绑到一个包中&#xff0c;从而优化了设置和配置细节&#xff0c;包括GPU使用情况&#xff0c;简化了在本地运行大型模型的过程。Ollama支持macOS和Li…