Pytorch基础:Tensor的squeeze和unsqueeze方法
相关阅读
Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm=1001.2014.3001.5482
在Pytorch中,squeeze和unsqueeze是Tensor的一个重要方法,同时它们也是torch模块中的一个函数,它们的语法如下所示。
Tensor.squeeze(dim=None) → Tensor
torch.squeeze(input, dim=None) → Tensorinput (Tensor) – the input tensor.
dim (int or tuple of ints, optional) – if given, the input will be squeezed only in the specified dimensions.Tensor.unsqueeze(dim) → Tensor
torch.unsqueeze(input, dim) → Tensorinput (Tensor) – the input tensor.
dim (int) – the index at which to insert the singleton dimension
一、squeeze
squeeze函数(或方法)返回一个新的张量,该张量移除了原张量中大小为1的维度,例如:输入张量的形状是(A×1×B×C×1×D),使用了squeeze函数(或方法)后,输出张量的形状是(A×B×C×D)。请注意:输出张量将与输入张量共享底层存储,因此改变一个张量的内容将改变另一个张量的内容。默认情况下,squeeze将移除所有尺寸为1的维度,如果传递了dim参数,则会将dim中的维度展开。dim的范围可以是[-input.dim()-1, input.dim()],其中负数索引表示从后往前数的位置,例如-1代表最后一个维度。
可以看下面的例子以更好的理解:
import torch# 创建一个形状为 (2, 1, 2, 1, 2) 的张量
x = torch.zeros(2, 1, 2, 1, 2)
print(x, x.size(), id(x))# 移除所有大小为1的维度
a = torch.squeeze(x) # 等价于 a = x.squeeze()
print(a, a.size(), id(a))# 尝试移除第0维度(由于第0维度大小不为1,因此不改变形状)
b = torch.squeeze(x, 0) # 等价于 b = x.squeeze(0)
print(b, b.size(), id(b))# 移除第1维度(第1维度大小为1)
c = torch.squeeze(x, 1) # 等价于 c = x.squeeze(1)
print(c, c.size(), id(c))# 移除第1、第2和第3维度(第1和第3维度大小为1,第2维度不变)
d = torch.squeeze(x, (1, 2, 3)) # 等价于 d = x.squeeze((1, 2, 3))
print(d, d.size(), id(d))# 验证所有张量共享底层存储空间
print(x.storage().data_ptr() == a.storage().data_ptr() == b.storage().data_ptr() == c.storage().data_ptr() == d.storage().data_ptr()) # 共享底层存储空间输出:
tensor([[[[[0., 0.]],[[0., 0.]]]],[[[[0., 0.]],[[0., 0.]]]]]) torch.Size([2, 1, 2, 1, 2]) 1899057117680tensor([[[0., 0.],[0., 0.]],[[0., 0.],[0., 0.]]]) torch.Size([2, 2, 2]) 1899057158240tensor([[[[[0., 0.]],[[0., 0.]]]],[[[[0., 0.]],[[0., 0.]]]]]) torch.Size([2, 1, 2, 1, 2]) 1899737467296tensor([[[[0., 0.]],[[0., 0.]]],[[[0., 0.]],[[0., 0.]]]]) torch.Size([2, 2, 1, 2]) 1899737467376tensor([[[0., 0.],[0., 0.]],[[0., 0.],[0., 0.]]]) torch.Size([2, 2, 2]) 1899737467216
True
二、 unsqueeze
unsqueeze函数(或方法)函数返回一个新的张量,该张量在指定维度(dim)插入一个大小为1的维度。使用unsqueeze函数(或方法)后,输入张量的形状会相应增加一个维度。例如,输入张量的形状是(A×B×C),在第1维度使用unsqueeze后,输出张量的形状将变为(A×1×B×C)。请注意,输出张量将与输入张量共享底层存储,因此改变一个张量的内容将改变另一个张量的内容。dim的范围可以是[-input.dim(), input.dim()-1],其中负数索引表示从后往前数的位置,例如-1代表最后一个维度。
可以看下面的例子以更好的理解:
import torch# 创建一个形状为 (2, 2, 2) 的张量
x = torch.zeros(2, 2, 2)
print(x, x.size(), id(x))# 在第0维度插入单维度
a = torch.unsqueeze(x, 0) # 等价于 a = x.unsqueeze(0)
print(a, a.size(), id(a))# 在第1维度插入单维度
b = torch.unsqueeze(x, 1) # 等价于 b = x.unsqueeze(1)
print(b, b.size(), id(b))# 在第2维度插入单维度
c = torch.unsqueeze(x, 2) # 等价于 c = x.unsqueeze(2)
print(c, c.size(), id(c))# 在第3维度插入单维度
d = torch.unsqueeze(x, 3) # 等价于 d = x.unsqueeze(3)
print(d, d.size(), id(d))# 验证所有张量共享底层存储空间
print(x.storage().data_ptr() == a.storage().data_ptr() == b.storage().data_ptr() == c.storage().data_ptr() == d.storage().data_ptr()) # 共享底层存储空间输出:
tensor([[[0., 0.],[0., 0.]],[[0., 0.],[0., 0.]]]) torch.Size([2, 2, 2]) 1509028592032tensor([[[[0., 0.],[0., 0.]],[[0., 0.],[0., 0.]]]]) torch.Size([1, 2, 2, 2]) 1509028632592tensor([[[[0., 0.],[0., 0.]]],[[[0., 0.],[0., 0.]]]]) torch.Size([2, 1, 2, 2]) 1507561225888tensor([[[[0., 0.]],[[0., 0.]]],[[[0., 0.]],[[0., 0.]]]]) torch.Size([2, 2, 1, 2]) 1507561391824tensor([[[[0.],[0.]],[[0.],[0.]]],[[[0.],[0.]],[[0.],[0.]]]]) torch.Size([2, 2, 2, 1]) 1507561391904
True
相关文章:

Pytorch基础:Tensor的squeeze和unsqueeze方法
相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 在Pytorch中,squeeze和unsqueeze是Tensor的一个重要方法,同时它们也是torch模块中的一个函数,它们的语法如下所示。 Tensor.…...

PHP压缩打包,下载目录或者文件,解压zip文件
函数 /*** 压缩整个文件夹为zip文件* 本地需要绝对路径,服务器需要相对路径*/function makeZipFile($zip_path , $folder_path ) {$rootPath realpath($folder_path);$zip new ZipArchive(); // $zip->open($zip_path, ZipArchive::CREATE | ZipArchi…...

后端面试题日常练-day08 【Java基础】
题目 希望这些选择题能够帮助您进行后端面试的准备,答案在文末 Java中的静态变量和实例变量有何区别? a) 静态变量属于类,实例变量属于对象 b) 静态变量只能在静态方法中访问,实例变量只能在实例方法中访问 c) 静态变量在类加载时…...

Linux:core文件无法生成排查步骤
1、进程的RLIMIT_CORE或RLIMIT_SIZE被设置为0。使用getrlimit和ulimit检查修改。 使用ulimit -a 命令检查是否开启core文件生成限制 如果发现-c后面的结果是0,就临时添加环境变量ulimit -c unlimited,之后在启动程序观察是否有core生成,如果…...

大模型学习资源
上一篇扯了一堆废话,关于大模型,提供一下建议 说实话,大模型更新太快,以我30岁的高龄实在不适合再去研究技术。偶然发现,国内的大模型厂家在做推广的培训。比如上海人工智能实验室,阿里,百度。…...

约定(模拟赛2 T3)
题目描述 小A在你的帮助下成功打开了山洞中的机关,虽然他并没有找到五维空间,但他在山洞中发现了无尽的宝藏,这个消息很快就传了出去。人们为了争夺洞中的宝藏相互陷害,甚至引发了战争,世界都快要毁灭了。小A非常地难…...

Java推送xml数据进行http请求
将json转成xml数据进行推送,打印出最终推送xml的数据格式,再调整代码 直接上代码,详情请看代码注释 public void pushReceipt(JSONObject jsonObj) {try {// 创建 XML 文档Document doc createXmlDocument();// 构建 XML 结构Element rootE…...

Docker安装 OpenResty详细教程
OpenResty 是一个基于 Nginx 的高性能 Web 平台,它集成了 Lua 脚本语言,使得开发者可以在 Nginx 服务器上轻松地进行动态 Web 应用开发。OpenResty 的核心目标是通过将 Nginx 的高性能与 Lua 的灵活性结合起来,提供一个强大且高效的 Web 开发…...

前端位运算运用场景小知识(权限相关)
前提:此篇结合AI、公司实际业务产出,背景是公司有个业务涉及权限,用位运算来控制的,比较新奇,所以记录一下(可能自己比较low) 前端js位运算一般实际的应用场景在哪 ai回答: 整数运算与性能优化ÿ…...

【云原生】Kubernetes中的DaemonSet介绍、原理、用法及实战应用案例分析
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

使用框架构建React Native应用程序的最佳实践
在React Conf上,我们更新了关于开始构建React Native应用程序的最佳工具的指导:一个React Native框架——一个包含所有必要API的工具箱,让您能够构建生产就绪的应用程序。 现在推荐使用React Native框架(如Expo)来创建…...

Godot入门 02玩家1.0版
添加Node2D节点,重命名Game 创建玩家场景,添加CharacterBody2D节点 添加AnimatedSprite2D节点 从精灵表中添加帧 选择文件 设置成8*8 图片边缘模糊改为清晰 设置加载后自动播放,动画循环 。动画速度10FPS,修改动画名称idle。 拖动…...

Docker-Compose配置zookeeper+KaFka+CMAK简单集群
1. 本地DNS解析管理 # 编辑hosts文件 sudo nano /etc/hosts # 添加以下三个主机IP 192.168.186.77 zoo1 k1 192.168.186.18 zoo2 k2 192.168.186.216 zoo3 k3注:zoo1是192.168.186.77的别名,zoo2是192.168.186.18的别名,zoo3是192.168.186.1…...

Python中,集合几种基本运算
在Python中,集合具有几种基本的集合运算,这些运算可以用于处理集合中的数据。以下是Python集合的常见运算,包括并集、交集、差集和对称差集等,并提供代码示例来显示其用法。 并集 (Union) 并集是两个集合中所有唯一元素的结合&a…...

netsuite查询货品库存
//单品可用数量获取var inventorySearch search.create({type: inventoryitem,filters: [[internalid, is, lineItem2.nsSkuId] // 根据 SKU ID 进行筛选],columns: [search.createColumn({name: locationquantityavailable,summary: SUM}) // 获取可用库存总和]});var result…...

Java 实现分页的几种方式详解
目录 分页概述Java实现分页的几种方式 手动分页基于JDBC的分页基于Hibernate的分页基于MyBatis的分页[基于Spring Data JPA的分页](#基于Spring Data JPA的分页)使用PageHelper插件的分页 分页中的注意事项总结 分页概述 分页是指将大量数据分成若干小块,每次只显…...

vite构建vue3项目hmr生效问题踩坑记录
vite构建vue3项目hmr生效问题踩坑记录 hmr的好处 以下是以表格形式呈现的前端开发中HMR(热模块替换)带来的好处: 好处描述提升开发效率允许开发者在不刷新整个页面的情况下实时更新修改的代码,减少等待时间保持应用状态在模块替…...

区块链赋能民生大数据
区块链技术作为一种新兴的信息技术,其在民生大数据领域的应用正逐渐展现出巨大的潜力和价值。以下是对区块链赋能民生大数据的详细阐述: 一、区块链技术概述 区块链是一种去中心化、分布式账本技术,具有数据不可篡改、可追溯、公开透明等特…...

10 Vue 特性要点
Vue2 特性要点 Vue2 源码理解 Vue 双向数据绑定 先从单向绑定切入单向绑定非常简单,就是把Mode1绑定到view,当我们用Javascript代码更新Model时, view就会自动更新 双向绑定就很容易联想到了,在单向绑定的基础上,用户更新了View, Mode1的数据也自动被更新了 因为 Vue 是数据双向…...

ESP32和mDNS学习
目录 mDNS的作用mDNS涉及到的标准文件组播地址IPv4 多播地址IPv6 多播地址预先定义好的组播地址 mDNS调试工具例程mDNS如何开发和使用注册服务查询服务 mDNS的作用 mDNS 是一种组播 UDP 服务,用来提供本地网络服务和主机发现。 你要和设备通信,需要记住…...

学习SQL如何使用CASE语句查询分析设备状态
学习SQL如何使用CASE语句查询分析设备状态 一、前言1. 问题背景2. SQL查询分析3. SQL查询解析 二、结论 一、前言 在实际应用中,经常需要对设备的状态进行监控和分析。通过SQL查询,我们可以有效地从数据库中提取和计算设备的状态信息。本文将介绍如何编…...

Gartner发布2024年零信任网络技术成熟度曲线:20项零信任相关的前沿和趋势性技术
大多数组织都制定了零信任信息安全策略,而网络是零信任实施领域的顶级技术。此技术成熟度曲线可以帮助安全和风险管理领导者确定合适的技术,以将零信任原则嵌入其网络中。 战略规划假设 到 2026 年,15% 的企业将在企业拥有的局域网上用 ZTNA …...

React hook 之 useState
在组件的顶部定义状态变量,并传入初始值,确保当这些状态变量的值发生变化时,页面会重新渲染。 const [something,setSomething] useState(initialState); useState 返回一个由两个值组成的数组:1、当前的 state,在首次…...

jenkins中shell脚本中使用构建参数化Groovy变量的四种方式
jenkins中shell脚本中使用构建参数化Groovy变量的四种方式: 以字符变量为例: 流水线代码: pipeline {agent {//label "${server}"label "${28}"}stages {stage(Hello) {steps {echo Hello Worldecho "${28}"echo "…...

Robot Operating System——ParameterEventHandler监控Parameters的增删改行为
大纲 创建订阅"/parameter_events"的Node监控自身Node内部Parameter监控自身Node外部Parameter监听所有Node的所有Parameter的变动执行效果总结 在《Robot Operating System——AsyncParametersClient监控Parameters的增删改行为》一文中,我们通过AsyncPa…...

计算机网络(Wrong Question)
一、计算机网络体系结构 1.1 计算机网络概述 D 注:计算机的三大主要功能是数据通信、资源共享、分布式处理。(负载均衡、提高可靠性) 注:几段链路就是几段流水。 C 注:记住一个基本计算公式:若n个分组&a…...

Docker+consul容器服务的更新与发现
1、Consul概述 (1)什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。直到后来出现了多个节点…...

全网最详细!! Linux 安装、配置教程
一、下载安装包 首先去官网下载VMware最新版本,以及发行版CentOS -7,懒得下载的可以私信我,我给你发包 其中,CentOS(Community Enterprise Operating System)是一个基于Linux的开源操作系统,它是…...

cocos creator 3学习记录01——如何替换图片
一、动态加载本地图片 1、通过将图片关联到CCClass属性上来进行代码切换。 1、这种方法,需要提前在脚本文件中声明好代表图片的CCClass属性。 2、然后拖动图片资源,到脚本内声明好的属性上以进行关联。 3、然后通过程序,来进行切换展示。…...

【Android Compose】ListView效果
【Android Compose】ListView效果 1、Column、Row 和 Box2、LazyColumn和LazyRow3、Compose 中的状态4、ListView效果5、android-compose-codelabs Jetpack Compose 使用入门 Jetpack Compose 教程 Jetpack Compose 1、Column、Row 和 Box Compose 中的三个基本标准布局元素是 …...