对本书的赞誉
前言
如何使用本书
资源与支持
主要符号表
第1章深度学习简介1
1.1起源2
1.2发展4
1.3成功案例6
1.4特点7
小结8
练习8
第2章预备知识9
2.1获取和运行本书的代码9
2.1.1获取代码并安装运行环境9
2.1.2更新代码和运行环境11
2.1.3使用GPU版的MXNet11
小结12
练习12
2.2数据操作12
2.2.1创建NDArray12
2.2.2运算14
2.2.3广播机制16
2.2.4索引17
2.2.5运算的内存开销17
2.2.6NDArray和NumPy相互变换18
小结19
练习19
2.3自动求梯度19
2.3.1简单例子19
2.3.2训练模式和预测模式20
2.3.3对Python控制流求梯度20
小结21
练习21
2.4查阅文档21
2.4.1查找模块里的所有函数和类21
2.4.2查找特定函数和类的使用22
2.4.3在MXNet网站上查阅23
小结24
练习24
第3章深度学习基础25
3.1线性回归25
3.1.1线性回归的基本要素25
3.1.2线性回归的表示方法28
小结30
练习30
3.2线性回归的从零开始实现30
3.2.1生成数据集30
3.2.2读取数据集32
3.2.3初始化模型参数32
3.2.4定义模型33
3.2.5定义损失函数33
3.2.6定义优化算法33
3.2.7训练模型33
小结34
练习34
3.3线性回归的简洁实现35
3.3.1生成数据集35
3.3.2读取数据集35
3.3.3定义模型36
3.3.4初始化模型参数36
3.3.5定义损失函数37
3.3.6定义优化算法37
3.3.7训练模型37
小结38
练习38
3.4softmax回归38
3.4.1分类问题38
3.4.2softmax回归模型39
3.4.3单样本分类的矢量计算表达式40
3.4.4小批量样本分类的矢量计算表达式40
3.4.5交叉熵损失函数41
3.4.6模型预测及评价42
小结42
练习42
3.5图像分类数据集(Fashion-MNIST)42
3.5.1获取数据集42
3.5.2读取小批量44
小结45
练习45
3.6softmax回归的从零开始实现45
3.6.1读取数据集45
3.6.2初始化模型参数45
3.6.3实现softmax运算46
3.6.4定义模型46
3.6.5定义损失函数47
3.6.6计算分类准确率47
3.6.7训练模型48
3.6.8预测48
小结49
练习49
3.7softmax回归的简洁实现49
3.7.1读取数据集49
3.7.2定义和初始化模型50
3.7.3softmax和交叉熵损失函数50
3.7.4定义优化算法50
3.7.5训练模型50
小结50
练习50
3.8多层感知机51
3.8.1隐藏层51
3.8.2激活函数52
3.8.3多层感知机55
小结55
练习55
3.9多层感知机的从零开始实现56
3.9.1读取数据集56
3.9.2定义模型参数56
3.9.3定义激活函数56
3.9.4定义模型56
3.9.5定义损失函数57
3.9.6训练模型57
小结57
练习57
3.10多层感知机的简洁实现57
3.10.1定义模型58
3.10.2训练模型58
小结58
练习58
3.11模型选择、欠拟合和过拟合58
3.11.1训练误差和泛化误差59
3.11.2模型选择59
3.11.3欠拟合和过拟合60
3.11.4多项式函数拟合实验61
小结65
练习65
3.12权重衰减65
3.12.1方法65
3.12.2高维线性回归实验66
3.12.3从零开始实现66
3.12.4简洁实现68
小结70
练习70
3.13丢弃法70
3.13.1方法70
3.13.2从零开始实现71
3.13.3简洁实现73
小结74
练习74
3.14正向传播、反向传播和计算图74
3.14.1正向传播74
3.14.2正向传播的计算图75
3.14.3反向传播75
3.14.4训练深度学习模型76
小结77
练习77
3.15数值稳定性和模型初始化77
3.15.1衰减和爆炸77
3.15.2随机初始化模型参数78
小结78
练习79
3.16实战Kaggle比赛:房价预测79
3.16.1Kaggle比赛79
3.16.2读取数据集80
3.16.3预处理数据集81
3.16.4训练模型82
3.16.5k折交叉验证82
3.16.6模型选择83
3.16.7预测并在Kaggle提交结果84
小结85
练习85
第4章深度学习计算86
4.1模型构造86
4.1.1继承Block类来构造模型86
4.1.2Sequential类继承自Block类87
4.1.3构造复杂的模型88
小结89
练习90
4.2模型参数的访问、初始化和共享90
4.2.1访问模型参数90
4.2.2初始化模型参数92
4.2.3自定义初始化方法93
4.2.4共享模型参数94
小结94
练习94
4.3模型参数的延后初始化95
4.3.1延后初始化95
4.3.2避免延后初始化96
小结96
练习97
4.4自定义层97
4.4.1不含模型参数的自定义层97
4.4.2含模型参数的自定义层98
小结99
练习99
4.5读取和存储99
4.5.1读写NDArray99
4.5.2读写Gluon模型的参数100
小结101
练习101
4.6GPU计算101
4.6.1计算设备102
4.6.2NDArray的GPU计算102
4.6.3Gluon的GPU计算104
小结105
练习105
第5章卷积神经网络106
5.1二维卷积层106
5.1.1二维互相关运算106
5.1.2二维卷积层107
5.1.3图像中物体边缘检测108
5.1.4通过数据学习核数组109
5.1.5互相关运算和卷积运算109
5.1.6特征图和感受野110
小结110
练习110
5.2填充和步幅111
5.2.1填充111
5.2.2步幅112
小结113
练习113
5.3多输入通道和多输出通道114
5.3.1多输入通道114
5.3.2多输出通道115
5.3.31×1卷积层116
小结117
练习117
5.4池化层117
5.4.1二维最大池化层和平均池化层117
5.4.2填充和步幅119
5.4.3多通道120
小结120
练习121
5.5卷积神经网络(LeNet)121
5.5.1LeNet模型121
5.5.2训练模型122
小结124
练习124
5.6深度卷积神经网络(AlexNet)124
5.6.1学习特征表示125
5.6.2AlexNet126
5.6.3读取数据集127
5.6.4训练模型128
小结128
练习129
5.7使用重复元素的网络(VGG)129
5.7.1VGG块129
5.7.2VGG网络129
5.7.3训练模型130
小结131
练习131
5.8网络中的网络(NiN)131
5.8.1NiN块131
5.8.2NiN模型132
5.8.3训练模型133
小结134
练习134
5.9含并行连结的网络(GoogLeNet)134
5.9.1Inception块134
5.9.2GoogLeNet模型135
5.9.3训练模型137
小结137
练习137
5.10批量归一化138
5.10.1批量归一化层138
5.10.2从零开始实现139
5.10.3使用批量归一化层的LeNet140
5.10.4简洁实现141
小结142
练习142
5.11残差网络(ResNet)143
5.11.1残差块143
5.11.2ResNet模型145
5.11.3训练模型146
小结146
练习146
5.12稠密连接网络(DenseNet)147
5.12.1稠密块147
5.12.2过渡层148
5.12.3DenseNet模型148
5.12.4训练模型149
小结149
练习149
第6章循环神经网络150
6.1语言模型150
6.1.1语言模型的计算151
6.1.2n元语法151
小结152
练习152
6.2循环神经网络152
6.2.1不含隐藏状态的神经网络152
6.2.2含隐藏状态的循环神经网络152
6.2.3应用:基于字符级循环神经网络的语言模型154
小结155
练习155
6.3语言模型数据集(歌词)155
6.3.1读取数据集155
6.3.2建立字符索引156
6.3.3时序数据的采样156
小结158
练习159
6.4循环神经网络的从零开始实现159
6.4.1one-hot向量159
6.4.2初始化模型参数160
6.4.3定义模型160
6.4.4定义预测函数161
6.4.5裁剪梯度161
6.4.6困惑度162
6.4.7定义模型训练函数162
6.4.8训练模型并创作歌词163
小结164
练习164
6.5循环神经网络的简洁实现165
6.5.1定义模型165
6.5.2训练模型166
小结168
练习168
6.6通过时间反向传播168
6.6.1定义模型168
6.6.2模型计算图169
6.6.3方法169
小结170
练习170
6.7门控循环单元(GRU)170
6.7.1门控循环单元171
6.7.2读取数据集173
6.7.3从零开始实现173
6.7.4简洁实现175
小结176
练习176
6.8长短期记忆(LSTM)176
6.8.1长短期记忆176
6.8.2读取数据集179
6.8.3从零开始实现179
6.8.4简洁实现181
小结181
练习182
6.9深度循环神经网络182
小结183
练习183
6.10双向循环神经网络183
小结184
练习184
第7章优化算法185
7.1优化与深度学习185
7.1.1优化与深度学习的关系185
7.1.2优化在深度学习中的挑战186
小结188
练习189
7.2梯度下降和随机梯度下降189
7.2.1一维梯度下降189
7.2.2学习率190
7.2.3多维梯度下降191
7.2.4随机梯度下降193
小结194
练习194
7.3小批量随机梯度下降194
7.3.1读取数据集195
7.3.2从零开始实现196
7.3.3简洁实现198
小结199
练习199
7.4动量法200
7.4.1梯度下降的问题200
7.4.2动量法201
·6·目录
7.4.3从零开始实现203
7.4.4简洁实现205
小结205
练习205
7.5AdaGrad算法206
7.5.1算法206
7.5.2特点206
7.5.3从零开始实现208
7.5.4简洁实现209
小结209
练习209
7.6RMSProp算法209
7.6.1算法210
7.6.2从零开始实现211
7.6.3简洁实现212
小结212
练习212
7.7AdaDelta算法212
7.7.1算法212
7.7.2从零开始实现213
7.7.3简洁实现214
小结214
练习214
7.8Adam算法215
7.8.1算法215
7.8.2从零开始实现216
7.8.3简洁实现216
小结217
练习217
第8章计算性能218
8.1命令式和符号式混合编程218
8.1.1混合式编程取两者之长220
8.1.2使用HybridSequential类构造模型220
8.1.3使用HybridBlock类构造模型222
小结224
练习224
8.2异步计算224
8.2.1MXNet中的异步计算224
8.2.2用同步函数让前端等待计算结果226
8.2.3使用异步计算提升计算性能226
8.2.4异步计算对内存的影响227
小结229
练习229
8.3自动并行计算229
8.3.1CPU和GPU的并行计算230
8.3.2计算和通信的并行计算231
小结231
练习231
8.4多GPU计算232
8.4.1数据并行232
8.4.2定义模型233
8.4.3多GPU之间同步数据234
8.4.4单个小批量上的多GPU训练236
8.4.5定义训练函数236
8.4.6多GPU训练实验237
小结237
练习237
8.5多GPU计算的简洁实现237
8.5.1多GPU上初始化模型参数238
8.5.2多GPU训练模型239
小结241
练习241
第9章计算机视觉242
9.1图像增广242
小结250
练习250
9.2微调250
热狗识别251
小结255
练习255
9.3目标检测和边界框255
边界框256
小结257
练习257
9.4锚框257
小结265
练习265
9.5多尺度目标检测265
小结268
练习268
9.6目标检测数据集(皮卡丘)268
小结270
练习271
9.7单发多框检测(SSD)271
小结278
练习278
9.8区域卷积神经网络(R-CNN)系列280
小结285
练习285
9.9语义分割和数据集285
小结290
练习290
9.10全卷积网络(FCN)290
小结297
练习297
9.11样式迁移298
小结306
练习306
9.12实战Kaggle比赛:图像分类(CIFAR-10)306
提交结果313
小结313
练习313
9.13实战Kaggle比赛:狗的品种识别(ImageNetDogs)314
小结320
练习320
第10章自然语言处理321
10.1词嵌入(word2vec)321
小结325
练习325
10.2近似训练325
小结327
练习328
10.3word2vec的实现328
小结336
练习336
10.4子词嵌入(fastText)336
小结337
练习337
10.5全局向量的词嵌入(GloVe)337
小结340
练习340
10.6求近义词和类比词340
小结343
练习343
10.7文本情感分类:使用循环神经网络343
小结347
练习347
10.8文本情感分类:使用卷积神经网络(textCNN)347
小结353
练习353
10.9编码器-解码器(seq2seq)353
小结355
练习355
10.10束搜索355
小结358
练习358
10.11注意力机制358
小结361
练习361
10.12机器翻译361
小结369
练习369
附录A数学基础370
附录B使用Jupyter记事本376
附录C使用AWS运行代码381
附录DGPU购买指南388
附录E如何为本书做贡献391
附录Fd2lzh包索引395
附录G中英文术语对照表397
参考文献402
索引407
这是一本及时且引人入胜的书。它不仅提供了深度学习原理的全面概述,还提供了具有编程代码的详细算法,此外,还提供了计算机视觉和自然语言处理中有关深度学习的全新介绍。如果你想钻研深度学习,请研读这本书!
——韩家炜,ACM 院士、IEEE 院士、美国伊利诺伊大学香槟分校计算机系 Abel Bliss 教授
这是对机器学习文献的一个很受欢迎的补充,重点是通过集成Jupyter 记事本实现的动手经验。深度学习的学生应该能体会到,这对于熟练掌握这一领域是非常宝贵的。
——Bernhard Sch.lkopf,ACM 院士、德国国家科学院院士、德国马克斯.普朗克研究所智能系统院院长
这本书基于MXNet 框架来介绍深度学习技术,书中代码可谓“所学即所用”,为喜欢通过Python代码进行学习的读者了解、接触深度学习技术提供了很大的便利。
——周志华,ACM 院士、IEEE 院士、AAAS 院士、南京大学计算机科学与技术系主任
这是一本基于Apache MXNet的深度学习实战书籍,可以帮助读者快速上手并掌握使用深度学习工具的基本技能。本书的几个作者都在机器学习领域有着非常丰富的经验。他们不光有大量的工业界实践经验,也有非常高的学术成就,所以对机器学习领域的前沿算法理解深刻。这使得作者们在提供优质代码的同时,也可以把前沿的算法和概念深入浅出地介绍给读者。这本书可以帮助深度学习实践者快速提升自己的能力。
——张潼,香港科技大学计算机科学与数学教授
来自工业界
虽然业界已经有不错的深度学习方面的书籍,但都不够紧密结合工业界的应用实践。 我认为《动手学深度学习》适合工业界研发工程师学习的,因为这本书把算法理论、应用场景、代码实例都完美地联系在一起,引导读者把理论学习和应用实践紧密结合,知行合一,在动手中学习,在体会和领会中不断深化对深度学习的理解。 因此我毫无保留地向广大的读者强烈推荐《动手学深度学习》。
——余凯,地平线公司创始人、首席执行官
强烈推荐这本书!它其实远不只是一本书:它不仅讲解深度学习背后的数学原理,更是一个编程工作台与记事本,让读者可以一边动手学习一边收到反馈,它还是个开源社区平台,让大家可以交流。作为在AI学术界和工业界都长期工作过的人,我特别赞赏这种手脑一体的学习方式,既能增强实践能力,又可以在解决问题中锻炼独立思考和批判性思维。
作者们是算法工程兼强的业界翘楚,他们能奉献出这样的一本好的开源书,为他们点赞!
——漆远,蚂蚁金服副总裁、首席人工智能科学家
一年前作者开始在将门技术社群中做深度学习的系列讲座,当时我就对动手式讲座的内容和形式感到耳目一新。一年过去,看到《动手学深度学习》在持续精心打磨后终于成书出版,感觉十分欣喜!
深度学习是当前人工智能领域里炙手可热的领域,吸引了大量感兴趣的开发者踊跃学习相关的开发技术。然而对大多数学习者而言,掌握深度学习是一件很不容易的事情,需要相继翻越数学基础、算法理论、编程开发、领域应用、软硬优化等几座大山。因此学习过程不容易一帆风顺,我也看到很多学习者还没进入开发环节就在理论学习的过程中抱憾放弃了。然而《动手学深度学习》却是一本很容易让学习者上瘾的书,它的特色是强调在动手编程中学习理论和培养实战能力。阅读本书愉悦的感受是它很好地平衡了理论介绍和编程实操,内容简明扼要,衔接自然流畅,既反映了现代深度学习的进展,又兼具易学和实用特性,是深度学习爱好者难得的学习材料。特别值得称赞的是本书选择了Jupyter记事本作为开发学习环境,将教材、文档和代码统一起来,给读者提供了可以立即尝试修改代码和观察运行效果的交互式的学习体验,使学习充满了乐趣。
在过去的一年中,作者和社区成员对《动手学深度学习》进行了大量优化修改才得以成书,可以说这是一本深度学习前沿实践者给深度学习爱好者带来的诚心之作,相信大家都能在阅读和实践中拥有一样的共鸣。
——沈强,将门创投创始合伙人