動手學深度學習 <动手学深度学习>
動手學深度學習 <动手学深度学习>
資料來源: https://zh.d2l.ai/
https://zh-v2.d2l.ai/
https://github.com/d2l-ai/d2l-zh
GITHUB: https://github.com/jash-git/Jash-good-idea-20210218-001/tree/master/%E5%8B%95%E6%89%8B%E5%AD%B8%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92
如何使⽤本书7
1 深度学习简介13
1.1 起源. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.2 发展. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.3 成功案例. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.4 特点. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2 预备知识25
2.1 获取和运⾏本书的代码. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.1.1 获取代码并安装运⾏环境. . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.1.2 更新代码和运⾏环境. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.1.3 使⽤GPU版的MXNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.2 数据操作. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2.1 创建NDArray . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2.2 运算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.2.3 ⼴播机制. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.2.4 索引. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.2.5 运算的内存开销. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.4.5 交叉熵损失函数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3.4.6 模型预测及评价. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.5 图像分类数据集(Fashion-MNIST) . . . . . . . . . . . . . . . . . . . . . . . . 66
3.5.1 获取数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
3.5.2 读取小批量. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
3.6 softmax回归的从零开始实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.6.1 读取数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.6.2 初始化模型参数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.6.3 实现softmax运算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.6.4 定义模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.6.5 定义损失函数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
3.6.6 计算分类准确率. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
3.6.7 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.6.8 预测. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.7 softmax回归的简洁实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
3.7.1 获取和读取数据. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
3.7.2 定义和初始化模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.7.3 softmax和交叉熵损失函数. . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.7.4 定义优化算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.7.5 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.8 多层感知机. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
3.8.1 隐藏层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
3.8.2 激活函数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.8.3 多层感知机. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
3.9 多层感知机的从零开始实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.9.1 读取数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.9.2 定义模型参数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.9.3 定义激活函数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.9.4 定义模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
3.9.5 定义损失函数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
3.9.6 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
3.10 多层感知机的简洁实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
3.10.1 定义模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
3.10.2 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
3.11 模型选择、⽋拟合和过拟合. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
3.11.1 训练误差和泛化误差. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
3.11.2 模型选择. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
3.11.3 ⽋拟合和过拟合. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
3.11.4 多项式函数拟合实验. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
3.12 权重衰减. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
3.12.1 ⽅法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
3.12.2 ⾼维线性回归实验. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
3.12.3 从零开始实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
3.12.4 简洁实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
3.13 丢弃法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
3.13.1 ⽅法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
3.13.2 从零开始实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
3.13.3 简洁实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
3.14 正向传播、反向传播和计算图. . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
3.14.1 正向传播. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
3.14.2 正向传播的计算图. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
3.14.3 反向传播. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
3.14.4 训练深度学习模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
3.15 数值稳定性和模型初始化. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
3.15.1 衰减和爆炸. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
3.15.2 随机初始化模型参数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
3.16 实战Kaggle⽐赛:房价预测. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
3.16.1 Kaggle⽐赛. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
3.16.2 读取数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
3.16.3 预处理数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
3.16.4 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
3.16.5 k折交叉验证. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
3.16.6 模型选择. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
3.16.7 预测并在Kaggle提交结果. . . . . . . . . . . . . . . . . . . . . . . . . . 121
4 深度学习计算125
4.1 模型构造. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
4.1.1 继承Block类来构造模型. . . . . . . . . . . . . . . . . . . . . . . . . . 126
4.1.2 Sequential类继承⾃Block类. . . . . . . . . . . . . . . . . . . . . . 127
4.1.3 构造复杂的模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
4.2 模型参数的访问、初始化和共享. . . . . . . . . . . . . . . . . . . . . . . . . . . 130
4.2.1 访问模型参数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
4.2.2 初始化模型参数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
4.2.3 ⾃定义初始化⽅法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
4.2.4 共享模型参数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
4.3 模型参数的延后初始化. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
4.3.1 延后初始化. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
4.3.2 避免延后初始化. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
4.4 ⾃定义层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
4.4.1 不含模型参数的⾃定义层. . . . . . . . . . . . . . . . . . . . . . . . . . 138
4.4.2 含模型参数的⾃定义层. . . . . . . . . . . . . . . . . . . . . . . . . . . 139
4.5 读取和存储. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
4.5.1 读写NDArray . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
4.5.2 读写Gluon模型的参数. . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
4.6 GPU计算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
4.6.1 计算设备. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
4.6.2 NDArray的GPU计算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
4.6.3 Gluon的GPU计算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
5 卷积神经⽹络149
5.1 ⼆维卷积层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
5.1.1 ⼆维互相关运算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
5.1.2 ⼆维卷积层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
5.1.3 图像中物体边缘检测. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
5.1.4 通过数据学习核数组. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
5.1.5 互相关运算和卷积运算. . . . . . . . . . . . . . . . . . . . . . . . . . . 153
5.1.6 特征图和感受野. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
5.2 填充和步幅. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
5.2.1 填充. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
5.2.2 步幅. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
5.3 多输⼊通道和多输出通道. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
5.3.1 多输⼊通道. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
5.3.2 多输出通道. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
5.3.3 1 _ 1卷积层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
5.4 池化层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
5.4.1 ⼆维最⼤池化层和平均池化层. . . . . . . . . . . . . . . . . . . . . . . . 164
5.4.2 填充和步幅. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
5.4.3 多通道. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
5.5 卷积神经⽹络(LeNet) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
5.5.1 LeNet模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
5.5.2 获取数据和训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
5.6 深度卷积神经⽹络(AlexNet) . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
5.6.1 学习特征表⽰. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
5.6.2 AlexNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
5.6.3 读取数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
5.6.4 训练. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
5.7 使⽤重复元素的⽹络(VGG) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
5.7.1 VGG块. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
5.7.2 VGG⽹络. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
5.7.3 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
5.8 ⽹络中的⽹络(NiN) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
5.8.1 NiN块. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
5.8.2 NiN模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
5.8.3 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
5.9 含并⾏连结的⽹络(GoogLeNet) . . . . . . . . . . . . . . . . . . . . . . . . . . 185
5.9.1 Inception 块. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
5.9.2 GoogLeNet模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
5.9.3 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
5.10 批量归⼀化. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
5.10.1 批量归⼀化层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
5.10.2 从零开始实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
5.10.3 简洁实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
5.11 残差⽹络(ResNet) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
5.11.1 残差块. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
5.11.2 ResNet模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
5.11.3 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
5.12 稠密连接⽹络(DenseNet) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
5.12.1 稠密块. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
5.12.2 过渡层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
5.12.3 DenseNet模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
5.12.4 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
6 循环神经⽹络207
6.1 语⾔模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
6.1.1 语⾔模型的计算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
6.1.2 n元语法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
6.2 循环神经⽹络. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
6.2.1 不含隐藏状态的神经⽹络. . . . . . . . . . . . . . . . . . . . . . . . . . 210
6.2.2 含隐藏状态的循环神经⽹络. . . . . . . . . . . . . . . . . . . . . . . . . 211
6.2.3 应⽤:基于字符级循环神经⽹络的语⾔模型. . . . . . . . . . . . . . . . 213
6.3 语⾔模型数据集(歌词) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
6.3.1 读取数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
6.3.2 建⽴字符索引. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
6.3.3 时序数据的采样. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
6.4 循环神经⽹络的从零开始实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
6.4.1 one-hot向量. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
6.4.2 初始化模型参数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
6.4.3 定义模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
6.4.4 定义预测函数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
6.4.5 裁剪梯度. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
6.4.6 困惑度. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
6.4.7 定义模型训练函数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
6.4.8 训练模型并创作歌词. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
6.5 循环神经⽹络的简洁实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
6.5.1 定义模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
6.5.2 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
6.6 通过时间反向传播. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
6.6.1 定义模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
6.6.2 模型计算图. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
6.6.3 ⽅法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
6.7 ⻔控循环单元(GRU) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
6.7.1 ⻔控循环单元. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
6.7.2 读取数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
6.7.3 从零开始实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
6.7.4 简洁实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
6.8 ⻓短期记忆(LSTM) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
6.8.1 ⻓短期记忆. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
6.8.2 读取数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
6.8.3 从零开始实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
6.8.4 定义模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
6.8.5 简洁实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
6.9 深度循环神经⽹络. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
6.10 双向循环神经⽹络. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
7 优化算法253
7.1 优化与深度学习. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
7.1.1 优化与深度学习的关系. . . . . . . . . . . . . . . . . . . . . . . . . . . 254
7.1.2 优化在深度学习中的挑战. . . . . . . . . . . . . . . . . . . . . . . . . . 254
7.2 梯度下降和随机梯度下降. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
7.2.1 ⼀维梯度下降. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
7.2.2 学习率. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
7.2.3 多维梯度下降. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
7.2.4 随机梯度下降. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
7.3 小批量随机梯度下降. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
7.3.1 读取数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
7.3.2 从零开始实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
7.3.3 简洁实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
7.4 动量法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
7.4.1 梯度下降的问题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
7.4.2 动量法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
7.4.3 从零开始实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
7.4.4 简洁实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
7.5 AdaGrad算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
7.5.1 算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
7.5.2 特点. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
7.5.3 从零开始实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
7.5.4 简洁实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
7.6 RMSProp算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
7.6.1 算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
7.6.2 从零开始实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
7.6.3 简洁实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
7.7 AdaDelta算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
7.7.1 算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
7.7.2 从零开始实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
7.7.3 简洁实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
7.8 Adam算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
7.8.1 算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
7.8.2 从零开始实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
7.8.3 简洁实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
8 计算性能297
8.1 命令式和符号式混合编程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
8.1.1 混合式编程取两者之⻓. . . . . . . . . . . . . . . . . . . . . . . . . . . 299
8.1.2 使⽤HybridSequential类构造模型. . . . . . . . . . . . . . . . . . . 300
8.1.3 使⽤HybridBlock类构造模型. . . . . . . . . . . . . . . . . . . . . . . 302
8.2 异步计算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
8.2.1 MXNet中的异步计算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
8.2.2 ⽤同步函数让前端等待计算结果. . . . . . . . . . . . . . . . . . . . . . 306
8.2.3 使⽤异步计算提升计算性能. . . . . . . . . . . . . . . . . . . . . . . . . 307
8.2.4 异步计算对内存的影响. . . . . . . . . . . . . . . . . . . . . . . . . . . 308
8.3 ⾃动并⾏计算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
8.3.1 CPU和GPU的并⾏计算. . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
8.3.2 计算和通信的并⾏计算. . . . . . . . . . . . . . . . . . . . . . . . . . . 312
8.4 多GPU计算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
8.4.1 数据并⾏. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
8.4.2 定义模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
8.4.3 多GPU之间同步数据. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
8.4.4 单个小批量上的多GPU训练. . . . . . . . . . . . . . . . . . . . . . . . . 319
8.4.5 定义训练函数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
8.4.6 多GPU训练实验. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
8.5 多GPU计算的简洁实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
8.5.1 多GPU上初始化模型参数. . . . . . . . . . . . . . . . . . . . . . . . . . 321
8.5.2 多GPU训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
9 计算机视觉327
9.1 图像增⼴. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
9.1.1 常⽤的图像增⼴⽅法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
9.1.2 使⽤图像增⼴训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . 333
9.2 微调. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
9.2.1 热狗识别. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
9.3 ⽬标检测和边界框. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
9.3.1 边界框. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
9.4 锚框. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
9.4.1 ⽣成多个锚框. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
9.4.2 交并⽐. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
9.4.3 标注训练集的锚框. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
9.4.4 输出预测边界框. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
9.5 多尺度⽬标检测. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
9.6 ⽬标检测数据集(⽪卡丘) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
9.6.1 获取数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
9.6.2 读取数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
9.6.3 图⽰数据. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
9.7 单发多框检测(SSD) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
9.7.1 定义模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
9.7.2 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
9.7.3 预测⽬标. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
9.8 区域卷积神经⽹络(R-CNN)系列. . . . . . . . . . . . . . . . . . . . . . . . . . 376
9.8.1 R-CNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
9.8.2 Fast R-CNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
9.8.3 Faster R-CNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
9.8.4 Mask R-CNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
9.9 语义分割和数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
9.9.1 图像分割和实例分割. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
9.9.2 Pascal VOC2012语义分割数据集. . . . . . . . . . . . . . . . . . . . . . 384
9.10 全卷积⽹络(FCN) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
9.10.1 转置卷积层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
9.10.2 构造模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
9.10.3 初始化转置卷积层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
9.10.4 读取数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
9.10.5 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
9.10.6 预测像素类别. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
9.11 样式迁移. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
9.11.1 ⽅法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
9.11.2 读取内容图像和样式图像. . . . . . . . . . . . . . . . . . . . . . . . . . 401
9.11.3 预处理和后处理图像. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
9.11.4 抽取特征. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
9.11.5 定义损失函数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
9.11.6 创建和初始化合成图像. . . . . . . . . . . . . . . . . . . . . . . . . . . 406
9.11.7 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
9.12 实战Kaggle⽐赛:图像分类(CIFAR-10) . . . . . . . . . . . . . . . . . . . . . . 410
9.12.1 获取和整理数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
9.12.2 图像增⼴. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
9.12.3 读取数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
9.12.4 定义模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
9.12.5 定义训练函数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
9.12.6 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
9.12.7 对测试集分类并在Kaggle提交结果. . . . . . . . . . . . . . . . . . . . . 418
9.13 实战Kaggle⽐赛:狗的品种识别(ImageNet Dogs) . . . . . . . . . . . . . . . . 419
9.13.1 获取和整理数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
9.13.2 图像增⼴. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
9.13.3 读取数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
9.13.4 定义模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
9.13.5 定义训练函数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
9.13.6 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
9.13.7 对测试集分类并在Kaggle提交结果. . . . . . . . . . . . . . . . . . . . . 426
10 ⾃然语⾔处理429
10.1 词嵌⼊(word2vec) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
10.1.1 为何不采⽤one-hot向量. . . . . . . . . . . . . . . . . . . . . . . . . . . 430
10.1.2 跳字模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
10.1.3 连续词袋模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
10.2 近似训练. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
10.2.1 负采样. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
10.2.2 层序softmax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
10.3 word2vec的实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
10.3.1 预处理数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
10.3.2 负采样. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
10.3.3 读取数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
10.3.4 跳字模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
10.3.5 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
10.3.6 应⽤词嵌⼊模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
10.4 ⼦词嵌⼊(fastText) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
10.5 全局向量的词嵌⼊(GloVe) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
10.5.1 GloVe模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
10.5.2 从条件概率⽐值理解GloVe模型. . . . . . . . . . . . . . . . . . . . . . . 452
10.6 求近义词和类⽐词. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
10.6.1 使⽤预训练的词向量. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
10.6.2 应⽤预训练词向量. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
10.7 ⽂本情感分类:使⽤循环神经⽹络. . . . . . . . . . . . . . . . . . . . . . . . . . 458
10.7.1 ⽂本情感分类数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
10.7.2 使⽤循环神经⽹络的模型. . . . . . . . . . . . . . . . . . . . . . . . . . 461
10.8 ⽂本情感分类:使⽤卷积神经⽹络(textCNN) . . . . . . . . . . . . . . . . . . 464
10.8.1 ⼀维卷积层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
10.8.2 时序最⼤池化层. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
10.8.3 读取和预处理IMDb数据集. . . . . . . . . . . . . . . . . . . . . . . . . . 467
10.8.4 textCNN模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
10.9 编码器—解码器(seq2seq) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
10.9.1 编码器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
10.9.2 解码器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
10.9.3 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
10.10 束搜索. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
10.10.1 贪婪搜索. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
10.10.2 穷举搜索. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
10.10.3 束搜索. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
10.11 注意⼒机制. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
10.11.1 计算背景变量. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
10.11.2 更新隐藏状态. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
10.11.3 发展. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
10.12 机器翻译. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
10.12.1 读取和预处理数据集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
10.12.2 含注意⼒机制的编码器—解码器. . . . . . . . . . . . . . . . . . . . . . . 484
10.12.3 训练模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
10.12.4 预测不定⻓的序列. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
10.12.5 评价翻译结果. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
11 附录493
11.1 主要符号⼀览. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
11.1.1 数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
11.1.2 集合. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
11.1.3 操作符. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
11.1.4 函数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
11.1.5 导数和梯度. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
11.1.6 概率和统计. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
11.1.7 复杂度. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
11.2 数学基础. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
11.2.1 线性代数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
11.2.2 微分. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
11.2.3 概率. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
11.3 使⽤Jupyter记事本. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
11.3.1 在本地编辑和运⾏本书的代码. . . . . . . . . . . . . . . . . . . . . . . . 503
11.3.2 ⾼级选项. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
11.4 使⽤AWS运⾏代码. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
11.4.1 申请账号并登陆. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
11.4.2 创建并运⾏EC2实例. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
11.4.3 安装CUDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
11.4.4 获取本书的代码并安装GPU版的MXNet . . . . . . . . . . . . . . . . . . . 517
11.4.5 运⾏Jupyter记事本. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
11.4.6 关闭不使⽤的实例. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
11.5 GPU购买指南. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
11.5.1 选择GPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
11.5.2 整机配置. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
11.6 如何为本书贡献. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
11.7 d2lzh包索引. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
———–
如何使⽤本書7
1 深度學習簡介13
1.1 起源. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.2 發展. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.3 成功案例. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.4 特點. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2 預備知識25
2.1 獲取和運⾏本書的代碼. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.1.1 獲取代碼並安裝運⾏環境. . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.1.2 更新代碼和運⾏環境. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.1.3 使⽤GPU版的MXNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.2 資料操作. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2.1 創建NDArray . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2.2 運算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.2.3 ⼴播機制. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.2.4 索引. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.2.5 運算的記憶體開銷. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.4.5 交叉熵損失函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3.4.6 模型預測及評價. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.5 圖像分類資料集(Fashion-MNIST) . . . . . . . . . . . . . . . . . . . . . . . . 66
3.5.1 獲取資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
3.5.2 讀取小批量. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
3.6 softmax回歸的從零開始實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.6.1 讀取資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.6.2 初始化模型參數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.6.3 實現softmax運算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.6.4 定義模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.6.5 定義損失函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
3.6.6 計算分類準確率. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
3.6.7 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.6.8 預測. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.7 softmax回歸的簡潔實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
3.7.1 獲取和讀取資料. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
3.7.2 定義和初始化模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.7.3 softmax和交叉熵損失函數. . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.7.4 定義優化演算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.7.5 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.8 多層感知機. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
3.8.1 隱藏層. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
3.8.2 啟動函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.8.3 多層感知機. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
3.9 多層感知機的從零開始實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.9.1 讀取資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.9.2 定義模型參數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.9.3 定義啟動函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.9.4 定義模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
3.9.5 定義損失函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
3.9.6 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
3.10 多層感知機的簡潔實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
3.10.1 定義模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
3.10.2 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
3.11 模型選擇、⽋擬合和過擬合. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
3.11.1 訓練誤差和泛化誤差. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
3.11.2 模型選擇. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
3.11.3 ⽋擬合和過擬合. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
3.11.4 多項式函數擬合實驗. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
3.12 權重衰減. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
3.12.1 ⽅法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
3.12.2 ⾼維線性回歸實驗. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
3.12.3 從零開始實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
3.12.4 簡潔實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
3.13 丟棄法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
3.13.1 ⽅法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
3.13.2 從零開始實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
3.13.3 簡潔實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
3.14 正向傳播、反向傳播和計算圖. . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
3.14.1 正向傳播. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
3.14.2 正向傳播的計算圖. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
3.14.3 反向傳播. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
3.14.4 訓練深度學習模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
3.15 數值穩定性和模型初始化. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
3.15.1 衰減和爆炸. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
3.15.2 隨機初始化模型參數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
3.16 實戰Kaggle⽐賽:房價預測. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
3.16.1 Kaggle⽐賽. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
3.16.2 讀取資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
3.16.3 預處理資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
3.16.4 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
3.16.5 k折交叉驗證. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
3.16.6 模型選擇. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
3.16.7 預測並在Kaggle提交結果. . . . . . . . . . . . . . . . . . . . . . . . . . 121
4 深度學習計算125
4.1 模型構造. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
4.1.1 繼承Block類來構造模型. . . . . . . . . . . . . . . . . . . . . . . . . . 126
4.1.2 Sequential類繼承⾃Block類. . . . . . . . . . . . . . . . . . . . . . 127
4.1.3 構造複雜的模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
4.2 模型參數的訪問、初始化和共用. . . . . . . . . . . . . . . . . . . . . . . . . . . 130
4.2.1 訪問模型參數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
4.2.2 初始化模型參數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
4.2.3 ⾃定義初始化⽅法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
4.2.4 共用模型參數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
4.3 模型參數的延後初始化. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
4.3.1 延後初始化. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
4.3.2 避免延後初始化. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
4.4 ⾃定義層. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
4.4.1 不含模型參數的⾃定義層. . . . . . . . . . . . . . . . . . . . . . . . . . 138
4.4.2 含模型參數的⾃定義層. . . . . . . . . . . . . . . . . . . . . . . . . . . 139
4.5 讀取和存儲. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
4.5.1 讀寫NDArray . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
4.5.2 讀寫Gluon模型的參數. . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
4.6 GPU計算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
4.6.1 計算設備. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
4.6.2 NDArray的GPU計算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
4.6.3 Gluon的GPU計算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
5 卷積神經⽹絡149
5.1 ⼆維卷積層. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
5.1.1 ⼆維互相關運算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
5.1.2 ⼆維卷積層. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
5.1.3 圖像中物體邊緣檢測. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
5.1.4 通過資料學習核陣列. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
5.1.5 互相關運算和卷積運算. . . . . . . . . . . . . . . . . . . . . . . . . . . 153
5.1.6 特徵圖和感受野. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
5.2 填充和步幅. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
5.2.1 填充. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
5.2.2 步幅. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
5.3 多輸⼊通道和多輸出通道. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
5.3.1 多輸⼊通道. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
5.3.2 多輸出通道. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
5.3.3 1 _ 1卷積層. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
5.4 池化層. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
5.4.1 ⼆維最⼤池化層和平均池化層. . . . . . . . . . . . . . . . . . . . . . . . 164
5.4.2 填充和步幅. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
5.4.3 多通道. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
5.5 卷積神經⽹絡(LeNet) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
5.5.1 LeNet模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
5.5.2 獲取資料和訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
5.6 深度卷積神經⽹絡(AlexNet) . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
5.6.1 學習特徵表⽰. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
5.6.2 AlexNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
5.6.3 讀取資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
5.6.4 訓練. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
5.7 使⽤重複元素的⽹絡(VGG) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
5.7.1 VGG塊. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
5.7.2 VGG⽹絡. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
5.7.3 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
5.8 ⽹絡中的⽹絡(NiN) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
5.8.1 NiN塊. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
5.8.2 NiN模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
5.8.3 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
5.9 含並⾏連結的⽹絡(GoogLeNet) . . . . . . . . . . . . . . . . . . . . . . . . . . 185
5.9.1 Inception 塊. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
5.9.2 GoogLeNet模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
5.9.3 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
5.10 批量歸⼀化. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
5.10.1 批量歸⼀化層. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
5.10.2 從零開始實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
5.10.3 簡潔實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
5.11 殘差⽹絡(ResNet) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
5.11.1 殘差塊. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
5.11.2 ResNet模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
5.11.3 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
5.12 稠密連接⽹絡(DenseNet) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
5.12.1 稠密塊. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
5.12.2 過渡層. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
5.12.3 DenseNet模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
5.12.4 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
6 迴圈神經⽹絡207
6.1 語⾔模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
6.1.1 語⾔模型的計算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
6.1.2 n元語法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
6.2 迴圈神經⽹絡. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
6.2.1 不含隱藏狀態的神經⽹絡. . . . . . . . . . . . . . . . . . . . . . . . . . 210
6.2.2 含隱藏狀態的迴圈神經⽹絡. . . . . . . . . . . . . . . . . . . . . . . . . 211
6.2.3 應⽤:基於字元級迴圈神經⽹絡的語⾔模型. . . . . . . . . . . . . . . . 213
6.3 語⾔模型資料集(歌詞) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
6.3.1 讀取資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
6.3.2 建⽴字元索引. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
6.3.3 時序資料的採樣. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
6.4 迴圈神經⽹絡的從零開始實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
6.4.1 one-hot向量. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
6.4.2 初始化模型參數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
6.4.3 定義模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
6.4.4 定義預測函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
6.4.5 裁剪梯度. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
6.4.6 困惑度. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
6.4.7 定義模型訓練函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
6.4.8 訓練模型並創作歌詞. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
6.5 迴圈神經⽹絡的簡潔實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
6.5.1 定義模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
6.5.2 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
6.6 通過時間反向傳播. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
6.6.1 定義模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
6.6.2 模型計算圖. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
6.6.3 ⽅法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
6.7 ⻔控迴圈單元(GRU) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
6.7.1 ⻔控迴圈單元. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
6.7.2 讀取資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
6.7.3 從零開始實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
6.7.4 簡潔實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
6.8 ⻓短期記憶(LSTM) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
6.8.1 ⻓短期記憶. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
6.8.2 讀取資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
6.8.3 從零開始實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
6.8.4 定義模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
6.8.5 簡潔實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
6.9 深度迴圈神經⽹絡. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
6.10 雙向迴圈神經⽹絡. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
7 優化演算法253
7.1 優化與深度學習. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
7.1.1 優化與深度學習的關係. . . . . . . . . . . . . . . . . . . . . . . . . . . 254
7.1.2 優化在深度學習中的挑戰. . . . . . . . . . . . . . . . . . . . . . . . . . 254
7.2 梯度下降和隨機梯度下降. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
7.2.1 ⼀維梯度下降. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
7.2.2 學習率. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
7.2.3 多維梯度下降. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
7.2.4 隨機梯度下降. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
7.3 小批量隨機梯度下降. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
7.3.1 讀取資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
7.3.2 從零開始實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
7.3.3 簡潔實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
7.4 動量法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
7.4.1 梯度下降的問題. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
7.4.2 動量法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
7.4.3 從零開始實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
7.4.4 簡潔實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
7.5 AdaGrad演算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
7.5.1 演算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
7.5.2 特點. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
7.5.3 從零開始實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
7.5.4 簡潔實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
7.6 RMSProp演算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
7.6.1 演算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
7.6.2 從零開始實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
7.6.3 簡潔實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
7.7 AdaDelta演算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
7.7.1 演算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
7.7.2 從零開始實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
7.7.3 簡潔實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
7.8 Adam演算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
7.8.1 演算法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
7.8.2 從零開始實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
7.8.3 簡潔實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
8 計算性能297
8.1 命令式和符號式混合程式設計. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
8.1.1 混合式程式設計取兩者之⻓. . . . . . . . . . . . . . . . . . . . . . . . . . . 299
8.1.2 使⽤HybridSequential類構造模型. . . . . . . . . . . . . . . . . . . 300
8.1.3 使⽤HybridBlock類構造模型. . . . . . . . . . . . . . . . . . . . . . . 302
8.2 非同步計算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
8.2.1 MXNet中的非同步計算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
8.2.2 ⽤同步函數讓前端等待計算結果. . . . . . . . . . . . . . . . . . . . . . 306
8.2.3 使⽤非同步計算提升計算性能. . . . . . . . . . . . . . . . . . . . . . . . . 307
8.2.4 非同步計算對記憶體的影響. . . . . . . . . . . . . . . . . . . . . . . . . . . 308
8.3 ⾃動並⾏計算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
8.3.1 CPU和GPU的並⾏計算. . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
8.3.2 計算和通信的並⾏計算. . . . . . . . . . . . . . . . . . . . . . . . . . . 312
8.4 多GPU計算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
8.4.1 數據並⾏. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
8.4.2 定義模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
8.4.3 多GPU之間同步資料. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
8.4.4 單個小批量上的多GPU訓練. . . . . . . . . . . . . . . . . . . . . . . . . 319
8.4.5 定義訓練函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
8.4.6 多GPU訓練實驗. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
8.5 多GPU計算的簡潔實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
8.5.1 多GPU上初始化模型參數. . . . . . . . . . . . . . . . . . . . . . . . . . 321
8.5.2 多GPU訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
9 電腦視覺327
9.1 圖像增⼴. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
9.1.1 常⽤的圖像增⼴⽅法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
9.1.2 使⽤圖像增⼴訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . 333
9.2 微調. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
9.2.1 熱狗識別. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
9.3 ⽬標檢測和邊界框. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
9.3.1 邊界框. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
9.4 錨框. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
9.4.1 ⽣成多個錨框. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
9.4.2 交並⽐. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
9.4.3 標注訓練集的錨框. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
9.4.4 輸出預測邊界框. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
9.5 多尺度⽬標檢測. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
9.6 ⽬標檢測資料集(⽪卡丘) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
9.6.1 獲取資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
9.6.2 讀取資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
9.6.3 圖⽰數據. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
9.7 單發多框檢測(SSD) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
9.7.1 定義模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
9.7.2 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
9.7.3 預測⽬標. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
9.8 區域卷積神經⽹絡(R-CNN)系列. . . . . . . . . . . . . . . . . . . . . . . . . . 376
9.8.1 R-CNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
9.8.2 Fast R-CNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
9.8.3 Faster R-CNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
9.8.4 Mask R-CNN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
9.9 語義分割和資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
9.9.1 圖像分割和實例分割. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
9.9.2 Pascal VOC2012語義分割資料集. . . . . . . . . . . . . . . . . . . . . . 384
9.10 全卷積⽹絡(FCN) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
9.10.1 轉置卷積層. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
9.10.2 構造模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
9.10.3 初始化轉置卷積層. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
9.10.4 讀取資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
9.10.5 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
9.10.6 預測圖元類別. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
9.11 樣式遷移. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
9.11.1 ⽅法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
9.11.2 讀取內容圖像和樣式圖像. . . . . . . . . . . . . . . . . . . . . . . . . . 401
9.11.3 預處理和後處理圖像. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
9.11.4 抽取特徵. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
9.11.5 定義損失函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
9.11.6 創建和初始化合成圖像. . . . . . . . . . . . . . . . . . . . . . . . . . . 406
9.11.7 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
9.12 實戰Kaggle⽐賽:圖像分類(CIFAR-10) . . . . . . . . . . . . . . . . . . . . . . 410
9.12.1 獲取和整理資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
9.12.2 圖像增⼴. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
9.12.3 讀取資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
9.12.4 定義模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
9.12.5 定義訓練函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
9.12.6 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
9.12.7 對測試集分類並在Kaggle提交結果. . . . . . . . . . . . . . . . . . . . . 418
9.13 實戰Kaggle⽐賽:狗的品種識別(ImageNet Dogs) . . . . . . . . . . . . . . . . 419
9.13.1 獲取和整理資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
9.13.2 圖像增⼴. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
9.13.3 讀取資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
9.13.4 定義模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
9.13.5 定義訓練函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
9.13.6 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
9.13.7 對測試集分類並在Kaggle提交結果. . . . . . . . . . . . . . . . . . . . . 426
10 ⾃然語⾔處理429
10.1 詞嵌⼊(word2vec) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
10.1.1 為何不采⽤one-hot向量. . . . . . . . . . . . . . . . . . . . . . . . . . . 430
10.1.2 跳字模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
10.1.3 連續詞袋模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
10.2 近似訓練. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
10.2.1 負採樣. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
10.2.2 層序softmax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
10.3 word2vec的實現. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
10.3.1 預處理資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
10.3.2 負採樣. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
10.3.3 讀取資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
10.3.4 跳字模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
10.3.5 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
10.3.6 應⽤詞嵌⼊模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
10.4 ⼦詞嵌⼊(fastText) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
10.5 全域向量的詞嵌⼊(GloVe) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
10.5.1 GloVe模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
10.5.2 從條件概率⽐值理解GloVe模型. . . . . . . . . . . . . . . . . . . . . . . 452
10.6 求近義詞和類⽐詞. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
10.6.1 使⽤預訓練的詞向量. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
10.6.2 應⽤預訓練詞向量. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
10.7 ⽂本情感分類:使⽤迴圈神經⽹絡. . . . . . . . . . . . . . . . . . . . . . . . . . 458
10.7.1 ⽂本情感分類資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
10.7.2 使⽤迴圈神經⽹絡的模型. . . . . . . . . . . . . . . . . . . . . . . . . . 461
10.8 ⽂本情感分類:使⽤卷積神經⽹絡(textCNN) . . . . . . . . . . . . . . . . . . 464
10.8.1 ⼀維卷積層. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
10.8.2 時序最⼤池化層. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
10.8.3 讀取和預處理IMDb資料集. . . . . . . . . . . . . . . . . . . . . . . . . . 467
10.8.4 textCNN模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
10.9 編碼器—解碼器(seq2seq) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
10.9.1 編碼器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
10.9.2 解碼器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
10.9.3 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
10.10 束搜索. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
10.10.1 貪婪搜索. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
10.10.2 窮舉搜索. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
10.10.3 束搜索. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
10.11 注意⼒機制. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
10.11.1 計算背景變數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
10.11.2 更新隱藏狀態. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
10.11.3 發展. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
10.12 機器翻譯. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
10.12.1 讀取和預處理資料集. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
10.12.2 含注意⼒機制的編碼器—解碼器. . . . . . . . . . . . . . . . . . . . . . . 484
10.12.3 訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
10.12.4 預測不定⻓的序列. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
10.12.5 評價翻譯結果. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
11 附錄493
11.1 主要符號⼀覽. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
11.1.1 數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
11.1.2 集合. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
11.1.3 操作符. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
11.1.4 函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
11.1.5 導數和梯度. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
11.1.6 概率和統計. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
11.1.7 複雜度. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
11.2 數學基礎. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
11.2.1 線性代數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
11.2.2 微分. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
11.2.3 概率. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
11.3 使⽤Jupyter記事本. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
11.3.1 在本地編輯和運⾏本書的代碼. . . . . . . . . . . . . . . . . . . . . . . . 503
11.3.2 ⾼級選項. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
11.4 使⽤AWS運⾏代碼. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
11.4.1 申請帳號並登陸. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
11.4.2 創建並運⾏EC2實例. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
11.4.3 安裝CUDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
11.4.4 獲取本書的代碼並安裝GPU版的MXNet . . . . . . . . . . . . . . . . . . . 517
11.4.5 運⾏Jupyter記事本. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
11.4.6 關閉不使⽤的實例. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
11.5 GPU購買指南. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
11.5.1 選擇GPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
11.5.2 整機配置. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
11.6 如何為本書貢獻. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
11.7 d2lzh包索引. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
One thought on “動手學深度學習 <动手学深度学习>”
李沐的深度學習筆記來了
資料來源: https://github.com/HIT-UG-Group/DeepLearning-MuLi-Notes
課本: https://zh-v2.d2l.ai/
影片教學: https://space.bilibili.com/1567748478/channel/seriesdetail?sid=358497