深度学习pytorch——Tensor维度变换(持续更新)

view()打平函数

需要注意的是打平之后的tensor是需要有物理意义的,根据需要进行打平,并且打平后总体的大小是不发生改变的。

并且一定要谨记打平会导致维度的丢失,造成数据污染,如果想要恢复到原来的数据形式,是需要靠人为记忆的。

现在给出一个tensor——a.shape=torch.Size([4, 1, 28, 28]),打平a.view(4,1*28*28),此时a.view(4,1*28*28).shape=torch.Size([4, 784])。

当然也可以向高维度:b.shape=torch.Size([4, 784]),打平b.view(4,28,28,1),此时b.view(4,28,28,1).shape=torch.Size([4, 28, 28, 1])

unsqueeze()维度增加

当使用unsqueeze()方法时,此时概念会发生改变,会为数据增加一个组别,这个组别的含义由自己定义。

语法:unsqueeze(index) 如果index为正,则在索引之前加入;如果index为负,则在索引之后加入

代码演示:

# a.shape : torch.Size([4, 1, 28, 28])

# index 为正
print(a.unsqueeze(0).shape)
# torch.Size([1, 4, 1, 28, 28])
print(a.unsqueeze(3).shape)
# torch.Size([4, 1, 28, 1, 28])

# index 为负
print(a.unsqueeze(-1).shape)
# torch.Size([4, 1, 28, 28, 1])
print(a.unsqueeze(-2).shape)
# torch.Size([4, 1, 28, 1, 28])

# 注意不要超出索引范围,否则会报错
# 增加组别具体在数据上的表现
b = torch.tensor([1.2,2.3]) # 此时是一个dim为1,size为2的tensor
print(b.unsqueeze(-1))  # 是在最里层添加了一个维度
# tensor([[1.2000],
#         [2.3000]])
print(b.unsqueeze(0))   # 是在最外层添加了一个维度
# tensor([[1.2000, 2.3000]])

来个小例子:

# for example
# bias相当于给每个channel上的像素增加了一个偏置
b = torch.rand(32)
f = torch.rand(4,32,14,14)
# 现在我们要实现b+f,由于二者维度不同,不能操作(每个维度对应的size也要相同)
b = b.unsqueeze(1)       # torch.Size([32, 1])
print(b.shape)
b = b.unsqueeze(2)       # torch.Size([32, 1, 1])
print(b.shape)
b = b.unsqueeze(0)       # torch.Size([1, 32, 1, 1])
print(b.shape)

squeeze()维度减少

语法:squeeze(index) 如果index不填写,就是将所有size都为1的都去除;index就是去除对应的维度,但是只有size=1的才能被去除。

代码演示:

# b.shape = torch.Size([1, 32, 1, 1])
print(b.squeeze().shape)    # torch.Size([32]) 如果不添加任何参数,就是将所有size=1的都去除
print(b.squeeze(0).shape)   # torch.Size([32, 1, 1])
print(b.squeeze(1).shape)   # torch.Size([1, 32, 1, 1]) 只有size=1的才能被去除

expand()

条件:维度一致,并且只有size=1的才能扩张。

使用蓝色线画的数据必须保持一致;如果参数为-1,则意味着size保持不变。

repeat()

repeat()复制内存数据,括号内参数是copy次数。

代码演示:

print(b.repeat(4,32,1,1).shape) # torch.Size([4, 1024, 1, 1])

转置

1、.t 矩阵转置,只适用于矩阵

2、transpose(dim1,dim2)转置

语法:交换dim1,dim2两个维度。注意transpose()方法会将数据变得不连续,所以通常需要借助于

contiguous()方法,用于将数据变得连续。

数据维度顺序必须和存储顺序一致。(说实话这一句我不太懂,然后我就去问了一下chatgpt)答案:

"数据维度顺序必须和存储顺序一致"是指在使用PyTorch进行数据处理和存储时,数据的维度顺序必须与存储的顺序一致。如果数据的维度顺序与存储的顺序不一致,可能会导致数据处理错误或结果不准确。

例如,如果使用PyTorch创建一个张量(tensor)并在存储时按默认的规则进行存储,即按行优先顺序存储,那么在对该张量进行操作时,需要按照相同的维度顺序进行操作,否则可能会导致错误。

总之,这句话的意思是在PyTorch中,需要保证数据的维度顺序和存储顺序一致,以确保数据处理和存储的正确性。

代码演示:

# a.shape=torch.Size([2, 3, 5, 5])
a1 = a.transpose(1,3).contiguous().view(2,3*5*5).view(2,3,5,5)
a2 = a.transpose(1,3).contiguous().view(2,3*5*5).view(2,5,5,3).transpose(1,3)
print(a1.shape,a2.shape)            # torch.Size([2, 3, 5, 5]) torch.Size([2, 3, 5, 5])
print(torch.all(torch.eq(a,a1)))    # tensor(False)
print(torch.all(torch.eq(a,a2)))    # tensor(True)

补充:其中all()方法是用来确定所有内容一致,eq()方法是用来比较数据一致。

说实话这个我也不是很懂,但是我去做了一下实验,将torch.eq(a,a2)和torch.eq(a,a1)都打印了出来,发现这是一个shape为torch.Size([2, 3, 5, 5])的张量,并且里面的数据都是ture或者false,然后我就明白了,原来eq()是用来比较对应的每个数据是否相同,all()是用来比较一个张量里面的所有值是否在相同。

permute()

个人认为这个方法非常强大,可以完成任意维度的交换。我们先来看一个使用transpose()方法进行维度交换:

# b.shape=torch.Size([4, 3, 28, 32])
print(b.transpose(1,3).shape)                   # torch.Size([4, 32, 28, 3])
print(b.transpose(1,3).transpose(1,2).shape)    # torch.Size([4, 28, 32, 3])

再来看一下permute()方法:

# b.shape=torch.Size([4, 3, 28, 32])
print(b.permute(0,2,3,1).shape)                 # torch.Size([4, 28, 32, 3])

有没有感觉很强大。

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

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

相关文章

在github下载的神经网络项目,如何运行?

github网页上可获取的信息 在github上面,有一个requirements.txt文件,该文件说明了项目要求的python解释器的模块。 - 此外,还有一个README.md文件,用来说明项目的运行环境以及其他的信息。例如python解释器的版本是3.7、PyTorc…

理财第一课:炒股词典

文章目录 基础代码规则委比委差量比换手率市盈率市净率 散户亏钱的原因庄家分析炒股战法波浪理论其它 钱者,人生之大事,死生存亡之地,不可不察也。耕田之利,十倍;珠玉之赢,百倍;闹革命&#xff…

STM32使用TIM2+DMA产生PWM波形异常分析

1、问题描述 使用 STM32F4 的 TIM2 结合 DMA,产生的 PWM 波形不符合预期,但是相同的配置使用在 IM3 上,得到的 PWM 波形就是符合预期的。其代码和配置都是从 F1 移植过来的,在 F1 上使用 TIM2 是没有问题的,对于 F4 的…

蓝桥杯并查集|路径压缩|合并优化|按秩合并|合根植物(C++)

并查集 并查集是大量的树(单个节点也算是树)经过合并生成一系列家族森林的过程。 可以合并可以查询的集合的一种算法 可以查询哪个元素属于哪个集合 每个集合也就是每棵树都是由根节点确定,也可以理解为每个家族的族长就是根节点。 元素集合…

21 OpenCV 直方图均衡化

文章目录 直方图概念均衡的目的equalizeHist 均衡化算子示例 直方图概念 图像直方图,是指对整个图像像在灰度范围内的像素值(0~255)统计出现频率次数,据此生成的直方图,称为图像直方图-直方图。直方图反映了图像灰度的分布情况。 均衡的目的…

【Java】十大排序

目录 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的序列,依次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历…

【LeetCode每日一题】310. 最小高度树

文章目录 [310. 最小高度树](https://leetcode.cn/problems/minimum-height-trees/)思路:拓扑排序代码: 310. 最小高度树 思路:拓扑排序 首先判断节点数量n,如果只有一个节点,则直接返回该节点作为最小高度树的根节点…

GPT-4.5 Turbo详细信息被搜索引擎泄露:有重大改进

3月14日消息,据外电报道,OpenAI 最新人工智能模型 GPT-4.5 Turbo 的详细信息已通过 Bing 和 DuckDuckGo 的搜索引擎索引过早泄露。 GPT-4.5 Turbo 的产品页面在正式发布之前就出现在搜索结果中,引发了人们对 OpenAI 最新型号的特性和功能的猜…

【教学类-44-07】20240318 0-9数字描字帖 A4横版整页(宋体、黑体、文鼎虚线体、print dashed 德彪行书行楷)

背景需求: 前文制作了三种字体的A4横版数字描字帖 【教学类-44-06】20240318 0-9数字描字帖 A4横版整页(宋体、黑体、文鼎虚线体)-CSDN博客【教学类-44-06】20240318 0-9数字描字帖 A4横版整页(宋体、黑体、文鼎虚线体)https://…

练习8 Web [GYCTF2020]Blacklist

这道题其实不是堆叠注入,但是我在联合查询无效后,试了一下堆叠,最后一步发现被过滤的sql语句太多了,完全没法 查阅其他wp的过程[GYCTF2020]Blacklist 1(详细做题过程) 是用的handler语句,只能用…

C语言快速入门之内存函数的使用和模拟实现

1.memcpy 它可以理解为memory copy的组合,memory有记忆的意思,这里指的是内存,copy是拷贝,这个函数是针对内存块进行拷贝的 函数原型 void* memcpy(void* destination,const void* source, size_t num); 从source位置开始&am…

基于springboot+vue的疗养院管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

Python深度学习之路:TensorFlow与PyTorch对比【第140篇—Python实现】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python深度学习之路:TensorFlow与PyTorch对比 在深度学习领域,Tens…

MATLAB环境下基于决策树和随机森林的心力衰竭患者生存情况预测

近年来,随着医学数据的不断积累和计算机技术的快速发展,许多机器学习技术已经被用在医学领域,并取得了不错的效果。与传统的基于医学知识经验的心衰预后评估模型相比,机器学习方法可以快速、高效地从繁杂的、海量的心衰病人数据中…

软件杯 深度学习 python opencv 实现人脸年龄性别识别

文章目录 0 前言1 项目课题介绍2 关键技术2.1 卷积神经网络2.2 卷积层2.3 池化层2.4 激活函数:2.5 全连接层 3 使用tensorflow中keras模块实现卷积神经网络4 Keras介绍4.1 Keras深度学习模型4.2 Keras中重要的预定义对象4.3 Keras的网络层构造 5 数据集处理训练5.1 …

HTML详细教程

文章目录 前言一、快速开发网站最简模板二、HTML标签1.编码2.title3.标题4.div和span5.超链接6.图片7.列表8.表格9.input系列10.下拉框11.多行文本 三、GET方式和POST方式1.GET请求2.POST请求 前言 HTML的全称为超文本标记语言,是一种标记语言,是网站开发…

HCIP —— 交换 (VLAN)

VLAN --- 虚拟局域网 在 HCIA 中 ,已经学过交换机的一些基础配置,下面进行回顾一些简单的内容。 1.创建VLAN VLAN ID --- 区别和标识不同的VLAN 使用范围:0-4095 , 由12位二进制构成。 0 和 4095 作为 保留的VLAN。 …

Python零基础---爬虫技术相关

python 爬虫技术,关于数据相关的拆解: 1.对页面结构的拆解 2.数据包的分析(是否加密了参数)(Md5 aes)难易程度,价格 3.对接客户(433,334) # 数据库 CSV 4.结单(发一部分数据&a…

13 - grace数据处理 - 泄露误差改正 -正演建模法(Forward-Modeling)

grace数据处理 - 泄露误差改正 -正演建模法(Forward-Modeling) *0* 引言*1* Matlab代码实现0 引言 正演建模法最早是由Chen等提出的,本质是通过迭代的思想反求真实信号的过程,为什么要反求呢?因为在数据处理过程中做了球谐截断和空间滤波,使部分有用信号被湮灭,也就是有…

Blocks —— 《Objective-C高级编程 iOS与OS X多线程和内存管理》

目录 Blocks概要什么是BlocksOC转C方法关于几种变量的特点 Blocks模式Block语法Block类型 变量截获局部变量值__block说明符截获的局部变量 Blocks的实现Block的实质 Blocks概要 什么是Blocks Blocks是C语言的扩充功能,即带有局部变量的匿名函数。 顾名思义&#x…