unsqueeze() 方法与squeeze() 方法

news/2024/5/20 12:47:22

unsqueeze() 方法在 PyTorch 中用于在指定的维度位置插入一个维度大小为 1 的新维度。

tips:

()内指定维度位置,‘0’表示第一个维度位置,以此类推‘1’ ‘2’ ‘3’.......

1.增加一个维度

import torch# 创建一个形状为 [4] 的一维张量
x = torch.tensor([1, 2, 3, 4])# 使用 unsqueeze 在第一个维度位置增加一个维度,结果形状变为 [1, 4]
x_unsqueezed = x.unsqueeze(0)print(x.shape)
print(x)
print('*'*50)
print(x_unsqueezed.shape)
print(x_unsqueezed)# 输出:
torch.Size([4])
tensor([1, 2, 3, 4])
**************************************************
torch.Size([1, 4])
tensor([[1, 2, 3, 4]])

2.在中间维度插入一个维度

# 创建一个形状为 [3, 4] 的二维张量
x = torch.tensor([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]])# 使用 unsqueeze 在第二个维度位置增加一个维度,结果形状变为 [3, 1, 4]
x_unsqueezed = x.unsqueeze(1)print(x.shape)
print(x)
print('*'*50)
print(x_unsqueezed.shape)
print(x_unsqueezed)# 输出
torch.Size([3, 4])
tensor([[ 1,  2,  3,  4],[ 5,  6,  7,  8],[ 9, 10, 11, 12]])
**************************************************
torch.Size([3, 1, 4])
tensor([[[ 1,  2,  3,  4]],[[ 5,  6,  7,  8]],[[ 9, 10, 11, 12]]])

3.在特定位置插入多个维度

# 创建一个形状为 [2, 2] 的二维张量
x = torch.tensor([[1, 2],[3, 4]])
# 使用 unsqueeze 在第一和第三维度位置各增加一个维度,结果形状变为 [1, 2, 1, 2]
x_unsqueezed = x.unsqueeze(0).unsqueeze(2)print(x.shape)
print(x)
print('*'*50)
print(x_unsqueezed.shape)
print(x_unsqueezed)# 输出:
torch.Size([2, 2])
tensor([[1, 2],[3, 4]])
**************************************************
torch.Size([1, 2, 1, 2])
tensor([[[[1, 2]],[[3, 4]]]])

4.使用 unsqueeze 进行广播

# 创建一个形状为 [4] 的一维张量
a = torch.tensor([1, 2, 3, 4])# 创建一个形状为 [3, 4] 的二维张量
b = torch.tensor([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]])# 使用 unsqueeze 使 a 可以广播到 b 的形状
a_unsqueezed = a.unsqueeze(0)  # 形状变为 [1, 4]# 现在 a_unsqueezed 和 b 可以进行广播操作
result = a_unsqueezed + bprint(a.shape)
print(a)
print(a_unsqueezed)
print('*'*50)
print(b.shape)
print(b)
print('*'*50)
print(result)# 输出
torch.Size([4])
tensor([1, 2, 3, 4])
tensor([[1, 2, 3, 4]])
**************************************************
torch.Size([3, 4])
tensor([[ 1,  2,  3,  4],[ 5,  6,  7,  8],[ 9, 10, 11, 12]])
**************************************************
tensor([[ 2,  4,  6,  8],[ 6,  8, 10, 12],[10, 12, 14, 16]])

5.在多维张量中插入多个维度

# 创建一个形状为 [2, 3, 4] 的三维张量
x = torch.randn(2, 3, 4)# 使用 unsqueeze 在第二和第四维度位置各增加一个维度,结果形状变为 [2, 1, 3, 1, 4]
x_unsqueezed = x.unsqueeze(1).unsqueeze(3)print(x.shape)
print(x)
print('*'*50)
print(x_unsqueezed.shape)
print(x_unsqueezed)# 输出
torch.Size([2, 3, 4])
tensor([[[ 0.7232, -1.1270, -0.3702, -0.6435],[ 1.2270, -0.6766,  1.0700, -1.4295],[-0.6011,  0.0285, -0.2584, -0.9866]],[[ 0.8701,  1.1882, -0.6923,  0.9238],[ 0.6200,  1.7528,  1.1101,  0.3141],[-0.7319,  0.1732, -0.5922,  0.4118]]])
**************************************************
torch.Size([2, 1, 3, 1, 4])
tensor([[[[[ 0.7232, -1.1270, -0.3702, -0.6435]],[[ 1.2270, -0.6766,  1.0700, -1.4295]],[[-0.6011,  0.0285, -0.2584, -0.9866]]]],[[[[ 0.8701,  1.1882, -0.6923,  0.9238]],[[ 0.6200,  1.7528,  1.1101,  0.3141]],[[-0.7319,  0.1732, -0.5922,  0.4118]]]]])

6.将标量转换为张量

import torch# 创建一个标量值
scalar = 5# 将标量转换为一个 PyTorch 张量
scalar_tensor = torch.tensor(scalar)# 使用 unsqueeze 在第一个维度位置增加一个维度,结果形状变为 [1]
scalar_tensor_unsqueeze = scalar_tensor.unsqueeze(0)print(type(scalar))
print(scalar_tensor.shape)
print(scalar_tensor)
print('*'*50)
print(scalar_tensor_unsqueeze.shape)
print(scalar_tensor_unsqueeze)# 输出
<class 'int'>
torch.Size([])
tensor(5)
**************************************************
torch.Size([1])
tensor([5])

squeeze() 函数在 PyTorch 中用于从张量中移除所有长度为 1 的维度。这通常用于减少张量的维度,特别是在某些操作之后,其中某些维度可能只有一个元素,而这些单一元素的维度不再需要。

 1.移除单维度

import torch# 创建一个形状为 [1, 3, 1] 的张量
x = torch.randn(1, 3, 1)# 使用 squeeze() 移除单维度
y = x.squeeze()# 打印 y 的形状
print(y.shape)  # 输出: torch.Size([3])

2.选择性移除单维度 

# 创建一个形状为 [2, 1, 4, 1] 的张量
x = torch.randn(2, 1, 4, 1)# 使用 squeeze(1) 移除第二个维度
y = x.squeeze(1)# 打印 y 的形状
print(y.shape)  # 输出: torch.Size([2, 4, 1])

 3.移除所有单维度

# 创建一个形状为 [1, 2, 1, 3, 1] 的张量
x = torch.randn(1, 2, 1, 3, 1)# 使用 squeeze() 移除所有单维度
y = x.squeeze()# 打印 y 的形状
print(y.shape)  # 输出: torch.Size([2, 3])


http://www.mrgr.cn/p/03326313

相关文章

css mix-blend-mode 层叠样式属性各类效果

官方给出的定义是&#xff1a;mix-blend-mode css 属性描述了元素的内容应该与元素的直系父元素的内容和元素的背景如何混合。 通俗来讲&#xff0c;就是一张图片跟它的父级元素背景色的融合方式。 大致分为以下16种&#xff1a; mix-blend-mode: normal; mix-blend-mode: m…

数据结构--链表进阶面试题

在链表题目开始之前我们来复习一道数组元素的逆序问题&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 提示&#xff1a; 1 < nums.length < 10^5-2^31 < nums[i] < 2^31 - 10 < k < 10^5 思…

Sarcasm detection论文解析 |使用 BERT 进行中间任务迁移学习的刺检测

论文地址 论文地址&#xff1a;https://www.mdpi.com/2227-7390/10/5/844#/ github&#xff1a;edosavini/TransferBertSarcasm (github.com) 论文首页 笔记框架 使用 BERT 进行中间任务迁移学习的讽刺检测 &#x1f4c5;出版年份:2022 &#x1f4d6;出版期刊:Mathematics &…

自定义表单元素组件内容变化触发ElForm重新校验

对于下图中“付费类型”怎么实现有很多种方式&#xff0c;我能想到的是以下两种&#xff1a; Element Plus的RadioButton自定义组件 1. RadioButton 它本质上就是一个单选组件&#xff0c;它跟Element Plus的RadioButton本质上没有区别&#xff0c;无非是外观上的差别。那么…

2024 年 5 月 8 日 周三 晴 热(471 字)

正文翻开日历,才注意到已经立夏了呢。今天总结起来,就一个字:累。下午跑了三个乡镇,去找镇长对接帐户的事情。虽说我是被迫拉上的,不用自己操心,但是坐车真的很累。时间长,4 个多小时,弯道多,气热。最后跑完回到行里的时候感觉人快死掉了。并且因为这件事,中午觉也没…

TLP元素与PCIE数据流

不同于并行总线,PCIe 这样的串行总线不使用总线上的控制信号来表示某时刻链路上正在发生什么。相反地,PCIe 链路上的发送方发出的比特流必须要有一个预期的大小,还要有一个可供接收方辨认的格式,这样接收方才能理解比特流的内容。此外,PCIe 在传输数据包时并不使用任何直接…

高效备战!2024年陕西省绿色工厂申报条件好处和各地区奖补

什么是绿色工厂&#xff1f; 绿色工厂是制造业的生产单元&#xff0c;是绿色制造的实施主体&#xff0c;属于绿色制造体系的核心支撑单元&#xff0c;侧重于生产过程的绿色化。 通过采用绿色建筑技术建设、改造厂房&#xff0c;预留可再生能源应用场所和设计负荷&#xff0c;…

ESD静电问题 | 摄像头空气放电重启

【转自微信公众号&#xff1a;必学大课堂】

情感分类学习笔记(1)

文本情感分类&#xff08;二&#xff09;&#xff1a;深度学习模型 - 科学空间|Scientific Spaces 一、代码理解 cw lambda x: list(jieba.cut(x)) #定义分词函数 您给出的代码定义了一个使用 jieba 分词库的分词函数。jieba 是一个用于中文分词的 Python 库。该函数 cw 是…

添加一个索引要投产,需要哪些步骤?

编程一生 致力于写大家都能看懂的、有深度的 技术文章 05/2024 01 开场白 亚马逊有个bar raiser文化。就是说新招来的人一定要超过之前入职人员的平均水平&#xff0c;宁缺毋滥。越来越多的公司在推行这种文化。在这种氛围下&#xff1a;“虽然我不懂&#xff0c;但是活儿是能出…

如何把多个文件(夹)平均复制到多个文件夹中

首先,需要用到的这个工具:度娘网盘 提取码:qwu2 蓝奏云 提取码:2r1z假定的情况是,共有20个兔兔的图片,想要平均的复制4个文件夹里,那么每个文件夹里面就有5个图片(如果是5个,那每个自然是4个,具体除数是多少,根据实际情况即可)打开工具,切换到 文件批量复制 版块找…

一键自动化博客发布工具,用过的人都说好(cnblogs篇)

使用一键自动化博客发布工具blog-auto-publishing-tools把博客发布到cnblogs上。cnblogs和其他的博客平台相比会比较复杂,需要设置的项目也比较多一些,弄懂了cnblogs的实现方式,那么你应该对selenium的整个框架使用已经烂熟于心了。 除了正常的标题,内容,摘要之外,cnblog…

如何把多个文件(夹)随机复制到多个文件夹中

首先,需要用到的这个工具:度娘网盘 提取码:qwu2 蓝奏云 提取码:2r1z先看文件的情况一共20个兔兔的图片,4个文件夹,把全部的图片随机的复制这些地方去打开工具,切换到 文件批量复制 版块找到右下角的 设置,点击打开勾选“随机复制”,把文件进行随机的复制选中全部的兔兔…

【微信小程序开发】微信小程序、大前端之flex布局方式详细解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

软件测试过程中的痛点思考

前几天无意中看到了TesterHome发起的《2023年度软件质量保障行业调查报告》,文中提到了几点调查结果和分析结论让我很感兴趣。针对这份调查报告,我想就下述三点结论谈谈我的一些理解和思考。一、测试参与度分析 在这一调查报告结论中,提到了需求评审、测试计划和测试评审是整…

如何把多个文件(夹)向上移动1层(或多层)(在批量复制前或后进行)

首先,需要用到的这个工具:度娘网盘 提取码:qwu2 蓝奏云 提取码:2r1z假定情况是,我要把下图里的4个文件夹内部的全部文件,合并到04的当前位置来(4个文件夹里面各有5个兔兔的图片)打开工具,切换到 文件批量复制 版块找到右下角的 更多 ,点击,来设置上移的情况勾选“来…

Qt元对象系统自带类型与注册类型的判断

通过isRegistered()方法判断 在Qt跨线程传参时,使用信号槽connect或者调用QMetaInvokeMethon时,传递的参数的类型通常要注意是不是已在Qt的元对象系统中注册过了,Qt提供了方法来判断类型是否被注册: bool QMetaType::isRegistered(int type)其中参数是枚举类型,参数例子: …

JAVA栈相关习题3

1.将递归转化为循环 比如&#xff1a;逆序打印链表 // 递归方式void printList(Node head){if(null ! head){printList(head.next);System.out.print(head.val " ");}} // 循环方式void printList(Node head){if(nullhead){return;}Stack<Node> snew Stack<…

Qt元对象系统自带类型与注册类型

通过isRegistered()方法判断 在Qt跨线程传参时,使用信号槽connect或者调用QMetaInvokeMethon时,传递的参数的类型通常要注意是不是已在Qt的元对象系统中注册过了,Qt提供了方法来判断类型是否被注册: bool QMetaType::isRegistered(int type)其中参数是枚举类型,参数例子: …

将ESP工作为AP路由模式并当成服务器

将ESP8266模块通过usb转串口接入电脑 ATCWMODE3 //1.配置成双模ATCIPMUX1 //2.使能多链接ATCIPSERVER1 //3.建立TCPServerATCIPSEND0,4 //4.发送4个字节在链接0通道上 >ATCIPCLOSE0 //5.断开连接通过wifi找到安信可的wifi信号并连接 连接后查看自己的ip地址变为192.168.4.…