PyTorch学习(11):PyTorch的形状变换(view, reshape)与维度变换(transpose, permute)

PyTorch学习(1):torch.meshgrid的使用-CSDN博客

PyTorch学习(2):torch.device-CSDN博客

PyTorch学习(9):torch.topk-CSDN博客

PyTorch学习(10):torch.where-CSDN博客

1. 写在前面

        在深度学习框架PyTorch中,view, reshape, permute, 和 transpose 是用于操作张量的重要函数。它们允许我们对张量的形状和维度进行变换,这在神经网络的设计和实现中是非常常见的。下面,我们将逐一介绍这些函数的功能和用法。

2. view函数

        view 函数用于改变张量的形状而不改变其数据。它返回一个具有新形状的张量,该张量的元素数量必须与原始张量相同。如果新形状与原始形状不兼容,view 函数将引发错误。

​import torch# 创建一个张量x = torch.arange(12)print("原始张量:", x)# 使用view改变形状x_view = x.view(3, 4)print("view后的张量:", x_view)print(f"x_view.is_contiguous: {x_view.is_contiguous()}")[点击并拖拽以移动]
​

得到如下结果:

原始张量: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])view后的张量: tensor([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])x_view.is_contiguous: True

        由上可以看出,view重新定义了x的形状,但并未改变x的内存存储情况。

3. reshape函数

        reshape 函数与 view 类似,也用于改变张量的形状。不同之处在于,reshape 可以在必要时自动调整张量的内存布局,而 view 则要求连续的内存布局。这意味着 reshape 更加灵活,但可能会带来性能上的损失。

# 使用reshape改变形状x_reshape = x.reshape(3, 4)print("reshape后的张量:", x_reshape)

        获得如下结果。

原始张量: tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])reshape后的张量: tensor([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])x_reshape.is_contiguous: True

        由上可以看到,reshape同样重新定义了x的形状,也同样没有改变内存的存储情况。

        需要指出,view和reshape是有区别的,这在后面我们会一示例的情况给出讲解。

3. permute函数

        permute 函数用于重新排列张量的维度。它接受一个包含新维度顺序的元组作为参数,并返回一个新的张量,其中所有维度按照指定的顺序重新排列。

# 创建一个三维张量x_3d = torch.randn(2, 3, 4)print("原始三维张量:", x_3d)# 使用permute重新排列维度x_3d_permute = x_3d.permute(2, 0, 1)  # 将维度顺序改为4, 2, 3print("permute后的三维张量:", x_3d_permute)

        运行以上程序获得如下的结果。

原始三维张量: tensor([[[-1.0659, -0.2152, -0.5032,  1.4046],[-0.0707,  0.4638,  0.0902, -0.2389],[-0.4463,  0.0115,  0.9082,  1.3913]],[[-0.1206,  0.2040, -0.6793, -0.1782],[-1.1659, -0.1593, -1.0143, -0.5418],[-0.0641,  0.6947, -0.0991, -0.8461]]])permute后的三维张量: tensor([[[-1.0659, -0.0707, -0.4463],[-0.1206, -1.1659, -0.0641]],[[-0.2152,  0.4638,  0.0115],[ 0.2040, -0.1593,  0.6947]],[[-0.5032,  0.0902,  0.9082],[-0.6793, -1.0143, -0.0991]],[[ 1.4046, -0.2389,  1.3913],[-0.1782, -0.5418, -0.8461]]])x_3d_permute.is_contiguous: False

        经过permute后,重新排列的x_3d的维度,此时我们可以看到同样改变了x_3d的内存存储形式,已经不再连续。

        我们继续执行如下转换。

x_3d_permute_reshape = x_3d_permute.reshape(3, 2, 4)

        得到结果如下。

x_3d_permute_reshape.is_contiguous: True

        我们得到一个阶段性结论,经过permute之后的tensor可以使用reshape继续进行形状的重新调整,此时得到的tensor又转换为内存连续存储。

        我们将reshape换做view进行形状的调整。

        得到如下的结果。

Traceback (most recent call last):File "PTTest.py", line 12, in <module>x_3d_permute_reshape = x_3d_permute.view(3, 2, 4)RuntimeError: view size is not compatible with input tensor's size and stride (at least one dimension spans across two contiguous subspaces). Use .reshape(...) instead.

        提示我们,需要先对tensor进行contiguous()操作,在进行view的调整。

        我们看到,经过permute调整维度后,tensor的存储内存不再连续,之后可以使用reshape进行形状调整。如果想使用view进行调整,需要先调整内存存储情况。具体执行情况如下。

x_3d_permute_reshape = x_3d_permute.reshape(3, 2, 4)或x_3d_permute = x_3d_permute.contiguous()x_3d_permute_reshape = x_3d_permute.view(3, 2, 4)

4. transpose函数

        transpose 函数用于交换两个指定维度上的张量。它接受两个维度索引作为参数,并返回一个新的张量,其中这两个维度被交换。

import torch# 使用transpose交换维度x_3d = torch.randn(2, 3, 4)x_transpose = x_3d.transpose(0, 2) # 交换第1个和第3个维度print("transpose后的三维张量:", x_transpose)

        得到如下结果。

transpose后的三维张量: tensor([[[-2.9029e-02, -1.9491e+00],[ 2.2509e+00,  4.8542e-01],[ 7.3283e-01,  5.6724e-01]],[[ 1.1965e+00,  5.6124e-02],[ 6.2344e-02, -1.3396e+00],[-1.7319e-01,  1.9378e-01]],[[-3.9400e-01, -5.7935e-01],[-9.6071e-01, -2.8746e-01],[ 1.6578e+00,  4.6559e-01]],[[ 1.7822e+00, -6.4085e-01],[-1.1714e+00,  1.5534e-03],[-2.2264e-01, -3.9514e-01]]])

shape变为shape(4, 3, 2)。

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

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

相关文章

数据库与数据库管理系统 MySQL的安装 SQL语言学习:DDL、DML

day51 数据库 数据库&#xff08;database&#xff09;就是一个存储数据的仓库。为了方便数据的存储和管理&#xff0c;它将数据按照特定的规律存储在磁盘上。 通过数据库管理系统&#xff0c;可以有效地组织和管理存储在数据库中的数据&#xff0c;如数据库管理系统MySQL 数据…

Java学习Lambda表达式

Lambda表达式 有且只有一个未实现的方法叫做Lambda表达式&#xff0c;可以实现函数式编程 // 这个注解是用来检查你写的函数是否是函数式接口 FunctionalInterfaceinterface Myinterface {int sum(int a, int b);default String priteTitle(String name, int age, String sex)…

Kubernetes资源调度策略及实现机制

目录 一、资源调度策略 1.默认调度器&#xff08;Default Scheduler&#xff09; 2.自定义调度器&#xff08;Custom Scheduler&#xff09; 3.亲和性与反亲和性&#xff08;Affinity and Anti-Affinity&#xff09; 4.污点与容忍&#xff08;Taint and Tolerations&#…

时间序列差分顺序的讨论

生成出一组时间序列数据 服从标准正态分布的50个 随机数据 分别给出4步季节差分&#xff0c;再进行1步1阶差分的结果 和 1步1阶差分再进行 4步季节差分 的结果 讨论&#xff1a; 先进行4步季节差分再进行1步1阶差分与先进行1步1阶差分再进行4步季节差分的结果看起来是相同的

计算机网络复习(2)性能指标 带宽

计算机网络的性能指标是衡量网络效率、可靠性和服务质量的重要参数&#xff0c;它们帮助我们理解网络如何工作以及如何优化网络性能。以下是计算机网络中几个关键的性能指标的详细介绍&#xff1a; 1. 速率 (Rate) / 比特率 (Bit Rate) / 数据率 (Data Rate) 速率指的是数据在…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:潍柴雷沃智慧农业无人驾驶

潍柴雷沃智慧农业科技股份有限公司&#xff0c;是潍柴集团重要的战略业务单元&#xff0c;旗下收获机械、拖拉机等业务连续多年保持行业领先&#xff0c;是国内少数可以为现代农业提供全程机械化整体解决方案的品牌之一。潍柴集团完成对潍柴雷沃智慧农业战略重组后&#xff0c;…

kaggle:房价预测

比赛链接 结果展示 结果链接 8848是密码 文章目录 数据处理调包部分拒绝掉包岭回归理论代码实践结果 自助采样理论代码 集成学习前言Bagging理论Bagging-Ridge代码Bagging-Ridge实践Bagging-Ridge结果 Tricks 数据处理 #打开文件 import pandas as pd dataset1pd.read_csv(&q…

Arduino编程变量:深度探索与实际应用

Arduino编程变量&#xff1a;深度探索与实际应用 在Arduino编程中&#xff0c;变量扮演着至关重要的角色。它们用于存储程序运行过程中的临时数据&#xff0c;是实现各种功能和算法的关键。然而&#xff0c;对于初学者来说&#xff0c;变量的理解和使用往往充满了困惑和挑战。…

Java 基础面试300题 (111-140)

Java 基础面试300题 &#xff08;111-140&#xff09; 111.什么是Java包&#xff1f; 有什么优点&#xff1f; 包是相关Java类型的集合。包中可以包括相关的类、接口和枚举。使用包来组织软件代码有几方面的优点&#xff1a; 包有助于将相关代码保存在一起。包有助于避免命名…

How to install a dataset from huggingface?

当我从抱抱脸上git clone imdb数据集时&#xff0c;plain_text里的文件是这样的&#xff1a;

梦想的味道,特别的邀约 —— 蒙自源六一儿童节特别活动

每个孩子心中都有一颗梦想的种子&#xff0c;只需一点阳光和雨露&#xff0c;便能生根发芽&#xff0c;开出绚烂的花朵。六一儿童节&#xff0c;是孩子们的节日&#xff0c;也是他们梦想起航的日子。蒙自源希望成为孩子们梦想的沃土&#xff0c;用美食和爱滋养他们的成长。在这…

【Qt知识】Qt框架中的信号(Signals)与槽(Slots)机制

Qt框架中的信号&#xff08;Signals&#xff09;与槽&#xff08;Slots&#xff09;机制是一种强大的通信方式&#xff0c;允许对象之间相互通信而无需对象之间直接引用或了解对方。这一机制简化了应用程序的事件处理和组件之间的交互&#xff0c;是Qt的一大特色和核心概念。 …

Qt6.4.2基于CMake添加Qt3DCore模块报错

在文档中说明是添加 find_package(Qt6 REQUIRED COMPONENTS 3dcore) target_link_libraries(mytarget PRIVATE Qt6::3dcore)find_package是没有问题&#xff0c;但是target_link_libraries会报错&#xff0c;报拼写错误&#xff0c;无法链接上Qt6::3dcore 需要使用“3DCore”…

windows系统搭建go开发编译环境

1、前言 windows系统&#xff0c;从零开始搭建go开发编译环境详细步骤。 2、go下载和安装 2.1 下载 下载地址如下&#xff1a; All releases - The Go Programming Language 可以根据自己的需要选择下载对应的版本下载即可。 对于windows系统&#xff0c;如果是6…

有开源软件,也有开源硬件?

开源软件或库有很多&#xff0c;例如 Linux 操作系统的内核 The Linux Kernel Archiveshttps://www.kernel.org/ 开源的各种Linux发行版本&#xff0c;Ubuntu 、CentOS等 Enterprise Open Source and Linux | Ubuntuhttps://ubuntu.com/ 开源的视觉函数库&#xff0c;OpenC…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:美团小袋自动配送车

大型电商公司美团已选用NVIDIA Jetson AGX Xavier 平台&#xff0c;作为无人配送机器人核心AI算力。 美团点评是全球大型的按需食品配送公司&#xff0c;结合了Uber Eats、Yelp和Groupon的商业模式&#xff0c;与超过40万家本地企业开展合作。他们推出了小袋自动配送车&#…

基于深度学习YOLOv8\YOLOv5的花卉识别鲜花识别检测分类系统设计

本文将介绍基于深度学习YOLOv8\YOLOv5PySide6SQLite的花卉检测与识别系统&#xff0c;该系统基于YOLOv8算法&#xff0c;并与YOLOv5版本进行比较&#xff0c;该系统不仅实现了对花卉的精准识别和分类&#xff0c;还提供了包括用户认证管理、模型快速切换及界面个性化定制在内的…

2024.6.2 蓝桥杯软件类C++B组国赛 小记 (退役进度 3 / 3)

文章目录 赛前赛时赛后 赛前 赛前一点都没有训 &#xff0c; 甚至电脑都没有摸一下。 由于是在山东科技大学比赛 &#xff0c;所以我们包了大巴早上五点出发。大约需要四点起床。我前一晚上十点就躺在床上了 &#xff0c;但是失眠了 &#xff0c; 躺在床上辗转反侧 &#xff…

PCL点云格式转换成tiff格式

需要把PCL的点云格式转换成tiff格式的图片。 一、第一种转换函数 主要思路: 使用了libtiff库,来写tiff格式把点云的x,y,z通道转换成tiff格式图片的三通道。所以后续读取tiff格式图片转换成点云时,注意三通道代表x,y,z的顺序写tiff格式的时候就是设置文件头,然后把数据一个…

深入理解Python中的迭代器与生成器

在Python编程中&#xff0c;迭代器&#xff08;Iterators&#xff09;和生成器&#xff08;Generators&#xff09;是处理集合数据的重要工具。它们提供了一种有效的方式来遍历数据&#xff0c;尤其是在处理大量数据时&#xff0c;可以显著提高程序的性能和内存使用效率。本文将…