【pytorch06】 维度变换

常用API

  • view/reshape
  • squeeze/unsqueeze
  • transpose/t/permute
  • expand/repeat

view和reshape

在这里插入图片描述
view操作的基本前提是保证numel()一致

a.view(4,28*28)的物理意义是把行宽以及通道合并在一起,对于4张图片,我们直接把所有数据都合在一起,用一个784维的向量来表示,这样所有的二维信息上下左右位置信息就忽略掉了,这种数据特别适合于全连接层,因为全连接层的输入就是这样的一个向量输入

a.view(4*28,28)把原来数据的前三个通道合并在一起,这种方式的物理意义是把所有的照片的所有通道的所有行放在第一个维度变成一个N,每一个N都有一个一行的数据,这一行的数据刚好是28个像素点[N,28],就是说我们现在只关注所有的行这些数据信息

a.view(4*1,28,28)把前面两个通道合并在一起,这种方式是说,我们只关注feature map这个属性,不关注feature map来自于哪张图片或哪个通道

view操作或reshape操作的致命问题
b是a通过view操作得到的,如果只看b不看a的话得到的是一个[4,784]的tensor,就会丢失非常重要的数据,原来的存储方式(维度信息)是[b,c,h,w],会丢失原来的维度信息,所以恢复的时候就恢复不出来,恢复的时候可以恢复成[4,28,28,1]这种方式从语法上来是没问题的,但是把数据破坏掉了,因为把维度信息丢失掉了,没有按照维度信息来还原数据就造成了数据的污染

数据的存储/维度顺序非常重要,需要时刻记住

如果view的新的tensor的size跟原来的不一样会报错原来是42828=4784,如果标成4783的话还有一部分数据不知道会去哪,没有把数据的size保持住
在这里插入图片描述

squeeze和unsqueeze

unsqueeze维度增加

unsqueeze把一个维度展开
范围在[-a.dim()-1,a.dim()+1] 这里是[-5,5)
在这里插入图片描述
a.unsqueeze(0).shape0维度前面插入一个维度,可以把这个维度理解为一个集合或者一个组,一个组里面有4个图片,每个图片有1个通道长宽为28
增加了一个组,但这个组还是4张图片,没有增加数据,只是数据的理解方式不一样

a.unsqueeze(-1).shape可以理解一个像素的均值和方差的属性,这里只是假设,便于理解,要理解的是unsqueeze并没有改变数据本身,只是改变数据的理解方式

负数是在索引之后插入,正数是在索引之前插入

在这里插入图片描述
a的shape是[2],经过unsqueeze(-1)之后shape是[2,1],经过unsqueeze(0)之后shape是[1,2]

图片处理案例

在这里插入图片描述

feature map是[4,32,14,14]也就是给的照片长宽为14×14,channel为32,bias相当于给每个channel上的所有像素增加一个偏置值,如何把f叠加在b上?因为f和b的dimension不一样,所以shape也不一样,所以肯定要把b的dimension变成4维,保持与f的shape一样,才可以进行累加操作,然后再把它扩张成[4,32,14,14](扩张后面会说),这样就可以跟f相加了

squeeze维度减少

在这里插入图片描述
squeeze()能挤压的全部挤压,能挤压的包括dimension的size是1的

expand和repeat

  • expand:boradcasting
  • repeat:memory copied
    维度扩展是把维度的shape改变掉
    比如b[32]用unsqueeze操作把dimension为1的tensor变成了dimension为4的tensor[1,32,1,1],变成dimension为4的tensor以后fearture map还是[4,32,14,14]还是不能直接相加,我们需要把这1维度扩展成14维度
    在这里插入图片描述
    expand只是改变了我们的理解方式并没有增加数据
    repeat实实在在的增加了数据,比如你把1变成4的时候增加了4张照片,因此他把后面的所有的数据都拷贝一遍,现在有1行要变成14行,那就会把14行的数据全部拷贝一遍

这两个api从最终的效果来说是等效的,第一种方式和第二种方式区别在于什么,第一种方式不会主动复制数据只会在有需要的时候才会复制数据否则就会省略掉复制数据这个过程(推荐)执行速度快节约内存

在这里插入图片描述
调用expand函数的前提是tensor原来的shape和expand之后的shape的dimension必须一致,对于原来1维度扩展以后是n维度的话是可以扩张的,对于原来维度不为1的维度不可行(比如原来是3 expand之后变成M的话这一部分操作没办法复制,必须告诉策略是什么,所以会报错)

如果不想改变某一维度只需要填上-1即可,-1表示这个维度保持不变

在这里插入图片描述
repeat的接口和expand不一致,它给的参数不是新的shape,而是每一个dimension要拷贝的次数

T转置

在这里插入图片描述
.t()方法只适用于2-D的tensor,只能适用于矩阵
在这里插入图片描述
transpose接受的是两个参数包含了要交换的两个维度a.transpose(1,3)这里要交换1维度和3维度,本来是[b,c,h,w]会变成[b,w,h,c],然后把后面的3个维度连起来一起理解再把它展开成[4,3,32,32]就会变成[b,c,w,h],问题就来了

view操作会把维度信息给丢掉,没有考虑到原来的维度顺序是[b,w,h,c],展开的时候变成了[b,c,w,h]这样子c维度就会提前,通过这种方式破坏了原来的数据

数据的维度顺序必须和存储顺序保持一致

另一个问题是,transpose涉及到维度交换,因此原来的数据存储方式肯定是要改变的,本来说原来是一行行的存储,转置之后数据是不连续的。

在PyTorch中,当提到张量(tensor)是“不连续的”(non-contiguous),意思是张量的数据在内存中不是紧密排列的,而是分散在不同的位置。这通常发生在对张量进行某些操作后,比如切片(slicing)、索引(indexing)或者某些形式的拼接(catenation),这些操作可能导致张量的数据在内存中不再连续。
在这里插入图片描述
a2=a,a1≠a
torch.eq()来判断数据内容是否一致,再用torch.all()函数来确保所有内容都是一致的

torch.all()函数用于检查给定条件是否对输入张量(tensor)的所有元素都为真(true)。如果张量中的所有元素都满足条件,则返回True,否则返回False。

可以看出要把维度的先后顺序保持住,否则会污染数据

permute

在这里插入图片描述

一开始维度是[b,c,h,w]用transpose(1,3)只能两两交换会变成[b,w,h,c],会发现w和h维度交换了(原来w在h的后面,现在h在w的前面),比如原来是一个人,现在交换之后变成了一个转置(长变宽,宽变长),它这个图片可能会改变所以图片不会是一个人,为了很好的还原出来原来的图片,只完成C放到后面的这个操作还是希望得到[b,h,w,c]这样的一个形状

两步
b=a.transpose(1,3) [b,w,h,c]
c=b.transpose(1,2) [b,h,w,c]

[b,h,w,c]是numpy存储图片的格式,需要这一步才能导出numpy

permute()实现上述操作只需要一步,可以完成任意维度的交换

同样permute()也会把内存顺序打乱,因此如果要涉及到contagious这个错误的话,必须要额外加一个contagious()函数,把内存顺序变连续,也就是重新生成一片内存再复制过来

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

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

相关文章

解析Java中1000个常用类:AbstractSequentialList类,你学会了吗?

推荐一个我自己写的小报童专栏导航网站: http://xbt100.top 收录了生财有术项目精选、AI海外赚钱、纯银的产品分析等专栏,陆续会收录更多的专栏,欢迎体验~复制URL可直达。 以下是正文。 在 Java 集合框架中,AbstractSequentialList 是一个重要的抽象类,为实现自定义的顺…

预备资金有5000-6000买什么电脑比较好?大学生电脑选购指南

小新pro14 2024 处理器:采用了英特尔酷睿Ultra5 125H或Ultra9 185H两种处理器可选,这是英特尔最新的高性能低功耗处理器,具有18个线程,最高可达4.5GHz的加速频率,支持PCIe 4.0接口,内置了强大的ARC核芯显卡…

Faiss:加速大规模数据相似性搜索的利器

在机器学习和数据挖掘领域,相似性搜索是一项基本且重要的任务,它涉及到在大型数据集中找到与特定对象最相似的对象。Faiss是一个由Facebook AI Research开发的库,专门用于高效地进行相似性搜索和聚类,它之所以重要,是因…

双指针算法——部分OJ题详解

目录 关于双指针算法: 1,对撞指针 2,快慢指针 部分OJ题详解 283.移动零 1089.复写零 202.快乐数 11.盛水最多的容器 611.有效三角形的个数 剑指offer 57.和为s的两个数字 15.三数之和 18.四数之和 关于双指针算法: …

[240622] X-CMD 发布 v0.3.12: 引入 codeberg,增强传统命令,改善对 Elvish 和 Fish 支持

目录 X-CMD 发布 v0.3.12✨ cb(codeberg.org) ,fjo,gitea✨ Elvish✨ fish✨ git✨ ls✨ last✨ ps✨ stat✨ id X-CMD 发布 v0.3.12 ✨ cb(codeberg.org) ,fjo,gitea 本次版本实验性引入了这三个代码仓库…

个性化光标和动态壁纸

光标 进入这个宝藏网页至美化 至美化 进入鼠标页面,选择自己喜欢的鼠标,进入相关页面 分为两种,那么热爱有钱的UU可以选择高清版 像我这种没钱的孩子或者觉得试用版够用的就使用上面的 点击下载 进入自己的文件夹,解压成功之…

【记录】使用远程SSH配置d2l环境(含装pytorch,同时适用于本地anaconda)

文章目录 前言一、从创建新环境开始二、使用步骤1.安装pytorch2.安装 d2l 包3.安装其他包4.使用jupyter notebook 前言 记录一下如何利用使用命令行进行anaconda配置 d2l环境、pytorch并进行训练深度学习模型。 一、从创建新环境开始 如果是本地直接装一个 anaconda 软件就行…

ReactNative和Android通信

初始化一个RN项目以后,接下来想要让Android与React Native通信 写一个继承自ReactContextBaseJavaModule类的子类,重写getName方法 package com.awesomeprojectimport android.util.Log import android.widget.Toast import com.facebook.react.bridge.…

MFC学习--CListCtrl复选框以及选择

如何展示复选框 //LVS_EX_CHECKBOXES每一行的最前面带个复选框//LVS_EX_FULLROWSELECT整行选中//LVS_EX_GRIDLINES网格线//LVS_EX_HEADERDRAGDROP列表头可以拖动m_listctl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES); 全选,全…

掌握ChatGPT在论文创作中的技巧

在当今快速发展的科技时代,AI已经深刻地影响了我们的生活和工作方式。ChatGPT,作为一种强大的语言模型,可以在论文创作中发挥重要作用。本文将详细介绍如何使用ChatGPT高效地进行论文创作,帮助你提升写作效率和质量。 一、为什么…

【设计模式之迭代器模式 -- C++】

迭代器模式 – 遍历集合,无需暴露 迭代器模式是一种设计模式,用于顺序访问集合对象的元素,而无需暴露其底层实现。迭代器模式分离了集合对象的遍历行为,使得访问元素时,可以不必了解集合对象的底层实现。 组成 迭代…

解析 flink sql 转化成flink job

文章目录 背景流程flink实例实现细节定义的规则定义的物理算子定义的flink exec node 背景 在很多计算引擎里,都会把sql 这种标准语言,转成计算引擎下底层实际的算子,因此理解此转换的流程对于理解整个过程非常重要 流程 flink实例 public…

视听分割相关论文阅读

1. End-to-End Referring Video Object Segmentation with Multimodal Transformers RVOS(视频中的参考对象分割)比RIS(图像中的参考对象分割)要困难得多,因为指代动作的文本表达通常无法从单个静态帧中正确推断出来。…

商业秘密侵权

一、商业秘密侵权行为 (一)员工违规获取并使用企业后台用户行为数据构成商业秘密侵权 (二)离职员工将新单位“冒名顶替”为原单位构成对原单位商业秘密的侵犯 二、商业秘密侵权主体 (一)主体范围界定&a…

使用J-Link Commander查找STM32死机问题

接口:PA13,PA14,请勿连接复位引脚。 输入usb命令这里我已经连接过了STM32F407VET6了。 再输入connect命令这里我已经默认选择了SWD接口,4000K速率。 可以输入speed 4000命令选择4000K速率: 写一段崩溃代码进行测试: void CashCode(void){*((volatil…

区块链技术原理

1.起源: ➢ 中本聪(Satoshi Nakamoto), 2008 ➢ 比特币:一种点对点的电子现金系统 2.分布式账本技术原理 ➢ 将交易向全网所有节点进行广播 ➢ 众多记账节点对记账权达成共识,由共识确认的记账节点把记账区块发布给全网 ➢ 所有账本数据完整存储于区块…

机器学习基础:与Python关系和未来发展

目录 初识Python Python的由来 自由软件运动 编译方式的演进 Python语言的特点 语法简单,易于理解 语法结构清晰,快速上手 丰富的第三方库 机器学习 监督学习 无监督学习 半监督学习 欢迎回到我们的神经网络与深度学习Tensorflow实战学习&am…

Vue3的Teleport:Teleport是Vue3的一个新功能,它允许我们将子组件渲染到父组件以外的地方,这在处理模态框、弹出窗口等情况时非常有用

I. Teleport 的概述 Teleport 的定义: 在 Vue 3.0 中,Teleport 是一个新的内置组件,它允许我们将任何部分的渲染内容 Teleport(传送)到 Vue 应用范围之外的地方。 换句话说,你可以控制片段,让它们在 DOM 中的任何位置渲染,而不仅仅是在当前组件内部。 Teleport 的效…

【Android面试八股文】你能说一说在平常开发过程中你是如何解决事件冲突问题的吗?

文章目录 一、内部拦截法(Inner Intercept)1.1 工作原理:1.2 实现步骤:1.3 适用场景:1.4 内部拦截法示例1.4.1. 自定义 `RecyclerView` 以处理内部拦截1.4.2. 在布局中使用 `InterceptableRecyclerView`1.5 为什么`requestDisallowInterceptTouchEvent(boolean disallowIn…

Inno Setup打包技巧(开机启动,卸载按键,再次安装无法选其他目录)

修改.iss配置文件即可 1.设置开机启动 在对应模块中加入代码,在安装时候默认勾选开机启动了 [Tasks] Name: "startupicon"; Description: "开机启动"; GroupDescription: "{cm:AdditionalIcons}"; [Icons] Name: "{commonst…