PyTorch深度学习入门:从张量到训练闭环与排错 简介这份PDF资源《Python深度学习基于PyTorch》面向深度学习零基础到入门阶段的读者尤其适合希望系统掌握PyTorch框架、理解每个常用函数用法与背后原理的编程爱好者。内容以Numpy基础、Tensor与Autograd、神经网络工具箱、数据处理工具箱为起点逐步延伸到卷积神经网络、循环神经网络、生成式模型与人脸检测、迁移学习等实战方向兼顾机器学习流程、优化器选择、GPU加速等易被忽略的工程细节帮助读者把零散知识串成可复用的实践路径。资源包共1个文件为PDF格式电子书整体约21.68MB便于在电脑或平板上随时查阅与检索。目前已有5666人学习下载说明其在入门群体中具有较高的参考价值。对于想边学边练、从函数用法过渡到完整项目搭建的读者这份资料可作为较系统的入门读物与查阅手册。1. 先破一个误解PyTorch 入门不是背公式是搭积木很多人第一次听到「Python 深度学习」「PyTorch 入门」这几个词脑子里立刻浮现一黑板偏导数和希腊字母然后默默把网页关掉。换个画面就轻松多了PyTorch 更像一盒乐高你决定搭几层、每层多宽它负责在你搭歪之后把每块积木该往哪挪一点算出来。所谓训练模型就是反复搭、反复拆、看误差往哪边走。这份资源干的事就是把「哪块积木该放哪、每个零件叫什么名字」写成一份带图带例子的说明书从数组怎么建、张量怎么变形一路讲到卷积网络和生成模型。它面向会一点 Python、但没碰过深度学习的人也适合被数学符号劝退过一次、想换个方式重新开始的人。2. 为什么新手要绕道 Numpy 一遍PyTorch 的底层语言你得先听懂2.1 先明白一件事PyTorch 的 Tensor 是 Numpy 数组的亲戚书里把 Numpy 放在最前面不是凑章节。深度学习里所有输入——图片、声音、文本——进网络之前都会被转成数组或矩阵而 Numpy 就是干这个的通用工具。Python 自带的列表虽然灵活但列表里存的其实是一堆指针存一个[1, 2, 3]要维护三个指针加三个整数对象元素一多内存和 CPU 都吃不消自带的 array 又只支持一维函数也少。Numpy 的ndarray补上了这块它是存单一数据类型的多维数组能对整个数组做算术不用写循环。更关键的是 PyTorch 的Tensor和ndarray长得几乎一样两者能互相转换PyTorch 还沿用了大量 Numpy 的命令。你先把 Numpy 的手感练出来后面看到shape、reshape、广播这些词就不会发怵。我第一次学的时候就是跳过了这步结果在张量形状上反复翻车回头补了两天 Numpy 才顺过来。2.2 动手五个 Numpy 操作够你读懂前面几章先把环境里的 Numpy 用起来下面这段可以原样敲进 Jupyter Notebook 跑。import numpy as np # 1) 从列表创建一维和二维 a np.array([1, 2, 3]) b np.array([[1, 2, 3], [4, 5, 6]]) print(a.shape) # (3,) 一维3 个元素 print(b.shape) # (2, 3) 两行三列 print(b.dtype) # int64 整个数组只存一种类型shape是你以后排错时看得最多的东西养成习惯只要报错说尺寸不匹配第一反应就是打印shape。dtype说明 ndarray 只装同一种类型这也是它比列表省内存的原因。# 2) 两种乘法完全是两件事 x np.array([[1, 2], [3, 4]]) y np.array([[5, 6], [7, 8]]) print(x * y) # 对应位置相乘 print(x.dot(y)) # 矩阵乘法也可以写成 x y新手最常混的就是这两个。*是逐元素算dot才是线性代数意义上的矩阵乘法。神经网络里的全连接层用的是后者数据预处理里的归一化用的是前者。# 3) 变形与合并改形状不改变数据本身 z np.arange(12) # 0 到 11 的一维数组 print(z.reshape(3, 4)) # 变成 3 行 4 列 print(z.reshape(3, -1)) # -1 表示这一维你帮我算出来 p np.array([[1, 2]]) q np.array([[3, 4]]) print(np.concatenate([p, q], axis0)) # 沿行方向叠起来reshape只是换了个看法数据顺序没变元素总数必须对得上12 个元素不能变成 3 行 5 列。-1是个省事写法你给出其他维度它自动推算剩下那一维。# 4) 广播形状不同也能算但有规则 m np.array([[1, 2, 3], [4, 5, 6]]) # 形状 (2, 3) n np.array([10, 20, 30]) # 形状 (3,) print(m n) # n 被复制成两行再逐元素相加广播的规则是从最右边一维开始比维度相等或者其中一个是 1就能算否则直接报错。这个机制省掉了大量手写循环也是后面 Tensor 运算的基础。2.3 从 ndarray 到 Tensor换个名字手感不变把上面这些换成 PyTorch 的写法你会发现大部分函数名都没变。import torch import numpy as np arr np.array([1.0, 2.0, 3.0]) t torch.from_numpy(arr) # 和 arr 共享内存 t2 torch.tensor([1.0, 2.0, 3.0]) # 复制一份新的 arr[0] 99 print(t) # tensor([99., 2., 3.], dtypetorch.float64) 跟着变了 print(t2) # tensor([1., 2., 3.]) 没受影响from_numpy是共享内存改一边另一边也变tensor()是复制。这个区别在做数据预处理时会坑人你以为改了副本其实把原始数据也改了。Tensor比ndarray多出来的核心能力有两个一是能放到 GPU 上算二是能记录计算过程、自动求导。t.device会告诉你它在 CPU 还是 GPU 上t.requires_grad告诉你它要不要参与求导。入门阶段先盯住shape、dtype、device这三个属性绝大多数报错都能从这里找到线索。3. 第一个能跑的例子20 行代码让张量自己算梯度3.1 装环境先跑 CPU 版别一上来就折腾显卡书里给的运行环境是 Python 3.6 以上、PyTorch 1.0 以上CPU 或 GPU 都行Windows 和 Linux 都能跑。对新手来说第一周完全不需要 GPUCPU 版足够跑通前四章所有例子。装之前先建一个虚拟环境避免和你电脑里其他项目的包打架。# 建一个干净的虚拟环境 python -m venv dl-env # 激活Windows 用 dl-env\Scripts\activate source dl-env/bin/activate # 装基础三件套先不碰 GPU 版本 pip install numpy torch torchvision三条命令依次是创建环境、激活环境、装包。激活之后命令行前面会出现(dl-env)字样看到它就说明后面的pip install装进了这个环境而不是系统全局。这一条能挡掉后面一半的「装完了却 import 不到」的问题。装完用下面两行验证能打印出版本号就说明通了。import torch print(torch.__version__)3.2 第一个程序三行创建一行求导import torch # 两个需要被学习的参数requires_gradTrue 表示要算它们的梯度 w torch.tensor(2.0, requires_gradTrue) b torch.tensor(1.0, requires_gradTrue) x torch.tensor(3.0) y w * x b # 前向算出一个结果 y.backward() # 反向从 y 往回推每个参数的梯度 print(y.item()) # 7.0 print(w.grad) # 3.0因为 dy/dw x 3 print(b.grad) # 1.0因为 dy/db 1y.item()把只有一个元素的张量取成普通 Python 数字方便打印。y.backward()是 PyTorch 的核心动作它沿着你刚才写的计算过程倒着走一遍用链式法则把每个参数的偏导算出来结果存在.grad里。你手算一遍y w*x b对w的导数结果就是x正好是 3对得上。这段代码短但它就是所有深度学习训练的骨架前向算结果反向算梯度。后面不管网络有多少层、多少参数动作都是这两步的重复。3.3 再走一步把「训练」这个闭环补齐只会算梯度还不够模型得靠一次次调整参数慢慢逼近答案。下面这个例子里我们先造一批来自直线y 3x 2的点然后让模型自己把 3 和 2 猜出来。import torch # 造数据真实规律是 y 3x 2再加一点噪声 x torch.linspace(-1, 1, 100).unsqueeze(1) # (100, 1) y 3 * x 2 0.1 * torch.randn(x.size()) model torch.nn.Linear(1, 1) # 一个输入、一个输出的线性层 loss_fn torch.nn.MSELoss() # 均方误差 optimizer torch.optim.SGD(model.parameters(), lr0.1) for step in range(200): pred model(x) # 前向 loss loss_fn(pred, y) # 算误差 optimizer.zero_grad() # 清掉上一步残留的梯度 loss.backward() # 反向算梯度 optimizer.step() # 沿梯度反方向挪一小步 if step % 50 0: print(step, round(loss.item(), 4)) print(model.weight.item(), model.bias.item()) # 应该接近 3 和 2几个参数值得说清楚。unsqueeze(1)把形状从(100,)变成(100, 1)因为nn.Linear要求输入最后一维是特征数。lr0.1是学习率决定每步挪多大太大来回震荡太小半天不动0.01 到 0.1 之间先试。zero_grad()必须写在backward()前面否则梯度会一步步累加越跑越歪。range(200)是迭代轮数这里 200 步足够收敛到接近真实值。跑完你会看到 loss 从大变小最后打印出的weight和bias分别在 3 和 2 附近。这就是一个完整的训练闭环只是网络规模小到一眼能看懂。3.4 把四行代码翻译成四句人话pred model(x)是前向传播拿当前参数算一遍预测值loss loss_fn(pred, y)是拿预测和真实值比得出一个误差分数loss.backward()是反向传播问每个参数「你刚才那一小步让误差变大了还是变小了」optimizer.step()是照着答案挪一步。四句话对应四行缺一行都不转。书里反复强调的一点是 PyTorch 用动态计算图你写一行它算一行计算过程当场建起来出错时可以像普通 Python 一样打断点检查。这是它比静态图框架更容易上手的地方尤其是新手排错时能省下大量猜谜时间。4. 新手排查清单环境、形状、梯度、不收敛这四类坑4.1 坑一装完了import 却报找不到模块现象ModuleNotFoundError: No module named torch但明明刚执行过安装命令。原因八成是装到了另一个 Python 环境里。你的终端可能没激活虚拟环境或者装了包的pip和跑代码的python不是同一个。解决先跑which pythonWindows 用where python确认当前解释器路径再跑pip list | grep torch确认包里有没有它。两个对不上就用python -m pip install torch强制用当前解释器装。这个习惯能挡掉后面九成的环境玄学。4.2 坑二形状对不上报 size mismatch现象RuntimeError: mat1 and mat2 shapes cannot be multiplied或者shape [x] is invalid for input of size y。原因矩阵乘法要求前一维的列数等于后一维的行数reshape要求元素总数守恒。新手常犯的是忘了 batch 那一维比如模型期待(batch, features)你喂进去(features,)。解决在报错那行前后各加一句print(tensor.shape)把每一层的输入输出尺寸列出来从第一个不对的地方改。记得nn.Linear(1, 1)里两个 1 分别是输入特征数和输出特征数不是样本数。4.3 坑三梯度是 None或者报 does not require grad现象训练跑完model.weight.grad打印出来是None或者报element 0 of tensors does not require grad and does not have a grad_fn。原因要么参数创建时没设requires_gradTrue要么中途用了.item()、.detach()或torch.no_grad()把计算链截断了。nn.Module里的参数默认是开的但你自己手动建的张量默认是关的。解决打印w.requires_grad看一眼确认backward()之前的每一步都还在计算图上。用.item()只是为了打印别在算 loss 的时候用。4.4 坑四loss 一动不动或者变成 nan现象跑了几百步loss 在同一个数附近晃或者干脆变成nan。原因最常见的三个——学习率太大直接把参数甩飞、数据没归一化导致数值量级悬殊、以及忘了写zero_grad()让梯度一路累加。解决先把学习率除以 10 再试把输入数据缩到 0 到 1 或标准正态检查循环里有没有optimizer.zero_grad()。这三条按顺序排查大部分不收敛都能救回来。我第一次跑线性回归时 loss 一直爆查了半天是学习率填了 1.0改小之后立刻正常这种血泪经验只能自己踩一遍才记得牢。5. 顺着目录往上爬四个台阶加一个阶段对照表5.1 台阶一把 Numpy 和 Tensor 练成肌肉记忆这一台阶对应书的第一部分开头。目标不是背函数是看到shape、reshape、广播、点积这些词时手能跟上。练法是每个函数自己敲三遍、改一个参数看结果怎么变。比如把reshape(3, 4)改成reshape(2, 6)看数据怎么重排把广播里的一维数组换成二维看哪些能算哪些报错。这个阶段大概花三到五天练完的标志是给你一个报错信息你能立刻想到去打印哪个张量的形状。5.2 台阶二nn 工具箱和数据管道这一台阶对应书里讲神经网络工具箱和数据处理工具箱的部分。nn.Module是搭网络的积木盒你的模型就是一个继承它、在forward里写前向逻辑的类nn.functional放的是无状态的函数比如激活函数、损失函数。数据处理那块讲utils.data和torchvision负责把图片读进来、做变换、打包成 batch。练法把第 3 章那个线性回归改写成nn.Module的子类功能完全一样但结构变成标准写法。再试着用DataLoader把数据分批次喂进去观察 batch size 变化时 loss 曲线的抖动。练完的标志是能看懂一个别人写的模型类知道每一行在干什么。5.3 台阶三机器学习基础和卷积网络这一台阶进入书的第二部分先讲机器学习的基本任务、一般流程、过拟合与欠拟合再讲卷积神经网络的卷积核、步幅、填充、池化然后落到几个经典网络上。这部分是深度学习的正面战场也是最容易卡住的地方。我的建议是先别急着啃公式按书里的顺序跑一遍图像分类的例子跑通之后再回头理解每一层的作用。练法拿一个图像分类数据集先用最简单的卷积网络跑出个及格线再逐步加层、加数据增强、换更好的网络结构看准确率怎么往上走。书里就示范了这种渐进路线从基础网络一路优化到明显更高的精度。练完的标志是你能说清楚卷积层在提取什么、池化层在压缩什么。5.4 台阶四自然语言处理、生成模型和实战项目书的第三部分是实战涵盖人脸检测识别、迁移学习、机器翻译、生成式模型、对抗攻击、强化学习等方向。这部分不需要全做挑一个你最感兴趣的方向深入就行。想学图像就做迁移学习和风格迁移想学文本就做词性判别和翻译想玩生成就做图像生成那几个例子。练法每个方向只跑通一个完整例子从数据加载到训练到测试全走一遍不要中途换项目。练完的标志是你能独立复现一个例子并且能改掉其中一个模块换成自己的想法。台阶主要内容大概投入练完的标志一Numpy 与 Tensor 基础3 到 5 天看报错能定位到形状问题二nn 工具箱与数据加载1 到 2 周能读懂并改写一个模型类三机器学习基础与卷积网络2 到 3 周能跑通图像分类并调优四实战项目任选其一2 到 4 周能独立复现并改动一个例子6. 下一步学什么选一条路线走满三个月入门之后最容易犯的错是同时开五个方向每个都停在第一章。我更建议你选一条主线按「跑通、改坏、修好、复现」四步走完一个完整周期。第一条路线偏视觉从卷积网络分类出发先跑通一个基础模型拿到及格线再依次加入数据增强、迁移学习、模型集成观察每一步涨了多少。这条路线的好处是反馈快训练几轮就能在验证集上看到数字变化。第二条路线偏文本从词嵌入和循环网络入手先做词性判别这类小任务再去做翻译。文本任务的输入处理比图像麻烦预处理阶段会花掉不少时间但跑通之后对序列数据的理解会深很多。第三条路线偏生成从自编码器和对抗生成网络入手先让模型生成模糊的图再逐步调结构。这条路线训练不稳定容易看到 loss 乱跳正好可以用来练排查能力。不管选哪条给自己定一个交付物一个能跑的脚本、一份记录每次实验参数的表格、一篇写给自己看的复盘。三个月后回头看决定你进步速度的不是看了多少页而是有没有把同一个例子改到自己能讲清楚。从那以后我每次开新项目都强制先跑一个最小可用的版本再往上加功能绝不一上来就搭大结构——这个习惯帮我省下了无数个 debug 到半夜的晚上。希望帮到你。这份资源把从环境搭建到实战项目的路径都铺好了代码和讲解是配套的拿到之后别从头读到尾挑一个台阶直接开敲遇到卡壳再回头翻对应章节效率会高得多。本文还有配套的精品资源点击获取