目录
第 一篇 入门——PyTorch基础
第 1章 快速了解人工智能与PyTorch 3
1.1 图神经网络与深度学习 4
1.1.1 深度神经网络 4
1.1.2 图神经网络 4
1.2 PyTorch是做什么的 4
1.3 PyTorch的特点 5
1.4 PyTorch与TensorFlow各有所长 6
1.5 如何使用本书学好深度学习 8
第 2章 搭建开发环境 9
2.1 下载及安装Anaconda 10
2.1.1 下载Anaconda开发工具 10
2.1.2 安装Anaconda开发工具 10
2.1.3 安装Anaconda开发工具时的注意事项 11
2.2 安装PyTorch 11
2.2.1 打开PyTorch官网 12
2.2.2 配置PyTorch安装命令 12
2.2.3 使用配置好的命令安装PyTorch 12
2.2.4 配置PyTorch的镜像源 13
2.3 熟悉Anaconda 3的开发工具 15
2.3.1 快速了解Spyder 15
2.3.2 快速了解Jupyter Notebook 17
2.4 测试开发环境 18
第3章 PyTorch基本开发步骤——用逻辑回归拟合二维数据 19
3.1 实例1:从一组看似混乱的数据中找出规律 20
3.1.1 准备数据 20
3.1.2 定义网络模型 21
3.1.3 搭建网络模型 22
3.1.4 训练模型 23
3.1.5 可视化训练结果 23
3.1.6 使用及评估模型 24
3.1.7 可视化模型 25
3.2 模型是如何训练出来的 26
3.2.1 模型里的内容及意义 26
3.2.2 模型内部数据流向 27
3.3 总结 27
第4章 快速上手PyTorch 29
4.1 神经网络中的几个基本数据类型 30
4.2 张量类的基础 30
4.2.1 定义张量的方法 30
4.2.2 张量的类型 32
4.2.3 张量的type()方法 33
4.3 张量与NumPy 34
4.3.1 张量与NumPy类型数据的相互转换 34
4.3.2 张量与NumPy各自的形状获取 34
4.3.3 张量与NumPy各自的切片操作 34
4.3.4 张量与NumPy类型数据相互转换间的陷阱 35
4.4 在CPU和GPU控制的内存中定义张量 36
4.4.1 将CPU内存中的张量转化到GPU内存中 36
4.4.2 直接在GPU内存中定义张量 36
4.4.3 使用to()方法来指定设备 36
4.4.4 使用环境变量CUDA_VISIBLE_DEVICES来指定设备 36
4.5 生成随机值张量 37
4.5.1 设置随机值种子 37
4.5.2 按照指定形状生成随机值 37
4.5.3 生成线性空间的随机值 37
4.5.4 生成对数空间的随机值 38
4.5.5 生成未初始化的矩阵 38
4.5.6 更多的随机值生成函数 38
4.6 张量间的数学运算 38
4.6.1 PyTorch的运算函数 39
4.6.2 PyTorch的自变化运算函数 39
4.7 张量间的数据操作 39
4.7.1 用torch.reshape()函数实现数据维度变换 39
4.7.2 实现张量数据的矩阵转置 40
4.7.3 view()方法与contiguous()方法 40
4.7.4 用torch.cat()函数实现数据连接 41
4.7.5 用torch.chunk()函数实现数据均匀分割 41
4.7.6 用torch.split()函数实现数据不均匀分割 42
4.7.7 用torch.gather()函数对张量数据进行检索 42
4.7.8 按照指定阈值对张量进行过滤 42
4.7.9 找出张量中的非零值索引 43
4.7.10 根据条件进行多张量取值 43
4.7.11 根据阈值进行数据截断 43
4.7.12 获取数据中最大值、最小值的索引 43
4.8 Variable类型与自动微分模块 44
4.8.1 自动微分模块简介 44
4.8.2 Variable对象与张量对象之间的转化 44
4.8.3 用no_grad()与enable_grad()控制梯度计算 45
4.8.4 函数torch.no_grad()介绍 45
4.8.5 函数enable_grad()与no_grad()的嵌套 46
4.8.6 用set_grad_enabled()函数统一管理梯度计算 47
4.8.7 Variable对象的grad_fn属性 47
4.8.8 Variable对象的is_leaf属性 48
4.8.9 用backward()方法自动求导 48
4.8.10 自动求导的作用 49
4.8.11 用detach()方法将Variable对象分离成叶子节点 49
4.8.12 volatile属性扩展 50
4.9 定义模型结构的步骤与方法 50
4.9.1 代码实现: Module类的使用方法 50
4.9.2 模型中的参数Parameters类 52
4.9.3 为模型添加参数 53
4.9.4 从模型中获取参数 53
4.9.5 保存与载入模型 56
4.9.6 模型结构中的钩子函数 57
4.10 模型的网络层 58
第5章 神经网络的基本原理与实现 59
5.1 了解深度学习中的神经网络与神经元 60
5.1.1 了解单个神经元 60
5.1.2 生物神经元与计算机神经元模型的结构相似性 62
5.1.3 生物神经元与计算机神经元模型的工作流程相似性 63
5.1.4 神经网络的形成 63
5.2 深度学习中的基础神经网络模型 63
5.3 什么是全连接神经网络 64
5.3.1 全连接神经网络的结构 64
5.3.2 实例2:分析全连接神经网络中每个神经元的作用 64
5.3.3 全连接神经网络的拟合原理 66
5.3.4 全连接神经网络的设计思想 67
5.4 激活函数——加入非线性因素,弥补线性模型缺陷 68
5.4.1 Sigmoid函数 68
5.4.2 tanh函数 69
5.4.3 ReLU函数 70
5.4.4 激活函数的多种形式 72
5.4.5 扩展1:更好的激活函数(Swish与Mish) 73
5.4.6 扩展2:更适合NLP任务的激活函数(GELU) 74
5.5 激活函数总结 75
5.6 训练模型的步骤与方法 76
5.7 神经网络模块(nn)中的损失函数 76
5.7.1 L1损失函数 76
5.7.2 均值平方差(MSE)损失函数 77
5.7.3 交叉熵损失(CrossEntropyLoss)函数 77
5.7.4 其他的损失函数 78
5.7.5 总结:损失算法的选取 79
5.8 Softmax算法——处理分类问题 79
5.8.1 什么是Softmax 80
5.8.2 Softmax原理 80
5.8.3 常用的Softmax接口 80
5.8.4 实例3:Softmax与交叉熵的应用 81
5.8.5 总结:更好地认识Softmax 82
5.9 优化器模块 82
5.9.1 了解反向传播与BP算法 82
5.9.2 优化器与梯度下降 83
5.9.3 优化器的类别 83
5.9.4 优化器的使用方法 83
5.9.5 查看优化器的参数结构 84
5.9.6 常用的优化器——Adam 85
5.9.7 更好的优化器——Ranger 85
5.9.8 如何选取优化器 85
5.10 退化学习率——在训练的速度与精度之间找到平衡 86
5.10.1 设置学习率的方法——退化学习率 86
5.10.2 退化学习率接口(lr_scheduler) 87
5.10.3 使用lr_scheduler接口实现多种退化学习率 88
5.11 实例4:预测泰坦尼克号船上的生存乘客 91
5.11.1 载入样本 91
5.11.2 样本的特征分析——离散数据与连续数据 92
5.11.3 处理样本中的离散数据和Nan值 93
5.11.4 分离样本和标签并制作成数据集 95
5.11.5 定义Mish激活函数与多层全连接网络 96
5.11.6 训练模型并输出结果 97
第二篇 基础——神经网络的监督训练与无监督训练
第6章 实例5:识别黑白图中的服装图案 101
6.1 熟悉样本:了解Fashion-MNIST数据集 102
6.1.1 Fashion-MNIST的起源 102
6.1.2 Fashion-MNIST的结构 102
6.1.3 手动下载Fashion-MNIST数据集 103
6.1.4 代码实现:自动下载Fashion-MNIST数据集 103
6.1.5 代码实现:读取及显示Fashion-MNIST中的数据 104
6.2 制作批次数据集 105
6.2.1 数据集封装类DataLoader 105
6.2.2 代码实现:按批次封装Fashion-MNIST数据集 106
6.2.3 代码实现:读取批次数据集 107
6.3 构建并训练模型 108
6.3.1 代码实现:定义模型类 108
6.3.2 代码实现:定义损失的计算方法及优化器 110
6.3.3 代码实现:训练模型 110
6.3.4 代码实现:保存模型 111
6.4 加载模型,并用其进行预测 111
6.5 评估模型 112
6.6 扩展:多显卡并行训练 113
6.6.1 代码实现:多显卡训练 113
6.6.2 多显卡训练过程中,保存与读取模型文件的注意事项 115
6.6.3 在切换设备环境时,保存与读取模型文件的注意事项 116
6.6.4 处理显存残留问题 116
第7章 监督学习中的神经网络 119
7.1 从视觉的角度理解卷积神经网络 120
7.1.1 生物视觉系统原理 120
7.1.2 微积分 120
7.1.3 离散微分与离散积分 120
7.1.4 视觉神经网络中的离散积分 121
7.2 卷积神经网络的结构 121
7.2.1 卷积神经网络的工作过程 122
7.2.2 卷积神经网络与全连接网络的区别 123
7.2.3 了解1D卷积、2D卷积和3D卷积 123
7.2.4 实例分析:Sobel算子的原理 123
7.2.5 深层神经网络中的卷积核 126
7.2.6 理解卷积的数学意义——卷积分 126
7.3 卷积神经网络的实现 127
7.3.1 了解卷积接口 127
7.3.2 卷积操作的类型 129
7.3.3 卷积参数与卷积结果的计算规则 130
7.3.4 实例6:卷积函数的使用 130
7.3.5 实例7:使用卷积提取图片的轮廓 135
7.4 深层卷积神经网络 138
7.4.1 深层卷积神经网络组成 138
7.4.2 池化操作 140
7.4.3 了解池化接口 140
7.4.4 实例8:池化函数的使用 141
7.4.5 实例9:搭建卷积神经网络 143
7.5 循环神经网络结构 145
7.5.1 了解人的记忆原理 145
7.5.2 循环神经网络的应用领域 146
7.5.3 循环神经网络的正向传播过程 147
7.5.4 BP算法与BPTT算法的原理 148
7.5.5 实例10:简单循环神经网络实现——设计一个退位减法器 149
7.6 常见的循环神经网络单元及结构 154
7.6.1 长短记忆(LSTM)单元 155
7.6.2 门控循环单元(GRU) 157
7.6.3 只有忘记门的LSTM(JANET)单元 158
7.6.4 独立循环(IndRNN)单元 158
7.6.5 双向RNN结构 159
7.7 实例11:用循环神经网络训练语言模型 160
7.7.1 什么是语言模型 161
7.7.2 词表与词向量 161
7.7.3 词向量的原理与实现 161
7.7.4 NLP中多项式分布 162
7.7.5 循环神经网络的实现 163
7.7.6 实现语言模型的思路与步骤 164
7.7.7 代码实现:准备样本 165
7.7.8 代码实现:构建循环神经网络(RNN)模型 167
7.7.9 代码实现:实例化模型类,并训练模型 168
7.7.10 代码实现:运行模型生成句子 171
7.8 过拟合问题及优化技巧 172
7.8.1 实例12:训练具有过拟合问题的模型 172
7.8.2 改善模型过拟合的方法 175
7.8.3 了解正则化 175
7.8.4 实例13:用L2正则改善模型的过拟合状况 176
7.8.5 实例14:通过增大数据集改善模型的过拟合状况 178
7.8.6 Dropout方法 179
7.8.7 实例15: 通过Dropout方法改善模型的过拟合状况 180
7.8.8 全连接网络的深浅与泛化能力的联系 182
7.8.9 了解批量归一化(BN)算法 182
7.8.10 实例16: 手动实现批量归一化的计算方法 185
7.8.11 实例17: 通过批量归一化方法改善模型的过拟合状况 187
7.8.12 使用批量归一化方法时的注意 事项 188
7.8.13 扩展:多种批量归一化算法介绍 188
7.9 神经网络中的注意力机制 189
7.9.1 注意力机制的实现 189
7.9.2 注意力机制的软、硬模式 190
7.9.3 注意力机制模型的原理 190
7.9.4 多头注意力机制 191
7.9.5 自注意力机制 192
7.10 实例18:利用注意力循环神经网络对图片分类 192
7.10.1 循环神经网络处理图片分类任务的原理 192
7.10.2 代码实现:搭建LSTM网络模型 193
7.10.3 代码实现:构建注意力机制类 193
7.10.4 代码实现:构建输入数据并训练模型 196
7.10.5 使用并评估模型 197
7.10.6 扩展1:使用梯度剪辑技巧优化训练过程 197
7.10.7 扩展2:使用JANET单元完成RNN 198
7.10.8 扩展3:使用IndRNN单元实现RNN 198
第8章 无监督学习中的神经网络 199
8.1 快速了解信息熵 200
8.1.1 信息熵与概率的计算关系 200
8.1.2 联合熵 202
8.1.3 条件熵 202
8.1.4 交叉熵 203
8.1.5 相对熵——KL散度 203
8.1.6 JS散度 204
8.1.7 互信息 204
8.2 通用的无监督模型——自编码神经网络与对抗神经网络 205
8.3 自编码神经网络 206
8.3.1 自编码神经网络的结构 206
8.3.2 自编码神经网络的计算过程 206
8.3.3 自编码神经网络的作用与意义 207
8.3.4 变分自编码神经网络 207
8.3.5 条件变分自编码神经网络 208
8.4 实例19:用变分自编码神经网络模型生成模拟数据 208
8.4.1 变分自编码神经网络模型的结构介绍 208
8.4.2 代码实现:引入模块并载入样本 209
8.4.3 代码实现:定义变分自编码神经网络模型的正向结构 210
8.4.4 变分自编码神经网络模型的反向传播与KL散度的应用 211
8.4.5 代码实现:完成损失函数和训练函数 212
8.4.6 代码实现:训练模型并输出可视化结果 213
8.4.7 代码实现:提取样本的低维特征并进行可视化 214
8.4.8 代码实现:可视化模型的输出空间 215
8.5 实例20:用条件变分自编码神经网络生成可控模拟数据 216
8.5.1 条件变分自编码神经网络的实现 216
8.5.2 代码实现:定义条件变分自编码神经网络模型的正向结构 217
8.5.3 代码实现:训练模型并输出可视化结果 218
8.6 对抗神经网络 219
8.6.1 对抗神经网络的工作过程 219
8.6.2 对抗神经网络的作用 220
8.6.3 GAN模型难以训练的原因 220
8.6.4 WGAN模型——解决GAN难以训练的问题 221
8.6.5 分析WGAN的不足 222
8.6.6 WGAN-gp模型——更容易训练的GAN模型 223
8.6.7 条件GAN 2248.6.8 带有W散度的GAN——WGAN-div 225
8.7 实例21:用WGAN-gp模型生成模拟数据 226
8.7.1 DCGAN中的全卷积 226
8.7.2 上采样与下采样 227
8.7.3 实例归一化 228
8.7.4 代码实现:引入模块并载入样本 228
8.7.5 代码实现:定义生成器与判别器 229
8.7.6 激活函数与归一化层的位置关系 231
8.7.7 代码实现:定义函数完成梯度惩罚项 234
8.7.8 代码实现:定义模型的训练函数 235
8.7.9 代码实现:定义函数,可视化模型结果 237
8.7.10 代码实现:调用函数并训练模型 237
8.7.11 练习题 238
8.8 实例22:用条件GAN生成可控模拟数据 239
8.8.1 代码实现:定义条件GAN模型的正向结构 239
8.8.2 代码实现:调用函数并训练模型 240
8.9 实例23:实现带有W散度的GAN——WGAN-div模型 241
8.9.1 代码实现:完成W散度的损失函数 241
8.9.2 代码实现:定义训练函数来训练模型 242
8.10 散度在神经网络中的应用 243
8.10.1 f-GAN框架 243
8.10.2 基于f散度的变分散度最小化方法 243
8.10.3 用Fenchel共轭函数实现f-GAN 244
8.10.4 f-GAN中判别器的激活函数 246
8.10.5 互信息神经估计 247
8.10.6 实例24:用神经网络估计互信息 249
8.10.7 稳定训练GAN模型的经验和技巧 252
8.11 实例25:用最大化深度互信息模型执行图片搜索器 253
8.11.1 DIM模型的原理 254
8.11.2 DIM模型的结构 254
8.11.3 代码实现:加载CIFAR数据集 257
8.11.4 代码实现:定义DIM模型 260
8.11.5 代码实现:实例化DIM模型并进行训练 262
8.11.6 代码实现:加载模型搜索图片 264
第9章 快速了解图神经网络——少量样本也可以训练模型 269
9.1 图神经网络的相关基础知识 270
9.1.1 欧氏空间与非欧氏空间 270
9.1.2 图 270
9.1.3 图相关的术语和度量 270
9.1.4 图神经网络 271
9.1.5 GNN的动机 271
9.2 矩阵的基础 272
9.2.1 转置矩阵 272
9.2.2 对称矩阵及其特性 272
9.2.3 对角矩阵与单位矩阵 272
9.2.4 哈达马积 273
9.2.5 点积 273
9.2.6 对角矩阵的特性与操作方法 273
9.2.7 度矩阵与邻接矩阵 275
9.3 邻接矩阵的几种操作 275
9.3.1 获取有向图的短边和长边 276
9.3.2 将有向图的邻接矩阵转成无向图的邻接矩阵 277
9.4 实例26:用图卷积神经网络为论文分类 278
9.4.1 CORA数据集 278
9.4.2 代码实现:引入基础模块并设置运行环境 279
9.4.3 代码实现:读取并解析论文数据 279
9.4.4 代码实现:读取并解析论文关系数据 281
9.4.5 代码实现:加工图结构的矩阵数据 283
9.4.6 代码实现:将数据转为张量,并分配运算资源 284
9.4.7 代码实现:定义Mish激活函数与图卷积操作类 284
9.4.8 代码实现:搭建多层图卷积网络 286
9.4.9 代码实现:用Ranger优化器训练模型并可视化结果 287
9.5 图卷积神经网络 290
9.5.1 图结构与拉普拉斯矩阵的关系 290
9.5.2 拉普拉斯矩阵的3种形式 291
9.6 扩展实例:用Multi-sample Dropout优化模型的训练速度 291
9.6.1 Multi-sample Dropout方法 292
9.6.2 代码实现:为图卷积模型添加 Multi-sample Dropout方法 292
9.6.3 代码实现:使用带有Multi-sample Dropout方法的图卷积模型 293
9.7 从图神经网络的视角看待深度学习 294
9.8 图神经网络使用拉普拉斯矩阵的原因 295
9.8.1 节点与邻接矩阵的点积作用 295
9.8.2 拉普拉斯矩阵的点积作用 296
9.8.3 重新审视图卷积的拟合本质 296
9.8.4 点积计算并不是唯一方法 296
第 10章 基于空间域的图神经网络实现 297
10.1 重新认识图卷积神经网络 298
10.1.1 基于谱域的图处理 298
10.1.2 基于顶点域的图处理 298
10.1.3 基于顶点域的图卷积 298
10.1.4 图卷积的特性 299
10.2 实例27:用图注意力神经网络为论文分类 300
10.2.1 图注意力网络 300
10.2.2 工程部署 301
10.2.3 代码实现:对邻接矩阵进行对称归一化拉普拉斯矩阵转化 301
10.2.4 代码实现:搭建图注意力神经网络层 301
10.2.5 代码实现:搭建图注意力模型类 302
10.2.6 代码实现:实例化图注意力模型,并进行训练与评估 303
10.2.7 常用的图神经网络库 304
10.3 图神经网络常用库——DGL库 305
10.3.1 DGL库的实现与性能 305
10.3.2 安装DGL库的方法及注意事项 305
10.3.3 DGL库中的数据集 306
10.3.4 DGL库中的图 307
10.3.5 DGL库中的内联函数 307
10.3.6 扩展:了解PyG库 307
10.4 DGLGraph图的基本操作 308
10.4.1 DGLGraph图的创建与维护 308
10.4.2 查看DGLGraph图中的度 309
10.4.3 DGLGraph图与NetWorkx图的相互转化 310
10.4.4 NetWorkx库 311
10.4.5 DGLGraph图中顶点属性的操作 313
10.4.6 DGLGraph图中边属性的操作 314
10.4.7 DGLGraph图属性操作中的注意事项 314
10.4.8 使用函数对图的顶点和边进行计算 315
10.4.9 使用函数对图的顶点和边进行过滤 315
10.4.10 DGLGraph图的消息传播 316
10.4.11 DGL库中的多图处理 317
10.5 实例28:用带有残差结构的多层GAT模型实现论文分类 318
10.5.1 代码实现:使用DGL数据集加载CORA样本 319
10.5.2 用邻居聚合策略实现GATConv 321
10.5.3 代码实现:用DGL库中的GATConv搭建多层GAT模型 323
10.5.4 代码实现:使用早停方式训练模型并输出评估结果 324
10.6 图卷积模型的缺陷 327
10.6.1 全连接网络的特征与缺陷 327
10.6.2 图卷积模型的缺陷 328
10.6.3 弥补图卷积模型缺陷的方法 328
10.6.4 从图结构角度理解图卷积原理及缺陷 328
10.7 实例29:用简化图卷积模型实现论文分类 329
10.7.1 SGC的网络结构 330
10.7.2 DGL库中SGC模型的实现方式 331
10.7.3 代码实现:搭建SGC模型并进行训练 333
10.7.4 扩展: SGC模型的不足 334
10.8 实例30:用图滤波神经网络模型实现论文分类 334
10.8.1 GfNN的结构 334
10.8.2 代码实现:搭建GfNN模型并进行训练 335
10.9 实例31:用深度图互信息模型实现论文分类 337
10.9.1 DGI模型的原理与READOUT函数 337
10.9.2 代码实现:搭建多层SGC网络 338
10.9.3 代码实现:搭建编码器和判别器 339
10.9.4 代码实现:搭建DGI模型并进行训练 340
10.9.5 代码实现:利用DGI模型提取特征并进行分类 342
10.10 实例32:用图同构网络模型实现论文分类 344
10.10.1 多重集与单射 344
10.10.2 GIN模型的原理与实现 344
10.10.3 代码实现:搭建多层GIN模型并进行训练 346
10.11 实例33:用APPNP模型实现论文分类 347
10.11.1 APPNP模型的原理与实现 347
10.11.2 代码实现:搭建APPNP模型并进行训练 349
10.12 实例34:用JKNet模型实现论文分类 351
10.12.1 JKNet模型结构 351
10.12.2 代码实现:修改图数据的预处理部分 352
10.12.3 代码实现:搭建JKNet模型并进行训练 352
10.13 总结 355