【PyTorch】6.张量形状操作:在深度学习的 “魔方” 里,玩转张量形状

ops/2025/2/1 23:39:48/

       

目录

1. reshape 函数的用法

2. transpose 和 permute 函数的使用

4. squeeze 和 unsqueeze 函数的用法

5. 小节


个人主页:Icomi

专栏地址:PyTorch入门

在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术,能够处理复杂的数据模式。通过 PyTorch,我们可以轻松搭建各类神经网络模型,实现从基础到高级的人工智能应用。接下来,就让我们一同走进 PyTorch 的世界,探索神经网络人工智能的奥秘。本系列为PyTorch入门文章,若各位大佬想持续跟进,欢迎与我交流互关。

         咱们已经学习了张量的花式索引操作,它就像一把精巧的工具,让我们能够在数据的 “宝藏库” 里精准地提取和修改信息。我们接下来要学习—— 掌握对张量形状的操作。

        想象一下,我们即将搭建的网络模型就像一座宏伟而复杂的建筑,而数据则是构建这座建筑的基石。这些数据在我们的深度学习世界里,都是以张量的形式存在。在这座 “建筑” 中,不同的楼层(网络层)有着不同的功能和设计,它们之间的数据传递和运算就如同建筑中不同楼层之间的物资运输和协作。

        每一层网络对数据的处理方式都不尽相同,这就导致数据在网络层与层之间流动时,会以不同的形状(shape)进行表现和运算。比如说,有的层可能接收的是二维的张量数据,经过处理后输出一个三维的张量,就像把方形的积木经过加工变成了一个立体的模型

        如果我们不掌握对张量形状的操作,就好比一个建筑工人不熟悉不同建筑材料的尺寸和拼接方式,那么在搭建这座 “网络建筑” 时,各层之间的数据连接就会出现问题,就像积木无法正确拼接,最终导致整个建筑摇摇欲坠。

        为了能够更好地处理网络各层之间的数据连接,顺利搭建出稳固而强大的网络模型,掌握对张量形状的操作就显得尤为重要。接下来,我们就一同深入学习如何巧妙地调整和管理张量的形状,让我们在深度学习的建筑之路上稳步前行。

1. reshape 函数的用法

reshape 函数可以在保证张量数据不变的前提下改变数据的维度,将其转换成指定的形状,在后面的神经网络学习时,会经常使用该函数来调节数据的形状,以适配不同网络层之间的数据传递。

python">import torch
import numpy as npdef tensor_shape_operations():# 创建一个二维张量tensor = torch.tensor([[10, 20, 30], [40, 50, 60]])# 1. 使用 shape 属性或者 size 方法都可以获得张量的形状print(f"使用 shape 属性获取的形状: {tensor.shape},第 0 维大小: {tensor.shape[0]},第 1 维大小: {tensor.shape[1]}")print(f"使用 size 方法获取的形状: {tensor.size()},第 0 维大小: {tensor.size(0)},第 1 维大小: {tensor.size(1)}")# 2. 使用 reshape 函数修改张量形状reshaped_tensor = tensor.reshape(1, 6)print(f"修改形状后的张量形状: {reshaped_tensor.shape}")if __name__ == '__main__':tensor_shape_operations()

需要注意的是,转换前后的两个形状元素个数要相同

python">import torchdef test():torch.manual_seed(0)data = torch.randint(0, 10, [4, 5])# 查看张量的形状print(data.shape, data.shape[0], data.shape[1])print(data.size(), data.size(0), data.size(1))# 修改张量的形状new_data = data.reshape(2, 10)print(new_data)# 注意: 转换之后的形状元素个数得等于原来张量的元素个数# new_data = data.reshape(1, 10)# print(new_data)# 使用-1代替省略的形状new_data = data.reshape(5, -1)print(new_data)new_data = data.reshape(-1, 2)print(new_data)if __name__ == '__main__':test()

2. transpose 和 permute 函数的使用

transpose 函数可以实现交换张量形状的指定维度, 例如: 一个张量的形状为 (2, 3, 4) 可以通过 transpose 函数把 3 和 4 进行交换, 将张量的形状变为 (2, 4, 3)

permute 函数可以一次交换更多的维度。

python">import torch
import numpy as npdef test():data = torch.tensor(np.random.randint(0, 10, [3, 4, 5]))print('data shape:', data.size())# 1. 交换1和2维度new_data = torch.transpose(data, 1, 2)print('data shape:', new_data.size())# 2. 将 data 的形状修改为 (4, 5, 3)new_data = torch.transpose(data, 0, 1)new_data = torch.transpose(new_data, 1, 2)print('new_data shape:', new_data.size())# 3. 使用 permute 函数将形状修改为 (4, 5, 3)new_data = torch.permute(data, [1, 2, 0])print('new_data shape:', new_data.size())if __name__ == '__main__':test()

4. squeeze 和 unsqueeze 函数的用法

squeeze 函数用删除 shape 为 1 的维度,unsqueeze 在每个维度添加 1, 以增加数据的形状

python">import torch
import numpy as npdef test():data = torch.tensor(np.random.randint(0, 10, [1, 3, 1, 5]))print('data shape:', data.size())# 1. 去掉值为1的维度new_data = data.squeeze()print('new_data shape:', new_data.size())  # torch.Size([3, 5])# 2. 去掉指定位置为1的维度,注意: 如果指定位置不是1则不删除new_data = data.squeeze(2)print('new_data shape:', new_data.size())  # torch.Size([3, 5])# 3. 在2维度增加一个维度new_data = data.unsqueeze(-1)print('new_data shape:', new_data.size())  # torch.Size([3, 1, 5, 1])if __name__ == '__main__':test()

5. 小节

本小节我们学习了经常使用的关于张量形状的操作,我们用到的主要函数有:

  1. reshape 函数可以在保证张量数据不变的前提下改变数据的维度.
  2. transpose 函数可以实现交换张量形状的指定维度, permute 可以一次交换更多的维度.
  3. view 函数也可以用于修改张量的形状, 但是它要求被转换的张量内存必须连续,所以一般配合 contiguous 函数使用.
  4. squeeze 和 unsqueeze 函数可以用来增加或者减少维度.

http://www.ppmy.cn/ops/154886.html

相关文章

三星手机人脸识别解锁需要点击一下电源键,能够不用点击直接解锁吗

三星手机的人脸识别解锁功能默认需要滑动或点击屏幕来解锁。这是为了增强安全性,防止误解锁的情况。如果希望在检测到人脸后直接进入主界面,可以通过以下设置调整: 打开设置: 进入三星手机的【设置】应用。 进入生物识别和安全&a…

快速生成2D卡通人物的AI工具:开启Live2D角色创作的新时代

在数字内容创作领域,特别是游戏和动画行业中,Live2D技术已经成为了创建生动、互动性强的角色的热门选择。它允许创作者构建出不仅外观吸引人,而且还能通过简单的动作和表情变化与用户互动的角色。然而,传统上,Live2D角色的创建过程复杂且耗时,需要专业的美术设计师和技术…

【C语言】static关键字的三种用法

【C语言】static关键字的三种用法 C语言中的static关键字是一个存储类说明符,它可以用来修饰变量和函数。static关键字的主要作用是控制变量或函数的生命周期和可见性。以下是static关键字的一些主要用法和含义: 局部静态变量: 当static修饰…

私有包上传maven私有仓库nexus-2.9.2

一、上传 二、获取相应文件 三、最后修改自己的pom文件

【Docker】Docker入门了解

文章目录 Docker 全面指南:从入门到实战**一、Docker 核心概念****二、Docker 优势****三、安装 Docker****四、基础操作命令****五、Dockerfile 实战(C 示例)****六、进阶应用场景****七、常见问题解答****八、学习资源推荐** Docker 全面指…

Kafka常见问题之 org.apache.kafka.common.errors.RecordTooLargeException

文章目录 Kafka常见问题之 org.apache.kafka.common.errors.RecordTooLargeException: The message is 1,048,576 bytes when serialized which is larger than the maximum request size.1. 错误解析2. 错误原因3. 错误复现案例3.1 生产者发送超大消息 4. 解决方案4.1 方法 1&…

ZooKeeper-3.8.3-会话

ZooKeeper 会话 1. 会话创建与状态转换 ZooKeeper 客户端通过语言绑定创建服务句柄来建立会话。句柄初始为“连接中”(CONNECTING)状态,成功连接到 ZooKeeper 服务的某台服务器后转为“已连接”(CONNECTED)状态。若遇…

7 Spark 底层执行原理

7 Spark 底层执行原理 1. 从代码角度看 DAG 图的构建2. 将 DAG 划分为 Stage 核心算法3. 将 DAG 划分为 Stage 剖析4. 提交 Stages5. 监控 Job、Task、Executor6. 获取任务执行结果7. 任务调度总体诠释Spark 运行架构特点 Spark 运行流程 Spark运行流程 具体运行流程如下&…