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])  # 一致

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Security实现用户认证一:简单示例

Spring Security实现用户认证一&#xff1a;简单示例 1 原理1.1 用户认证怎么进行和保存的&#xff1f;认证流程SecurityContext保存 2 创建简单的登录认证示例2.1 pom.xml依赖添加2.2 application.yaml配置2.3 创建WebSecurityConfig配置类2.4 测试 1 原理 Spring Security是…

React 第三十八章 React 中的位运算

位运算是一种计算机编程中常用的操作&#xff0c;它直接对二进制位进行操作。二进制&#xff0c;指的就是以二为底的一种计数方式&#xff0c;常见的还有八进制、十进制、十六进制。 十进制0123456789101112131415二进制0000000100100011010001010110011110001001101010111100…

【面试干货】 两个有序数组的合并排序

【面试干货】 两个有序数组的合并排序 1、实现思想2、代码实现 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、实现思想 使用两个指针分别指向两个数组的起始位置&#xff0c;然后逐个比较两个指针所指向的元素&#xff0c;将较小的元素…

【全开源】场地预定小程序支持微信小程序+微信公众号+H5

XYvenue是基于FastAdminUniApp开发的多场馆场地预定小程序&#xff0c;提供运动场馆运营解决方案&#xff0c;适用于体育馆、羽毛球馆、兵乒球馆、篮球馆、网球馆等场馆。 功能特性 1、场馆管理 可添加多个预约场馆&#xff0c;小程序端切换场馆显示。 2、场地管理 可添加多…

C语言如何删除表中指定位置的结点?

一、问题 如何删除链表中指定位置的结点&#xff1f; 二、解答 删除链表中指定的结点&#xff0c;就像是排好队的⼩朋友⼿牵着⼿&#xff0c;将其中⼀个⼩朋友从队伍中分出来&#xff0c;只需将这个⼩朋友的双⼿从两边松开。 删除结点有两种情况&#xff1a; &#xff08;1&am…

怎么删除pdf中的某一页?五种高效删除方法

怎么删除pdf中的某一页&#xff1f;PDF文件是我们在工作中经常需要处理的一类文件&#xff0c;它的格式很稳定&#xff0c;不易修改。但是&#xff0c;有时候我们可能需要对PDF文件进行编辑&#xff0c;比如删除其中的某一页。本文将为你介绍五种高效的方法&#xff0c;帮助你轻…

python 脚本压缩文件linux 正常,windows 文件夹/文件名称 被加上了上级文件夹名

场景&#xff1a; php 在调用python 脚本&#xff0c;进行文件压缩&#xff08;因为php的压缩大文件总是超时&#xff09;&#xff0c;linux/mac 环境文件/文件夹名压缩前后一致&#xff0c;windows 压缩后 文件/文件夹名被改变为 上级 文件夹原名 原因&#xff1a; window…

短视频批量剪辑,智能素材文案生成,多账号授权私信回复与矩阵发布素材功能合集系统,短视频矩阵助手源码搭建部署源码开源部署方案。

目录 一、短视频矩阵助手系统是什么&#xff1f; 二、短视频矩阵助手系统可以为企业解决什么问题&#xff1f; 短视频矩阵助手可以解决哪些问题&#xff1f; 三、短视频矩阵助手系统功能有哪些&#xff1f; 四、总结 一、短视频矩阵助手系统是什么&#xff1f; 短视频矩阵…

提升LED显示屏散热效能的五大策略

在现代生活中&#xff0c;LED显示屏已成为不可或缺的信息展示工具&#xff0c;其广泛应用于商业广告、公共信息发布、舞台表演等多个领域。然而&#xff0c;随着LED显示屏的长时间运行&#xff0c;散热问题逐渐凸显&#xff0c;不仅影响设备的稳定性和寿命&#xff0c;还可能导…

Python实战开发及案例分析(25)—— 爬山算法

爬山算法&#xff08;Hill Climbing&#xff09;是一种启发式搜索算法&#xff0c;常用于解决优化问题。它的核心思想是从一个初始解开始&#xff0c;不断朝着增益最大的方向移动&#xff0c;直到达到局部最优解。 实现步骤 从初始解开始。在当前解的邻域中找到一个更好的解。…

Java入门基础学习笔记26——break,continue

跳转关键字&#xff1a; break&#xff1a; 跳出并结束当前所在循环的执行。 continue&#xff1a; 用于跳出当前循环中的当次执行&#xff0c;直接进入循环中的下一次执行。 package cn.ensource.loop;public class BreakContinueDemo8 {public static void main(String[] a…

AI大语言模型在公共服务中的应用实例

随着计算机技术的飞速发展&#xff0c;人工智能已经成为了当今科技领域的热门话题。从早期的图灵测试到现在的深度学习和神经网络&#xff0c;人工智能已经取得了令人瞩目的成就。特别是近年来&#xff0c;大数据、云计算、高性能计算等技术的发展为人工智能的研究提供了更加广…

怎么做微信预约链接_微信预约新风尚

在快节奏的现代生活中&#xff0c;我们都渴望找到一种既方便又高效的方式来处理日常事务。无论是预约看病、预约美容&#xff0c;还是预约一场心仪的讲座或活动&#xff0c;我们都希望能够一键搞定&#xff0c;省时省力。今天&#xff0c;就让我来为大家揭秘如何制作一个微信预…

Facebook海外企业户/海外企业三不限户稳定性怎么样?

Facebook是做跨境电商卖家最有效的营销工具之一&#xff0c;不过相对的在Facebook上的广告竞争也会越来越激烈。目前外贸行业发展迅速。Facebook作为每天拥有30亿人口的活跃网络平台&#xff0c;约占全球网络用户的30%。平均来说&#xff0c;它的用户愿意每天花60分钟在平台上浏…

美港通正规股票交易市场人民币突然拉升,市场开启“大风车”模式?

查查配今天上午,市场又开启了“大风车”模式,多个热点轮番拉升。 一则关于地产行业利好的小作文流出,地产产业链上午爆发,租售同权、房地产服务、房地产开发等板块大涨,光大嘉宝、天地源等个股涨停。万科A涨超4%。 美港通证券以其专业的服务和较低的管理费用在市场中受到不少…

【上海生物发酵展精选展商】三门峡市高瑞生物技术有限公司

三门峡市高瑞生物技术有限公司注册成立于2017年2月23日&#xff0c;经营范围是微生物培养基原材料制造、销售。2017年度因场地搬迁、异地重建&#xff0c;公司由“三门峡市高山生物制品有限公司”更名为“三门峡市高瑞生物技术有限公司”。 该公司具有20余年丰富经验的微生物培…

对话 Databend Labs 联合创始人王吟:大模型浪潮里,云数仓是宠儿 | 极新企服直播实录

以下文章来源于极新 &#xff0c;作者王吟 据 IDC 预测&#xff0c;随着企业数字化转型&#xff0c;到 2026 年&#xff0c;中国大数据 IT 支出将达到 360 亿美元。Gartner 预测&#xff0c;得益于托管云服务的推动&#xff0c;到 2023 年&#xff0c;全球数据库市场有望达到 1…

超声波清洗机哪家好一点?四款超一流超声波清洗机大盘点

在追求极致清洁和维护精密工具、设备及珍贵物品的时代&#xff0c;超声波清洗机显得尤为重要。不仅因其高效、快速的清洁效果&#xff0c;更因其能够触及传统手工清洁所不能及的微小缝隙。无论你是珠宝设计师、机械工程师、还是热爱生活的普通家庭用户&#xff0c;超声波清洗机…

ValueError: Colors must be aRGB hex values

使用 openpyxla填充颜色时出现此错误