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

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-28 21:43:17
霉霉自曝与布拉德·佩斯利断交19年:他把上千只蟋蟀放进我巡演大巴

霉霉自曝与布拉德·佩斯利断交19年:他把上千只蟋蟀放进我巡演大巴

热搜摘要官
2026-10-28 03:06:12
为什么全球选民都开始用民生丈量政治了?

为什么全球选民都开始用民生丈量政治了?

风铃草语
2026-10-28 07:20:10
大势定了!油价风向已经明确,下月开始,燃油车主躲不开三件事

大势定了!油价风向已经明确,下月开始,燃油车主躲不开三件事

笑熬浆糊111
2026-10-28 06:00:28
世界上最安全的两个国家,一个谁也打不过,一个谁也不敢打

世界上最安全的两个国家,一个谁也打不过,一个谁也不敢打

怪味历史连连看
2026-10-26 17:45:28
日本女单全军覆没!日媒再次甩锅中国,张本美和这番话,彻底破防

日本女单全军覆没!日媒再次甩锅中国,张本美和这番话,彻底破防

湘村大余
2026-10-28 20:11:01
总有人抱有幻想,我再说一遍,就算失业在家玩,也不要开网约车!

总有人抱有幻想,我再说一遍,就算失业在家玩,也不要开网约车!

乌克兰小静
2026-10-28 07:31:42
中美2026年GDP预测对比:美国GDP有望突破226万亿,中国如何呢?

中美2026年GDP预测对比:美国GDP有望突破226万亿,中国如何呢?

北海史记
2026-10-28 21:19:52
全额退款!65岁庾澄庆广州演唱会遇冷引热议,网友:果然人老了,干什么都心酸

全额退款!65岁庾澄庆广州演唱会遇冷引热议,网友:果然人老了,干什么都心酸

火山詩话
2026-10-28 13:20:09
“宁德时代电池没了”,理想MEGA部分订单无法按约交付:定金退一赔一或换自研电池

“宁德时代电池没了”,理想MEGA部分订单无法按约交付:定金退一赔一或换自研电池

红星资本局
2026-10-28 20:16:09
农商行“解散”不是倒闭,手里有存款的中老年人一定要看

农商行“解散”不是倒闭,手里有存款的中老年人一定要看

坠入二次元的海洋
2026-10-28 18:12:21
印度30万大军压境,再赌中国“不会先动手”?

印度30万大军压境,再赌中国“不会先动手”?

健身狂人
2026-10-27 06:12:23
霜降后,这3种鱼再贵也要买,比鲫鱼鲜,比带鱼有营养,要多吃

霜降后,这3种鱼再贵也要买,比鲫鱼鲜,比带鱼有营养,要多吃

阿龙美食记
2026-10-26 12:22:39
CBA最大黑马球队产生,碾压上海辽宁,广东队服了,要挑战北京

CBA最大黑马球队产生,碾压上海辽宁,广东队服了,要挑战北京

宗介说体育
2026-10-28 15:48:56
人社部重点严查五类退休人员!

人社部重点严查五类退休人员!

逍遥论经
2026-10-17 17:39:47
江浙沪地区是男人的天堂

江浙沪地区是男人的天堂

微微热评
2026-10-28 17:48:16
丰田顶不住了,中大型SUV配2.4T混动,一口气降14.75万,却卖不动

丰田顶不住了,中大型SUV配2.4T混动,一口气降14.75万,却卖不动

音乐时光的娱乐
2026-10-28 04:17:02
喊“杨老五”的观众有后续消息了!此人是杨议粉丝,当天还在招待客户,跟着喊一句热场子摊上大事

喊“杨老五”的观众有后续消息了!此人是杨议粉丝,当天还在招待客户,跟着喊一句热场子摊上大事

火山詩话
2026-10-28 08:40:11
女子怒斥男网红出轨21人!晒聊天记录,却泄露男子下体照,6000多人已看过

女子怒斥男网红出轨21人!晒聊天记录,却泄露男子下体照,6000多人已看过

北京郑律师
2026-10-29 02:21:08
以色列大选落幕,内塔尼亚胡没想到,将面临三大深层变局

以色列大选落幕,内塔尼亚胡没想到,将面临三大深层变局

兵国大事
2026-10-28 15:54:32
2026-10-29 05:27:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
2258文章数 85关注度
往期回顾 全部

科技要闻

宇树科技前三季净利暴增270%

头条要闻

仅退款后冰柜仍插着电在使用 买家回应

头条要闻

仅退款后冰柜仍插着电在使用 买家回应

体育要闻

0胜4负与篮网国王一桌 热火字母哥赌错了?

娱乐要闻

巾帼不让须眉!章子怡拿下重磅荣誉

财经要闻

iPhone Duo七年等来一场吐槽大会

汽车要闻

首销期权益价23.98万起 2026款理想i6上市

态度原创

旅游
手机
房产
艺术
健康

旅游要闻

忻州古城“古城焕新·产城共荣”入选2026中国旅游产业影响力案例

手机要闻

华为Pura90 Plus、畅享100系列发布!多款新品亮相

房产要闻

重新定义城芯院墅生活!33席印德华府,看见湾区墅居的时代答案

艺术要闻

23张人性与爱的照片,第1张就让人破防了……

查不出猝死风险?可能是项目没做对

无障碍浏览 进入关怀版