06-27 周四 理解torch.squeeze和unsqueeze

简介

最近在看动手学深度学习这本书的注意力机制章节,理解起来很吃力,主要原因是一些底层api的具体执行不理解。

代码

unsqueeze

在这里插入图片描述

x=torch.ones((2, 1, 4))
y = torch.ones((2,4,6))
z = torch.bmm(x, y)
print(f"z.shpae: ", z.shape)


weights = torch.ones((2, 10)) * 0.1
values = torch.arange(20.0).reshape(2, 10)
print(f"weights: {weights}, values: {values}")
print(f"weights.shape: {weights.shape}, values.shape: {values.shape}")
t1 = weights.unsqueeze(1)
print(f"t1.shape: {t1.shape}, t1: {t1}")
print(f"values.dim: {values.dim()}")
t2 = values.unsqueeze(-1)
t3 = values.unsqueeze(2)
print(f"t2.shape: {t2.shape}, t2: {t2}")
print(f"t3.shape: {t3.shape}, t3: {t3}")
print(f"t2.dim: {t2.dim()}")

print(torch.bmm(weights.unsqueeze(1), values.unsqueeze(-1)))

输出

z.shpae:  torch.Size([2, 1, 6])
weights: tensor([[0.1000, 0.1000, 0.1000, 0.1000, 0.1000, 0.1000, 0.1000, 0.1000, 0.1000,
         0.1000],
        [0.1000, 0.1000, 0.1000, 0.1000, 0.1000, 0.1000, 0.1000, 0.1000, 0.1000,
         0.1000]]), values: tensor([[ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.],
        [10., 11., 12., 13., 14., 15., 16., 17., 18., 19.]])
weights.shape: torch.Size([2, 10]), values.shape: torch.Size([2, 10])
t1.shape: torch.Size([2, 1, 10]), t1: tensor([[[0.1000, 0.1000, 0.1000, 0.1000, 0.1000, 0.1000, 0.1000, 0.1000,
          0.1000, 0.1000]],

        [[0.1000, 0.1000, 0.1000, 0.1000, 0.1000, 0.1000, 0.1000, 0.1000,
          0.1000, 0.1000]]])
values.dim: 2
t2.shape: torch.Size([2, 10, 1]), t2: tensor([[[ 0.],
         [ 1.],
         [ 2.],
         [ 3.],
         [ 4.],
         [ 5.],
         [ 6.],
         [ 7.],
         [ 8.],
         [ 9.]],

        [[10.],
         [11.],
         [12.],
         [13.],
         [14.],
         [15.],
         [16.],
         [17.],
         [18.],
         [19.]]])
t3.shape: torch.Size([2, 10, 1]), t3: tensor([[[ 0.],
         [ 1.],
         [ 2.],
         [ 3.],
         [ 4.],
         [ 5.],
         [ 6.],
         [ 7.],
         [ 8.],
         [ 9.]],

        [[10.],
         [11.],
         [12.],
         [13.],
         [14.],
         [15.],
         [16.],
         [17.],
         [18.],
         [19.]]])
t2.dim: 3
tensor([[[ 4.5000]],

        [[14.5000]]])

解释
在这里插入图片描述

在 PyTorch 中,对张量进行unsqueeze操作时,dim的取值范围是(-input.dim() - 1, input.dim() + 1)(左闭右开)。
当dim为负数时,表示从后向前计数(即,dim == -1和dim == input.dim()等效)。负的dim值会被转化为dim + input.dim() + 1。

import torch

# 示例 1
a = torch.tensor([1, 2, 3, 4])  
print(a.shape)  # torch.Size([4]) 

b = torch.unsqueeze(a, 0)  
print(b.shape)  # torch.Size([1, 4])  # 在第 0 维(最前面)插入一维

c = torch.unsqueeze(a, 1)  
print(c.shape)  # torch.Size([4, 1])  # 在第 1 维(中间)插入一维

# 示例 2
d = torch.randn(2, 3)  
print(d.shape)  # torch.Size([2, 3]) 

e = torch.unsqueeze(d, 2)  
print(e.shape)  # torch.Size([2, 3, 1])  # 在第 2 维(最后面)插入一维

squeeze

在 PyTorch 中,torch.squeeze() 方法用于对张量的维度进行压缩,即去掉维数为 1 的维度。
其函数原型为:

torch.squeeze(input, dim=None, *, out=None) → Tensor

具体用法如下:
torch.squeeze(a):去掉张量 a 中所有维数为 1 的维度。
a.squeeze(N) 或 torch.squeeze(a, N):去掉张量 a 中指定的维数为 1 的维度 N。
需要注意的是,如果要删除的维度大小不是 1,则 squeeze() 方法不会删除该维度。

import torch

# 示例 1
a = torch.randn(1, 3, 1, 4)
print(a.shape)  # torch.Size([1, 3, 1, 4]) 

b = torch.squeeze(a)
print(b.shape)  # torch.Size([3, 4])  # 去掉所有维数为 1 的维度

# 示例 2
c = torch.randn(2, 1, 2, 1, 2)
print(c.shape)  # torch.Size([2, 1, 2, 1, 2]) 

d = torch.squeeze(c, 1) 
print(d.shape)  # torch.Size([2, 2, 1, 2])  # 去掉维度为 1 的第二维

总结

机器学习的库,欠缺的比较多,还需要不断的积累才行。太痛苦了。

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

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

相关文章

5G赋能安防视频监控:EasyCVR视频汇聚融合创新技术,共筑多场景安全防线

随着科技的快速发展,第五代移动通信技术(5G)已逐渐成为我们生活中的重要组成部分。其中,5G技术以其超高速、低延迟、大连接数的特点,正在深刻改变着我们的生活方式和社会运行模式。安防监控领域作为社会安全的重要组成…

GIT 基于master分支创建hotfix分支的操作

基于master分支创建hotfix分支的操作通常遵循以下步骤: 切换到master分支: 首先,确保你的工作区是最新的,并且你在master分支上。如果不在master分支,你需要先切换过去。 Bash git checkout master 拉取最新的master…

面试题4:POST 比 GET 安全?

不是。HTTP就没有加密功能。 我们知道 GET一般将参数放到URL的查询字符串中,如果是实现登录页面,我们的用户名和密码就直接显示到浏览器的地址栏中了,此时就会轻易的被他人获取账号密码,很不安全。而POST会把参数放到 body 里&am…

微信小程序毕业设计-餐厅点餐系统项目开发实战(附源码+论文)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…

相亲交友微信小程序系统源码

开启浪漫邂逅新篇章 相亲交友——随着年龄的增长,越来越多的人开始关注自己的婚姻问题,为了提高相亲服务的质量,这款应用就可以拓宽在线社交网络范围。​ 💑 引言:邂逅爱情的新方式 在繁忙的都市生活中,寻…

Stateflow快速入门系列(四):使用并行分解对同步子系统建模

要实现并发运行的工作模式,请在 Stateflow 图中使用并行状态。例如,作为复杂系统设计的一部分,您可以使用并行状态对同时被激活的独立组件或子系统建模。 状态分解 图或状态的分解类型指定图或状态包含互斥状态还是并行状态: 互…

Java 项目的构建工具 Maven

Maven 一、Maven 简介二、Maven 安装配置1、Maven 下载安装2、Maven 配置 三、IDEA 集成 Maven四、Maven 依赖管理1、依赖配置2、依赖传递3、依赖范围4、生命周期 五、Maven 高级特性1、分模块设计与开发2、Maven 继承3、Maven 版本管理4、Maven 聚合5、私服 一、Maven 简介 M…

记录一次即将出现的钓鱼新方式

钓鱼通常是内网渗透过程中的最为常见的入口方式,但是随着蓝队人员溯源反制思路开阔,入侵排查能力提升,钓鱼也越来越困难,这里就记一种不同寻常的钓鱼方式。 pip install 的执行流程: 先获取到远端的服务器地址 url 比…

MHA、MMM高可用方案及故障切换

目录 一、MHA高可用方案 1、MHA的组成 2、MHA的工作原理 3、部署MHA架构 第一部分:一主两从数据库架构部署 1、全部更改主机名、初始化操作、开启mysql服务、设置主机名管理、时间同步 2、MySQL服务器做主从复制 3、测试主从效果 第二部分:MHA架…

【DC-DC升压电推剪方案】FP6277,FP6296电源升压芯片在电推剪中扮演着一个怎样的角色?带你深入了解电推剪的功能和应用及工作原理

随着人们对个人形象要求的不断提高,理发器作为一个必备的家居用品,也在不断进行技术升级。而其中的核心装备之一,电推剪理发器升压芯片FP6277、FP6296,正在引领着现代理发技术的突破。本文将给大家带来的是电推剪在传统意义上运用…

基于稀疏矩阵方法的剪枝压缩模型方案总结

1.简介 1.1目的 在过去的一段时间里,对基于剪枝的模型压缩的算法进行了一系列的实现和实验,特别有引入的稀疏矩阵的方法实现了对模型大小的压缩,以及在部分环节中实现了模型前向算法的加速效果,但是总体上模型加速效果不理想。所…

基于yolo的物体识别坐标转换

一、模型简介: 1.1、小孔成像模型简图如下:不考虑实际相机中存在的场曲、畸变等问题 相对关系为: 为了表述与研究的方便,我们将像面至于小孔之前,且到小孔的距离仍然是焦距f,这样的模型与原来的小孔模型是等价的 相对关系为: 二、坐标系简介: **世界坐标系(world coo…

Python26 Lambda表达式

1.什么是lambda表达式 lambda 是 Python 中的一个关键字,用于定义简单的匿名函数。与 def 关键字定义的标准函数不同,lambda 函数主要用于需要一个函数对象作为参数的简短操作。lambda 函数的设计哲学是简洁,因此它只能包含一条表达式&#…

【投稿优惠|稳定检索】2024年文化传播、交流与考古学国际会议 (CCEA 2024)

2024年文化传播、交流与考古学国际会议 (CCEA 2024) 2024 International Conference on Cultural Communication, Exchange, and Archaeology 【重要信息】 大会地点:西安 官网地址:http://www.icccea.com 投稿邮箱:iccceasub-conf.com 【注…

Pytest+Allure+Yaml+Jenkins+Gitlab接口自动化中Jenkins配置

一、背景 Jenkins(本地宿主机搭建) 拉取GitLab(服务器)代码到在Jenkins工作空间本地运行并生成Allure测试报告 二、框架改动点 框架主运行程序需要先注释掉运行代码(可不改,如果运行报allure找不到就直接注释掉) …

人工神经网络是什么,其应用有哪些?

人工神经网络是什么,其应用有哪些? 当你阅读这篇文章时,你身体的哪个器官正在考虑它?当然是大脑!但是你知道大脑是如何工作的吗?嗯,它有神经元或神经细胞,它们是大脑和神经系统的主要…

检测故障电容器

去耦电容与旁路电容 “去耦电容”和“旁路电容”这两个术语经常互换使用,它们的功能重叠,容易造成混淆。实际上,它们的用途相似,但在电路中的应用可能会影响术语。 去耦电容 功能:去耦电容器主要用于通过为交流信号…

全面芯片外贸指南解密IC电子元器件商城网站搭建/制作/开发策略

电子元器件行业在数字化转型的大潮下正经历着前所未有的变革。传统销售渠道的局限性日益凸显,越来越多的企业和商家开始寻求线上突破,搭建自己的IC电子元器件商城网站成为提升市场竞争力的关键一步。本篇文章道合顺芯站点将详细阐述搭建IC电子元器件商城…

浏览器页面打不开(网络连接正常的情况下)

目录 一、代理被打开 二、DNS被篡改 三、网络配置出现问题 四、浏览器配置问题 一、代理被打开 1. 右击Wifi图标 2.点击“打开网络和internet设置” 3. 点击代理,把该窗口所有的东西都关闭,尤其是代理服务器 二、DNS被篡改 如果第一个方法不行&am…

00. 这里整理了最全的爬虫框架(Java + Python)

目录 1、前言 2、什么是网络爬虫 3、常见的爬虫框架 3.1、java框架 3.1.1、WebMagic 3.1.2、Jsoup 3.1.3、HttpClient 3.1.4、Crawler4j 3.1.5、HtmlUnit 3.1.6、Selenium 3.2、Python框架 3.2.1、Scrapy 3.2.2、BeautifulSoup Requests 3.2.3、Selenium 3.2.4…