网易首页 > 网易号 > 正文 申请入驻

PyTorch:张量与基础计算模块

0
分享至

PyTorch 的 torch 模块,是整个 PyTorch 框架中最基础、最核心的模块。它提供了张量创建、张量运算、形状变换、索引切片、数据类型转换、设备迁移、随机数生成、保存与加载等基础能力。

简单地说,torch 模块回答的是:数据在 PyTorch 中如何表示、如何计算、如何移动到 GPU 上,以及如何作为模型的输入、输出和参数参与训练。

在 PyTorch 中,最重要的数据结构是张量(Tensor)。输入数据、模型参数、中间激活值、损失值和梯度,通常都以张量形式存在。因此,学习 PyTorch 的第一步,不是直接编写复杂神经网络,而是理解张量与基础计算。

一、认识 torch 模块

torch 是 PyTorch 中最常用的基础模块。它既可以创建张量,也可以对张量进行数学运算、形状调整、数据类型转换和设备管理。

一个最基本的使用方式如下:

输出结果类似:

可以简单理解为:torch 模块不是专门用来定义神经网络的模块,而是 PyTorch 的基础计算层。

后面学习的许多内容,都会建立在 torch 模块之上:

• 神经网络层会用张量表示模型参数和中间计算结果

• 自动求导机制会根据张量运算过程计算梯度

• 优化器会根据张量梯度更新模型参数

• 数据加载器读取出来的数据通常也会被组织为张量

因此,torch 模块是理解 PyTorch 的入口。

二、什么是张量

张量(Tensor)可以看作是多维数组。根据维度不同,张量可以表示标量、向量、矩阵和更高维的数据。


图 1:PyTorch 张量的维度

例如:

输出结果类似:

torch.Size([2, 3, 4])

在深度学习中,张量不只是“数学对象”,也是数据在程序中的主要表示方式。

例如,在图像任务中,一个常见输入张量形状是:

(batch_size, channels, height, width)

对应代码可以写成:

这里:

• 32 表示一批中有 32 张图像

• 3 表示 RGB 三个颜色通道

• 224 表示图像高度

• 224 表示图像宽度

理解张量形状,是学习卷积神经网络、图像分类、目标检测和视觉模型的基础。

三、创建张量的常用方式

PyTorch 提供了多种创建张量的方法。

1、使用 torch.tensor() 创建张量

最直接的方式是使用 torch.tensor():

输出结果类似:

        [3., 4.]])

torch.tensor() 会根据输入数据自动推断数据类型。例如,输入整数时通常得到整数张量,输入浮点数时通常得到浮点张量。

如果希望明确控制数据类型,可以直接指定 dtype:

输出结果类似:

torch.float32

在深度学习中,输入特征通常使用浮点张量;分类标签通常使用整数张量。数据类型如果不符合函数要求,程序可能会报错,或者得到不符合预期的结果。

2、创建全 0、全 1 和未初始化张量

需要注意的是,torch.empty() 只是分配内存,并不会把里面的数值初始化为 0。因此,它输出的内容可能看起来像随机值,但这些值只是内存中原有的数据。

在初学阶段,如果没有特殊需求,通常更建议使用 zeros()、ones() 或随机初始化函数,而不是直接使用 empty()。

3、创建随机张量

随机张量常用于参数初始化、模拟输入数据、构造测试样本和调试模型流程。

例如,构造一批模拟输入数据和类别标签:

这类写法常用于教学示例和模型调试。它可以在没有真实数据的情况下,先检查模型结构、输入输出形状和训练流程是否能够正常运行。

4、创建数值序列张量

这类函数常用于构造坐标、时间步、测试数据或绘图数据。

5、根据已有张量创建新张量

这类函数的好处是不用手动写形状,能减少形状不一致带来的错误。尤其是在模型内部创建与输入同形状的掩码、噪声或中间变量时,非常方便。

四、查看张量的基本属性

创建张量之后,通常需要查看它的形状、维度、元素数量、数据类型和所在设备。

在调试 PyTorch 代码时,shape、dtype 和 device 是最常检查的三个信息。

五、张量的数据类型

张量中的元素必须有明确的数据类型。常见数据类型包括:

• torch.float32:32 位浮点数,深度学习中最常用

• torch.float64:64 位浮点数,精度更高,但计算开销更大

• torch.float16:16 位浮点数,常用于混合精度训练

• torch.bfloat16:常用于深度学习加速的低精度格式

• torch.int64:64 位整数,分类标签中很常见

• torch.int32:32 位整数

• torch.bool:布尔类型

可以在创建张量时指定类型:

也可以使用 .to() 改变数据类型:

在深度学习任务中,数据类型不仅影响计算效率,也影响函数能否正常运行。

例如,在多分类任务中,模型输出通常是浮点张量,而类别标签通常是整数张量:

如果把标签错误地处理成浮点类型或错误形状,某些损失函数可能无法按预期工作。

六、张量的形状变换

张量形状变换是 PyTorch 中非常常见的操作。模型输入、卷积输出、全连接层输入、序列数据重排,都离不开形状变换。


图 2:PyTorch 张量形状变换

1、reshape():改变张量形状

形状变换有一个基本前提:元素总数不能改变。上面例子中,原张量有 12 个元素,新形状 (3, 4) 也需要 12 个元素。

也可以使用 -1 让 PyTorch 自动推断某一维:

-1 很适合在不想手动计算某一维大小时使用。但一个形状中通常只能有一个 -1,否则无法确定唯一结果。

2、view():以视图方式改变形状

view() 与 reshape() 很相似,但 view() 对张量在内存中的连续性更敏感。如果张量不是连续存储的,view() 可能会报错。

在初学阶段,可以优先使用 reshape()。等到需要更深入理解内存布局和性能优化时,再仔细区分 view() 与 reshape()。

3、unsqueeze() 与 squeeze():增加或删除长度为 1 的维度

squeeze() 用于删除长度为 1 的维度:

这类操作常用于处理批次维度、通道维度和模型输出维度。

例如,一个单独样本的特征向量形状是 (4,),但模型可能希望输入形状是 (1, 4),此时就可以使用:

x = x.unsqueeze(0)

这里增加的第 0 维,通常表示“批次维度”。

4、transpose() 与 permute():交换维度

permute() 可以重新排列多个维度:

在图像任务中,维度顺序非常重要。很多图像数据默认是 (N, H, W, C),而 PyTorch 卷积网络通常使用 (N, C, H, W)。这时应使用 permute() 调整维度顺序,而不是使用 reshape() 强行改变形状。

5、flatten():展平张量

这里:

• 原始张量表示 32 张图像

• 每张图像形状为 3 × 28 × 28

• 展平后,每个样本变成长度为 2352 的向量

这类操作常用于卷积层之后、全连接层之前。需要注意的是,第 0 维通常是批次维度,不能随意一起展平,否则会把不同样本混在一起。

七、张量的基础数学运算

torch 模块提供了大量数学运算。常见运算包括逐元素运算、数学函数、聚合运算和矩阵乘法。

1、逐元素运算

逐元素运算要求两个张量的形状相同,或者能够通过广播机制对齐。否则,程序会因为形状不匹配而报错。

2、常用数学函数

这些函数通常会对张量中的每个元素分别计算。

例如,torch.clamp() 可以把数值限制在指定范围内:

torch.clamp() 常用于限制数值范围,在数值稳定性处理中很常见。

3、聚合运算

也可以沿指定维度聚合:

在深度学习中,dim 参数非常重要。例如,对类别维度做归一化、对批次维度求平均、对空间维度做池化,都需要明确指定维度。

如果 dim 写错,代码可能不会报错,但计算含义会完全改变。

4、矩阵乘法

是神经网络计算的基础。

也可以使用 @ 运算符:

C = A @ B

在全连接层中,核心计算可以简单理解为:

Y = X @ W + b

其中:

• X 是输入特征矩阵

• W 是权重矩阵

• b 是偏置

• Y 是输出结果

这也是后续理解 nn.Linear 的基础。

八、广播机制

广播(Broadcasting)允许不同形状的张量在满足规则时进行运算。它可以减少手动复制数据的需求。

例如:

输出结果类似:

        [14., 25., 36.]])

这里:

• x 的形状是 (2, 3)

• b 的形状是 (3,)

• b 会自动扩展到每一行,与 x 相加

广播机制常见于:

• 给每个样本加同一个偏置

• 对每一列做标准化

• 对批量数据应用同一组参数

• 在注意力机制中对齐不同维度

• 在损失计算中自动匹配形状

例如,按列标准化可以写成:

广播非常方便,但也容易造成隐蔽错误。尤其当张量形状刚好“可以广播”,但并不是你想要的广播方式时,代码可能不会报错,却会得到错误结果。

因此,涉及广播时,要特别关注每个张量的形状。

九、索引与切片

张量支持类似 Python 列表的索引方式。

索引与切片常用于选取样本、选取特征、截取序列和构造子张量。

也可以使用布尔索引:

输出结果类似:

tensor([5, 8])

布尔索引常用于筛选满足条件的元素,例如:

• 筛选大于某个阈值的预测结果

• 筛选有效标签

• 筛选非零元素

• 构造掩码张量

例如:

布尔索引写法很直观,但要注意:布尔掩码的形状通常需要与被筛选张量的相关维度匹配。

十、拼接与堆叠

在数据处理和模型计算中,经常需要把多个张量合并起来。最常见的两个函数是 torch.cat() 和 torch.stack()。

1、cat():沿已有维度拼接

可以简单理解为:

• dim=0 常对应“增加样本数量”

• dim=1 常对应“增加特征数量”

使用 cat() 时,除了拼接的那个维度,其他维度通常必须一致。

2、stack():沿新维度堆叠

输出结果类似:

torch.Size([3, 2])

可以简单理解为:

• cat() 是在已有维度上接起来

• stack() 是先增加一个新维度,再把张量放进去

例如,把多张单独图像合成一个批次时,常常可以使用 stack()。

十一、CPU、GPU 与设备迁移

PyTorch 张量可以运行在 CPU、GPU 或其他计算设备上。默认情况下,张量通常创建在 CPU 上。

可以查看张量所在设备:

输出结果通常是:

cpu

如果有可用的 GPU,可以写成:

如果使用支持相关加速后端的 Apple 设备,也可以写成:

需要注意的是,参与同一次计算的张量通常必须在同一个设备上。

例如:

    

正确做法是把相关张量移动到同一设备:

在真实训练中,模型和数据也要放在同一设备上:

这是 PyTorch 初学者非常容易遇到的问题之一。如果看到类似“设备不一致”的报错,首先应检查模型参数、输入数据和标签是否都在同一个设备上。

十二、与 NumPy 的相互转换

PyTorch 张量和 NumPy 数组可以相互转换。在数据处理、绘图和模型推理结果分析时,这一点很常用。

1、NumPy 数组转张量

需要注意的是,torch.from_numpy() 创建的张量通常与原 NumPy 数组共享底层数据:

这说明修改 NumPy 数组后,张量也发生了变化。在需要避免相互影响时,可以额外复制数据。

2、张量转 NumPy 数组

通常只有 CPU 上的张量才能直接转换为 NumPy 数组。如果张量在 GPU 上,需要先移动到 CPU:

这在模型推理结果转换为普通数组时非常常见。例如,模型预测结果通常先是张量,如果要进一步绘图、保存或交给其他数据分析代码处理,就可能需要转换为 NumPy 数组。

十三、随机数与可复现实验

深度学习中很多过程具有随机性,例如参数初始化、数据打乱、随机增强和 Dropout 等。为了让实验结果尽量可复现,通常会设置随机种子。

两次生成的结果通常相同。可以简单理解为:

• 随机种子控制随机数生成的起点

• 相同随机种子通常会产生相同随机序列

• 可复现实验需要尽量控制随机性来源

在入门阶段,先理解 torch.manual_seed() 的作用即可。实际工程中,还可能需要同时控制数据加载、多进程、GPU 算子等因素。

十四、保存与加载张量

torch.save() 和 torch.load() 可以保存与加载张量或其他 PyTorch 对象。

这类操作可以用于:

• 保存中间计算结果

• 保存处理后的训练数据

• 保存模型参数

• 加载已有实验结果

在模型训练中,更常见的是保存模型参数:

加载时可以写成:

不过,模型保存与加载属于更完整的模型工程主题。对于本文来说,只需要先知道:torch 模块已经提供了基础的保存与加载能力。

十五、一个完整示例:用 torch 完成基础线性计算

下面用一个简单例子说明 torch 模块如何完成基础计算。我们构造输入矩阵 X、权重矩阵 W 和偏置 b,计算线性输出。


图 3:PyTorch 基础计算流程

这里最值得关注的是形状关系:

• X 的形状是 (5, 3)

• W 的形状是 (3, 2)

• X @ W 的形状是 (5, 2)

• b 的形状是 (2,),会通过广播加到每一行

• 最终输出 Y 的形状是 (5, 2)

这个例子已经接近神经网络中全连接层的核心计算。后续使用 nn.Linear 时,底层思想与此类似,只是参数管理、自动求导和模块封装由 PyTorch 自动完成。

十六、使用 torch 模块时应注意的问题

1、先看形状,再看数值

很多 PyTorch 错误首先是形状错误,而不是算法错误。

例如:

矩阵乘法要求前一个矩阵的列数等于后一个矩阵的行数。这里 A 是 (2, 3),B 是 (4, 5),中间维度 3 和 4 不一致,因此不能相乘。

调试时可以多打印:

这三个信息往往能帮助快速定位问题。

2、注意数据类型是否符合函数要求

有些函数要求输入是浮点张量,有些函数要求标签是整数张量。

例如:

如果把标签错误地处理成浮点类型或错误形状,某些损失函数可能无法按预期工作。

因此,在训练代码出错时,不要只检查形状,也要检查 dtype。

3、注意张量是否在同一设备

CPU 张量和 GPU 张量不能随意直接混合计算。常见错误是模型在 GPU 上,而输入数据仍在 CPU 上。

推荐写法是统一使用 device:

这样可以减少设备不一致导致的错误。

4、区分 reshape、view、permute 的作用

这几个函数都与形状有关,但含义不同:

• reshape():改变形状,常用且方便

• view():返回共享数据的新形状视图,对内存连续性更敏感

• permute():重新排列维度顺序

• transpose():交换两个维度

• flatten():展平多个维度

例如,图像张量从 (N, H, W, C) 转为 (N, C, H, W),应使用 permute(),而不是简单使用 reshape()。

reshape() 改变的是“如何看待这批元素的形状”,而 permute() 改变的是“维度顺序”。两者不能混用。

5、理解广播,而不是滥用广播

广播可以让代码更简洁,但也可能让错误更隐蔽。

例如,一个张量形状是 (100, 4),另一个张量形状是 (4,),它们相加通常是合理的,因为 (4,) 可以看作对每个样本的 4 个特征分别加偏置。

但如果本来想对每个样本加不同的数,却误写成了 (4,),代码可能仍然能运行,但含义已经错了。

因此,使用广播时应先问清楚:

• 哪个维度表示样本?

• 哪个维度表示特征?

• 哪个张量会被自动扩展?

• 扩展方向是否符合预期?

6、不要把 torch 模块只理解为“创建数组”

torch 模块不仅是创建数组的工具。它是 PyTorch 的基础计算层,承担了张量表示、数学运算、设备管理、随机数、保存加载等多种职责。

在后续学习中:

• 神经网络层会基于张量进行计算

• 自动求导会跟踪张量运算过程

• 优化器会根据张量梯度更新参数

• 数据加载器会把数据组织成批量张量

因此,理解 torch 模块,是理解整个 PyTorch 的基础。

小结

PyTorch 的 torch 模块负责张量表示与基础计算,是整个框架的底层入口。学习这一模块,重点不只是记住函数名称,而是理解张量的形状、数据类型、设备、运算规则和广播机制。掌握这些内容,才能更顺利地学习自动求导、神经网络建模和完整训练流程。

“点赞有美意,赞赏是鼓励”

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
著名高校原党委书记、校长去世

著名高校原党委书记、校长去世

双一流高校
2026-10-22 01:10:05
不查不知道,披日旗的南京留学生,私下有多壕,校方承诺开除遣返

不查不知道,披日旗的南京留学生,私下有多壕,校方承诺开除遣返

小鋭有话说
2026-10-20 22:13:14
李小冉给所有男人都好好上了一课,那句"给你五个亿随便作",如今回头看全是讽刺

李小冉给所有男人都好好上了一课,那句"给你五个亿随便作",如今回头看全是讽刺

南万说娱26
2026-10-20 08:49:32
卫子夫:女儿被杀,儿子刘据兵败,她跟随汉武帝38年,却自缢身亡

卫子夫:女儿被杀,儿子刘据兵败,她跟随汉武帝38年,却自缢身亡

史笔似尘钩
2025-05-24 15:05:24
中山大学附属七院被实名举报后,网友炸了:这哪是医院,这是企业吧?

中山大学附属七院被实名举报后,网友炸了:这哪是医院,这是企业吧?

歪歌社团
2026-10-22 14:23:22
市民在地铁站内的读书空间看书,5小时后出站被扣15元超时费,广州地铁回应→

市民在地铁站内的读书空间看书,5小时后出站被扣15元超时费,广州地铁回应→

珠江时报
2026-10-21 17:36:47
缅北逃生者含泪警告:逃出园区千万别打车!当地报警等于自投罗网,整个城镇都是“赏金猎人”

缅北逃生者含泪警告:逃出园区千万别打车!当地报警等于自投罗网,整个城镇都是“赏金猎人”

秋风妃
2026-10-11 20:00:24
王晓晨私下素颜抽烟打电话,穿得臃肿黑眼圈重,网友愣住:这跟镜头前真是同一个人

王晓晨私下素颜抽烟打电话,穿得臃肿黑眼圈重,网友愣住:这跟镜头前真是同一个人

可乐谈情感
2026-10-22 13:04:50
全红婵不对劲,不是她以后不比赛了,而是她今年19岁了,居然开始了自己的精致路线

全红婵不对劲,不是她以后不比赛了,而是她今年19岁了,居然开始了自己的精致路线

LULU生活家
2026-09-30 20:32:43
79年,张国焘冻死于老人院,许世友:除了毛泽东,谁也不是他对手

79年,张国焘冻死于老人院,许世友:除了毛泽东,谁也不是他对手

雍亲王府
2026-08-18 17:55:03
美军LCS凌晨突袭仙宾礁:44节极速配隐身外形,追不上又挡不住?

美军LCS凌晨突袭仙宾礁:44节极速配隐身外形,追不上又挡不住?

青史烟雨
2026-10-21 14:21:07
收评:创业板指低开低走跌超4% 全市场近5000只个股下挫

收评:创业板指低开低走跌超4% 全市场近5000只个股下挫

财联社
2026-10-22 15:30:04
记者当面提问拉夫罗夫:俄罗斯怎么只剩朝鲜和伊朗两个盟友?他一句反问让全场愣住

记者当面提问拉夫罗夫:俄罗斯怎么只剩朝鲜和伊朗两个盟友?他一句反问让全场愣住

磊子讲史
2026-10-10 14:38:38
3场CBA焦点战同时开打!广东难逃3连败,北京上海冲3连胜没啥悬念

3场CBA焦点战同时开打!广东难逃3连败,北京上海冲3连胜没啥悬念

萌兰聊个球
2026-10-22 09:26:49
一个国家能蠢到什么程度?看看法国就明白了:法国黑人接近800万,巴黎新生儿里70%是黑人

一个国家能蠢到什么程度?看看法国就明白了:法国黑人接近800万,巴黎新生儿里70%是黑人

怪味历史连连看
2026-09-08 01:55:32
克林顿自传揭秘中国大使馆被误炸经过:实际上命中了预定目标!

克林顿自传揭秘中国大使馆被误炸经过:实际上命中了预定目标!

舆图看世界
2026-10-17 15:50:04
那些高喊“电车我只相信特斯拉”的人,才是1896年的李鸿章

那些高喊“电车我只相信特斯拉”的人,才是1896年的李鸿章

明叔杂谈
2026-10-21 14:26:38
真实的大萧条:当时没人知道自己在萧条里

真实的大萧条:当时没人知道自己在萧条里

郑逻辑
2026-10-07 08:39:23
“28岁香港名媛蔡天凤被前夫碎尸”庭审曝新细节:白发老人曾买绞肉机,询问是否有碎骨机!前司机称蔡天凤夫妇在澳门欠下赌债

“28岁香港名媛蔡天凤被前夫碎尸”庭审曝新细节:白发老人曾买绞肉机,询问是否有碎骨机!前司机称蔡天凤夫妇在澳门欠下赌债

每日经济新闻
2026-10-21 18:13:12
炸裂!女网红和男子开房,因动作太猛导致女网红腰部骨折,告上法庭索赔50万

炸裂!女网红和男子开房,因动作太猛导致女网红腰部骨折,告上法庭索赔50万

小徐讲八卦
2026-09-17 09:49:48
2026-10-22 17:35:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
2247文章数 85关注度
往期回顾 全部

科技要闻

腾讯云谷歌紧急行动!互联网安全出大事

头条要闻

媒体:日本防卫省批准了47项"研究课题" 这事不简单

头条要闻

媒体:日本防卫省批准了47项"研究课题" 这事不简单

体育要闻

热闹的NBA回来了,他却倒在新赛季大门口

娱乐要闻

芭莎盛典,张小斐因救场实现口碑暴涨

财经要闻

数据中心建设延期潮 谁受伤、谁受益?

汽车要闻

有七座/续航提升 领克900L曝光还可选双色车身+大饼轮毂

态度原创

健康
教育
时尚
游戏
数码

痘痘能根治吗?皮肤科医生说实话

教育要闻

低年级学生家长一定看看这篇文章

“夹克+裤子”才是今年秋冬最流行搭配,怎么穿都时髦高级!

PS5破解新进展:插盘可玩PS2游戏!索尼不兼它强兼

数码要闻

赛睿Aeon Pro手柄国行上市:集成OLED屏,换电设计,2599元

无障碍浏览 进入关怀版