简介:《动手学深度学习PyTorch》是一本面向深度学习入门与进阶读者的实践型电子书,由Aston Zhang、Zachary C. Lipton、Mu Li和Alexander J. Smola共同撰写,当前版本为Release 2.0.0-alpha2,更新于2021年8月。全书围绕PyTorch框架展开,开篇介绍安装配置与基本数据结构,随后通过数据操作章节详细讲解张量创建、数学运算、广播机制、索引切片、内存优化以及与其他Python对象转换等实用技巧;数据预处理章节则覆盖数据集读取、缺失值处理和转张量格式。后续还系统讲解线性代数中的标量、向量、矩阵、张量及范数等内容,并延伸到神经网络、损失函数、反向传播、优化算法、CNN、RNN和NLP应用,同时涉及GPU加速,理论与实践并重。资源为1个PDF文件,压缩包大小约22.13MB,目录结构完整,适合系统查阅。目前已有5934人学习使用,是掌握PyTorch深度学习的扎实参考。 我就是靠啃这本PDF把深度学习基础打牢的。在做算法工程师这几年里,翻得最多的资料就是《动手学深度学习》PyTorch版,它不像很多厚得像砖头的教材那样一上来就堆公式,而是每一章都配套可运行的代码,让你在命令行里亲眼看着模型“学”起来。今天想结合我自己的学习路线和踩坑经历,聊聊这本书究竟该怎么看、怎么用,以及从PDF到真正上手之间,你还差哪些关键步骤。

1. 为什么这本书值得从头到尾“动手”过一遍

1.1 它解决的不是“看不懂”,而是“不会做”

很多初学者拿到深度学习的资料,第一反应是先去推数学公式、理解反向传播、搞懂矩阵求导,结果推了两周线性代数,连一个最简单的模型都没跑通。这其实是典型的路线错误。深度学习本质上是实验科学,代码跑通了、损失下降了、精度提升了,你对原理的理解才会自然跟上。《动手学深度学习》PyTorch版这套书的核心思路,就是让你“先跑起来,再搞懂为什么”。

它的内容组织方式是:每一个章节先抛出问题场景(比如如何识别图片里的猫、如何预测房价),再给出可运行的完整代码,然后用公式和图示解释代码背后的数学原理。这个顺序特别重要,因为大脑在“有一个具体可见的结果”之后再接收抽象推导,记忆效率要高得多。比如第3章线性回归,你会在几分钟内训练出一个预测房价的模型,然后再去理解损失函数、梯度下降,就不会觉得这些概念是空中楼阁。

1.2 PDF形态反而更适合深度学习入门

有人会问:现在网上教程那么多,视频课也一堆,为什么还要看PDF?我个人体验是,读PDF的“主动学习”属性比看视频强太多。视频课容易出现一种假象——眼睛看着老师在敲代码,耳朵听着讲解,觉得“我都懂了”,一关视频自己写就卡住。而PDF这种文字+代码的载体,逼迫你一个字一个字地读,遇到不懂的地方停下来,把手放到键盘上,自己敲一遍,这个从“看懂”到“写出来”的过程,才是真正的学习。

另一个实用好处是检索方便。这本书的PDF版本支持全文搜索,比如你写代码时突然忘记了某个API的用法,直接搜“transpose”或“view”就能定位到相应章节,比翻纸质书快太多。我当年就是一边开着PyCharm敲代码,一边开着PDF搜索查函数的参数含义,效率非常高。而且PDF可以随意做高亮、注释、书签,完全不心疼把书翻烂。

1.3 适合哪些人拿来入门

如果你符合下面任何一种情况,这本书都是绝佳的起点:在校学生,刚学完Python基础,想进入深度学习方向;已经工作的开发者,需要用计算机视觉、NLP技术解决业务问题,但缺乏系统性理论基础;准备算法岗面试,需要快速建立深度学习知识体系同时积累实战代码量的人。它默认你会Python基础语法和基本线性代数概念,但即使这两块薄弱,书里的代码注释也足够详细,搭配网上任何一门Python快速教程,都能跟上。

2. 动手之前,先把PyTorch环境配好

2.1 环境配置的坑,九成出在版本匹配

很多人一看《动手学深度学习》里的代码就迫不及待想跑,结果连环境都没装明白。PyTorch环境搭建确实是新手遇到的第一道坎,尤其在国内网络环境下,下载慢、镜像配置错误、CUDA版本不匹配,随便一个都能卡上半天。但我不想让你在这个环节消耗太多意志力,因为环境问题本质上是经验问题,踩过一次,后面就会变成熟工。

先说我的推荐方案:用Anaconda创建独立的虚拟环境,不要直接装在系统Python里。Anaconda的好处是环境隔离干净,不同项目用不同Python版本和依赖库互相不干扰。打开命令行,依次执行:

conda create -n d2l python=3.9
conda activate d2l
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu

这段代码创建了一个名为d2l的虚拟环境,然后安装了CPU版PyTorch。如果你有NVIDIA独立显卡,想用GPU加速,需要先查看自己显卡支持的CUDA版本,再安装对应的GPU版本。很多人误以为装上NVIDIA驱动就万事大吉,其实PyTorch是通过CUDA工具包和显卡驱动协同工作的,两者版本必须匹配。查看CUDA版本的命令:

nvidia-smi

在输出结果的右上角能看到CUDA Version,比如12.4,那就可以安装对应cu124版本的PyTorch。

2.2 一本书级的学习环境长什么样

除了PyTorch本体,还建议装Jupyter Notebook。这本PDF里的代码按章节组织成一个个notebook,你一边读章节,一边在notebook里填充执行代码,交互体验非常好。安装只需要一行命令:

pip install jupyter d2l

这个d2l库是书作者配套编写的工具包,里有绘图函数、数据处理工具和模型训练的辅助方法,书里的代码都会调用它。装好之后在命令行输入 jupyter notebook ,浏览器就会弹出文件管理界面,找到你下载好的notebook文件就能开始跑了。

我用过的项目级环境配置流程是这样的:Windows或者Linux下,先确认Python版本在3.8到3.11之间;安装时尽量用conda管理,而不是全靠pip,因为conda对二进制依赖的处理更稳;装完一切之后,写一个三行代码自测:

import torch
print(torch.__version__)
print(torch.cuda.is_available())
x = torch.randn(3, 3)
print(x)

如果能看到版本号输出、CUDA可用状态(你的机器不支持GPU则显示False属正常),并且能打印出随机张量矩阵,就说明环境已经通了。

2.3 GPU和云平台怎么选

书里大部分小实验用CPU也能跑,只是速度慢一些。线性回归、Softmax分类、多层感知机这些基础模型,CPU训练几十个epoch也就几分钟的事。但是到了第七章卷积神经网络、第八章循环神经网络,尤其要训练图像数据集时,CPU版本的训练时间会被拉长到难以忍受的程度。我的建议是:如果条件允许,一步到位装GPU版;暂时没有独立显卡,也可以先用Google Colab之类的云端notebook,免费额度训练一些中小型模型绰绰有余。

关于深度学习的环境搭建,网上教程很多,但绝大多数都忽略了一个关键点:CUDA、cuDNN、PyTorch三者之间存在一个兼容矩阵,不是随便下载最新版就能直接配合使用。所以我强烈建议,在安装之前先去PyTorch官网那个“Get Started”页面,选好你的操作系统、包管理器、CUDA版本,它会自动生成对应的安装命令,复制粘贴执行即可。这比你在网上找到的各种零散教程要可靠得多。

3. 核心章节技术点拆解:从自动求导到Transformer

3.1 不要跳过自动求导直接进模型

很多人学深度学习时有个坏习惯:一上来就看卷积神经网络、看Transformer,觉得那些才是“时髦”的东西。但如果你跳过前几章的基础,后面大概率会在写代码时卡壳。《动手学深度学习》在第2章就安排了一个关键的概念——自动求导(automatic differentiation)。

PyTorch的自动求导机制,简单说就是当你定义一个张量并设置了 requires_grad=True ,PyTorch会自动记录你在这个张量上做的所有运算,然后当你调用 backward() 时,它能自动计算出最终的损失函数对这个张量的梯度。这个机制省去了你手推导数、手写偏导链式法则的麻烦。打个比方:这就像开车用自动挡,你不用时刻判断该挂几挡,变速箱会根据速度和油门自动切换。但是如果你不理解发动机和齿轮的基本原理,遇到上坡下坡的特殊情况就不知道怎么应对。同理,如果你不理解自动求导在做什么,当需要自定义一个复杂模型、手动修改梯度时,就会一头雾水。

书里这一章的练习也很实在:让你实现标量对向量的求导、向量对矩阵的求导,并验证手动计算的结果和代码输出的结果是否一致。我建议你别跳过这个练习,它只需要十几分钟,但对后续理解“为什么我的梯度更新是这个方向”非常有帮助。

3.2 数据加载器DataLoader的隐藏价值

在进入经典的神经网络章节之前,值得花点时间吃透DataLoader这个组件。很多教程只告诉你怎么用 torch.utils.data.DataLoader 去载入数据,但《动手学深度学习》把这个过程拆开了:数据从原始文件到Python对象再到Batch张量,每一步都在做什么,batch size变化对训练收敛速度的影响,shuffle为什么能减少模型过拟合到特定训练顺序的风险。

实际业务场景中,数据加载往往是整个训练流程里最容易出问题的环节:图像数据的尺寸不一致、文本数据的填充长度不一样、内存不足导致OOM,这些都得靠你对数据加载流程的深刻理解去解决。书里把这块讲得浅显且系统,跟着代码走一遍,你就知道怎么用torchvision自带的数据集、怎么自定义Dataset类、怎么把transform做进去,以后换到自己的项目里,这些全都是复用性极强的技能。

3.3 卷积神经网络:看清楚每一层在干什么

到了第七章,书里开始讲卷积神经网络(CNN)。那一章的图解非常经典——你可以把卷积层想象成用一个放大镜在图片上滑动,每滑动到一个位置就记录这个区域的特征,得到一张新的“特征图”。多个卷积核叠加,就相当于用不同角度的放大镜去观察同一个物体,有的关注边缘、有的关注纹理、有的关注颜色变化,最终组合起来形成对图片内容的整体理解。

实操时最有价值的代码是手动打印每一层输出的张量形状。你定义一个包含卷积、池化、全连接层的网络,然后把一张图片向量喂进去,逐层打印shape。这个过程能直观看到数据从维度3×224×224的彩色图片,一步步变成256个通道的特征图,最后压平成向量送入全连接层。我当年就是通过这个练习彻底理解了CNN各层之间的数据流动,面试时被问到“卷积层参数量怎么算”,也能很快推导出来。

书里还配套讲了现代CNN的几大经典结构:AlexNet、VGG、NiN、GoogLeNet、ResNet。不需要每一行代码都背下来,但一定要动手跑一遍,观察不同网络的层数、参数量、训练时间差异。你会发现,模型深度增加并不一定意味着效果更好,如果没有任何残差连接等技巧,深层网络反而会退化,这个观察会帮你建立对“模型设计”的直觉。

3.4 循环神经网络与Transformer的代码对比

如果说CNN是“看图”,那循环神经网络(RNN)和Transformer就是“读懂顺序”。书里从语言模型切入,先讲怎么用一个接一个的Hidden State去预测下一个词。RNN的朴素代码实现并不复杂,但有个致命弱点:序列太长时,最早的信息会在传递过程中被“稀释”掉,就像传话游戏传到最后只剩几个零碎单词。

Transformer的注意力机制把这套逻辑换了一个思路:不再严格按顺序传递信息,而是让序列中的每个元素直接跟所有其他元素计算相关性。这种“你看着我、我看着你”的机制,让模型能在一句话里同时关注到最关键的几个词,而不受距离限制。书里把缩放点积注意力(Scaled Dot-Product Attention)的数学公式和实现代码放在一起,一步步拆解Q、K、V三个矩阵是怎么从输入张量里线性映射出来的。

我的建议是,把它的多头注意力(Multi-Head Attention)代码自己重写一遍,不要直接复制。当你亲手实现过从一个QKV投影矩阵到多头拼接的完整过程,你再看工业界部署的各类大模型架构,就会有种“看穿底牌”的感觉。现在很多深度学习岗位的面试题,会直接让你手写一个简化的注意力机制,这本书的训练足够帮你应付这种场景了。

3.5 优化算法与训练技巧:验证你的模型真的在“学”

在掌握了几大主流网络结构之后,书里用相当篇幅讲解优化算法:动量法、AdaGrad、RMSProp、Adam。这一章很多人一眼带过,觉得“无非是换一个优化器”,但我的经验是,理解了这些算法的区别,你才能在模型不收敛时快速定位问题。比如Adam自带自适应学习率,通常比SGD更“好调参”,但它有时候会收敛到泛化性能较差的局部最优;动量法则能帮助SGD越过一些小的“坑”。书里的可视化插图把这些优化算法的更新轨迹画了出来,一目了然。

训练技巧部分还涵盖了正则化、Dropout、Batch Normalization、学习率调度等,这些都是在实际项目中决定你模型能不能用的关键。以Batch Normalization为例,它的作用是把每一层的数据分布拉回到标准正态分布附近,让梯度传播更顺畅,这样你可以使用更大的学习率,训练速度显著提升。书里配套代码可以让你对比加与不加BN时,同一网络在相同epoch内的训练精度差异,这种“眼见为实”的学习方式比背诵知识点管用一百倍。

4. 实操过程与避坑实录

4.1 我的完整跑通路径

我拿到这本书PDF之后的实操路径是这样的:先花一晚上把Anaconda和PyTorch装好,把notebook环境跑通;然后用两到三周的业余时间,按顺序过前面5章,每天跑1-2个notebook,重点不是尽快刷完,而是把每段代码手动敲一遍,观察输出;到卷积神经网络和循环神经网络的章节,我开始在本地准备一个小数据集(比如书里自带的Fashion-MNIST),把模型换成自己的数据来训练,看准确率变化。这个过程花了大概一个半月,但之后再看任何深度学习论文代码,都不再有“阅读障碍”。

具体到实操中的步骤,我给自己的要求是:看到一个章节先用5分钟浏览本节标题、公式和代码框架,猜猜作者要做什么;然后不看答案自己尝试实现核心函数;卡住了再看PDF里的代码,对照自己的写法思考差异;最后跑通后用文字总结这段代码解决了什么问题。这套“先猜后看”的方法,让学习效率提升特别明显,也让我养成了阅读源码的习惯。

4.2 环境配置和高版本PyTorch的匹配问题

PyTorch版本迭代很快,书里有些代码是用老版本API写的,在高版本里可能会遇到API变动。最常见的就是部分函数移了位置或者改了名称,比如 torch.nn.functional 里的某些函数参数调整了顺序。我的习惯是在遇到报错时先看错误信息的最后一行,大部分情况会提示你函数已弃用或移动到新的模块下,照着提示改就行。书里配套的d2l库也会随版本的迭代更新,尽量保持与书的最新版本同步,能减少不少麻烦。

关于深度学习中“环境搭建”的热搜其实很多,大家抱怨最多的就是“明明照教程装为什么还报错”。我经历过最典型的一次:在一台Windows机器上装GPU版PyTorch,明明显卡驱动是最新的, torch.cuda.is_available() 返回True,但一训练就报CUDA error。排查后才发现是显卡驱动版本太新,与已安装的CUDA工具包不兼容。这个问题的解决方法是先安装一个与PyTorch官网兼容矩阵匹配的CUDA Toolkit版本,版本对应是很关键的,因为PyTorch是动态链接CUDA的,版本差太远就会出问题。

4.3 训练时常见的几个致命细节

下面这份速查表,是我在反复跑这本书时经常用到的排查思路:

现象 可能原因 排查方向
损失一直不下降 学习率过大或过小 尝试把学习率调低为原值的0.1倍,或调高10倍观察变化
训练集精度很高,测试集很低 过拟合 增加Dropout、数据增强或减小模型容量
GPU显存不足 batch size太大 减小batch size、降低图片分辨率
数据加载特别慢 DataLoader线程设置不足 增大num_workers参数
时刻报缺少某个模块但不缺 虚拟环境混乱 检查当前conda环境是否激活,用 conda list 核对版本

还有一个容易被忽视的点:模型训练中保存和加载模型时,是只保存参数( model.state_dict() )还是保存整个模型,这两者在跨环境、跨版本时的兼容性差别很大。书里教的 torch.save(model.state_dict(), 'model.pth') 是最稳妥的方案,加载时先重新实例化模型结构再 load_state_dict ,这样即使PyTorch升级,模型文件也基本不受影响。我在实际项目里吃过亏,早期图省事直接保存整个模型,换了一台机器加载直接报类定义缺失,后来就老老实实用state_dict方式了。

4.4 搜出来的“热门坑”和我的解法

从网上反馈来看,这本书的读者最常卡住的是第4章Softmax回归及第8章循环神经网络。前者因为涉及交叉熵损失函数和自定义训练循环的细节,很多新手容易在维度变换上出错;循环神经网络则因为隐藏状态传递的写法比较绕,一不留神就把 batch_size 和 seq_len 的维度搞混了。我自己也在这两章花费的时间最多,经验无非是遇到维度报错就打印每一个张量的shape,一行一行对照公式理解。

另一个常见问题是,Python视觉库和深度学习库版本之间互相打架,比如OpenCV、Pillow、Matplotlib之间兼容问题导致图像显示异常。这类问题多数出在conda把某些库的版本自动降级或升级了。我现在的经验是,在学习阶段不要把太多库一股脑装进同一个环境,一个虚拟环境只装当前项目需要的依赖,书里需要的用 pip install d2l 一次装齐,基本不会出大问题。

5. 从PDF到真正“动手学”的进阶路径

5.1 搭配视频课、代码仓库和社区讨论一起看

如果你觉得单看PDF有点干,可以找一找这本书配套的免费视频课。作者在讲课时不是照本宣科,而是边写代码边讲解,遇到报错还会现场debug,这种“真实感”对初学者很有价值。我的建议是:看视频前先自己跑一遍PDF对应章节的代码,然后视频只看你卡住的部分,这样的效率最高,不会被视频节奏拖着走太久。

代码仓库就更有用了。书在GitHub上的仓库包含了所有notebook、图示和练习题的参考答案,你可以克隆到本地跟着跑。遇到某一章代码运行不了,先去仓库的Issue区搜一搜,大概率有人已经提了同样的问题并拿到了解决方案。再配合国内的深度学习社区,知乎、CSDN、公众号文章里都有大量针对这本书的笔记和解读,多看看不同的讲解角度,总能找到适合你理解习惯的那一种。

5.2 把书里的练习“魔改”成自己的项目

我见过太多人认真看完这本书,代码全部跑通了,但合上书还是不知从何开始做自己的项目。问题出在他们一直停留在“照抄”阶段,没有尝试过修改。一个很好的过渡练习是:把书里用Fashion-MNIST数据集的分类任务,换成你自己感兴趣的图片分类任务(比如猫狗分类),保持模型结构不变,只需要替换数据加载和数据预处理部分。这个过程会让你迫于真实数据的“脏乱差”去处理各种问题:图片尺寸大小不一、类别不均衡、数据量不足,这些都是书里不会直接教你的东西。

再进阶一点,可以尝试把书里的单标签分类改成多标签分类,或者把网络的最后一层换成多个输出头。这些改动虽然基础,但可以让你真正理解模型的输入输出是怎么设计的,而不是只会“拿着别人搭好的架子跑数据”。等你完成了一个属于自己的端到端项目——数据获取、数据清洗、模型选择、训练调参、评估报告——再回头看这本PDF,你就会觉得每一页都读懂了七八分。

5.3 这本书没覆盖,但你现在可以主动去学的东西

《动手学深度学习》PyTorch版的覆盖面已经很广,但深度学习领域日新月异,有几个方向是书里着墨不多但实际工作中高频用到的。一是分布式训练,大模型不可能单卡训练,你要至少了解梯度同步、数据并行和模型并行的基本思路;二是模型部署,训练完的模型要落地到移动端或者边缘设备,需要会转成ONNX或用LibTorch做推理;三是一些热门新架构,比如基于Transformer的各种变体、扩散模型。这些都可以在吃透这本书之后再系统学习,深度学习云平台和开源代码库也能给你提供足够多的实战素材。

如果你未来想往算法方向深耕,这本书只是火锅里的锅底,后续还需要按需加菜:读原版论文、复现顶会代码、参加Kaggle比赛。但好消息是,锅底的味道对了,后面加什么菜都容易煮熟。这本PDF带给你的最大价值,是建立了一套“看到模型就知道大概怎么回事、看到代码就能上手调试”的基本功,这个基本功在之后不管是搞科研、做业务还是面试求职,都是实打实的底气。

5.4 以终为始:这本书最终能带给你什么

我在团队里带过不少实习生,观察下来有个规律:凡是认真把《动手学深度学习》PyTorch版跟了一遍的,入职后给个具体任务都能较快上手;凡是只看过论文、没动手敲过代码的,往往在环境配置、数据流水线、debug模型这些环节上卡壳很久,导致产出效率很低。原因很简单,深度学习是工程性很强的学科,理论再漂亮,最终都要在张量运算、梯度计算、显存管理这些细节中落地。

这本书真正的学习成本不只是把代码跑通,而是去理解每一处设计选择的“为什么”:为什么用交叉熵做分类损失?为什么CNN需要权值共享?为什么注意力机制要缩放?这些“为什么”积累起来,你面对一个新模型时就有了“庖丁解牛”的视野,看得见骨架和脉络,而不是只看到密密麻麻的矩阵运算。如果你还在门口徘徊,不妨就从下载这本书的PDF开始,装上PyTorch,把这本“最像实战的教材”一页一页“跑”到底。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

更多推荐