本书针对TensorFlow 1.0以上版本编写,采用"实例”的形式编写,通过60个实例全面而深入地讲解"深度学习神经网络原理”和"Tensorflow使用方法”两方面。书中的实例具有很强的实用,如对图片分类、制作一个简单的聊天机器人、进行图像识别等。本书还免费提供了所有案例的源代码及数据样本,这些代码和样本不仅方便了读者学习,而且也能为以后的工作提供便利。全书共分为4篇: 第 1 篇 准备; 第2篇 入门 ; 第 3 篇 基础——常用的神经网络结构; 第 4 篇 进阶--——掌握深度学习模型;第 5 篇 高级--——深度学习模型实战。
李金洪,精通c、c++、汇编、python、java、go等语言。擅长神经网络、算法、协议分析、逆向、移动互联网安全架构等技术,先后担任过CAD算法工程师、手机游戏主程、架构师、项目经理、CTO、部门经理、资深产品总监等职位,也曾自主创业过。
=====第1篇 准备
第1章 学习准备/2
∣1.1 TensorFlow能做什么/2
∣1.2 学习TensorFlow的必备知识/3
∣1.3 学习技巧:跟读代码/4
∣1.4 如何学习本书/4
-
第2章 搭建开发环境/5
2.1 准备硬件环境/5
2.2 下载及安装Anaconda/6
2.3 安装TensorFlow/9
2.4 GPU版本的安装方法/10
∣2.4.1 在Windows中安装CUDA/10
∣2.4.2 在Linux中安装CUDA/13
∣2.4.3 在Windows中安装cuDNN/13
∣2.4.4 在Linux中安装cuDNN/14
∣2.4.5 常见错误及解决方案/16
2.5 测试显卡的常用命令/16
2.6 TensorFlow 1.x版本与2.x版本共存的解决方案/18
-
第3章 实例1:用AI模型识别图像是桌子、猫、狗,还是其他/21
3.1 准备代码环境并预训练模型/21
3.2 代码实现:初始化环境变量,并载入ImgNet标签/24
3.3 代码实现:定义网络结构/25
3.4 代码实现:载入模型进行识别/26
3.5 扩展:用更多预训练模型完成图片分类任务/28
∣
===== 第2篇 基础
∣
第4章 用TensorFlow制作自己的数据集/30
4.1 快速导读/30
∣4.1.1 什么是数据集/30
∣4.1.2 TensorFlow的框架/31
∣4.1.3 什么是TFDS/31
4.2 实例2:将模拟数据制作成内存对象数据集/32
∣4.2.1 代码实现:生成模拟数据/32
∣4.2.2 代码实现:定义占位符/33
∣4.2.3 代码实现:建立会话,并获取显数据/34
∣4.2.4 代码实现:模拟数据可视化/34
∣4.2.5 运行程序/34
∣4.2.6 代码实现:创建带有迭代值并支持乱序功能的模拟数据集/35
4.3 实例3:将图片制作成内存对象数据集/37
∣4.3.1 样本介绍/38
∣4.3.2 代码实现:载入文件名称与标签/39
∣4.3.3 代码实现:生成队列中的批次样本数据/40
∣4.3.4 代码实现:在会话中使用数据集/41
∣4.3.5 运行程序/42
4.4 实例4:将Excel文件制作成内存对象数据集/42
∣4.4.1 样本介绍/43
∣4.4.2 代码实现:逐行读取数据并分离标签/43
∣4.4.3 代码实现:生成队列中的批次样本数据/44
∣4.4.4 代码实现:在会话中使用数据集/45
∣4.4.5 运行程序/46
4.5 实例5:将图片文件制作成TFRecord数据集/46
∣4.5.1 样本介绍/47
∣4.5.2 代码实现:读取样本文件的目录及标签/47
∣4.5.3 代码实现:定义函数生成TFRecord数据集/48
∣4.5.4 代码实现:读取TFRecord数据集,并将其转化为队列/49
∣4.5.5 代码实现:建立会话,将数据保存到文件/50
∣4.5.6 运行程序/51
4.6 实例6:将内存对象制作成Dataset数据集/52
∣4.6.1 如何生成Dataset数据集/52
∣4.6.2 如何使用Dataset接口/53
∣4.6.3 tf.data.Dataset接口所支持的数据集变换操作/54
∣4.6.4 代码实现:以元组和字典的方式生成Dataset对象/58
∣4.6.5 代码实现:对Dataset对象中的样本进行变换操作/59
∣4.6.6 代码实现:创建Dataset迭代器/60
∣4.6.7 代码实现:在会话中取出数据/60
∣4.6.8 运行程序/61
∣4.6.9 使用tf.data.Dataset.from_tensor_slices接口的注意事项/62
4.7 实例7:将图片文件制作成Dataset数据集/63
∣4.7.1 代码实现:读取样本文件的目录及标签/64
∣4.7.2 代码实现:定义函数,实现图片转换操作/64
∣4.7.3 代码实现:用自定义函数实现图片归一化/65
∣4.7.4 代码实现:用第三方函数将图片旋转30°/65
∣4.7.5 代码实现:定义函数,生成Dataset对象/66
∣4.7.6 代码实现:建立会话,输出数据/67
∣4.7.7 运行程序/68
4.8 实例8:将TFRecord文件制作成Dataset数据集/69
∣4.8.1 样本介绍/69
∣4.8.2 代码实现:定义函数,生成Dataset对象/70
∣4.8.3 代码实现:建立会话输出数据/71
∣4.8.4 运行程序/72
4.9 实例9:在动态图中读取Dataset数据集/72
∣4.9.1 代码实现:添加动态图调用/72
∣4.9.2 制作数据集/73
∣4.9.3 代码实现:在动态图中显示数据/73
∣4.9.4 扩展示例10:在TensorFlow 2.x中操作数据集/74
4.10 实例11:在不同场景中使用数据集/77
∣4.10.1 代码实现:在训练场景中使用数据集/78
∣4.10.2 代码实现:在应用模型场景中使用数据集/79
∣4.10.3 代码实现:在训练与测试混合场景中使用数据集/80
4.11 tf.data.Dataset接口的更多应用/81
-
第5章 10分钟快速训练自己的图片分类模型/82
5.1 快速导读/82
∣5.1.1 认识模型和模型检查点文件/82
∣5.1.2 了解“预训练模型”与微调(Fine-Tune)/82
∣5.1.3 学习TensorFlow中的预训练模型库——TF-Hub库/83
5.2 实例12:通过微调模型分辨男女/83
∣5.2.1 准备工作/84
∣5.2.2 代码实现:处理样本数据并生成Dataset对象/85
∣5.2.3 代码实现:定义微调模型的类MyNASNetModel/88
∣5.2.4 代码实现:构建MyNASNetModel类中的基本模型/88
∣5.2.5 代码实现:实现MyNASNetModel类中的微调操作/89
∣5.2.6 代码实现:实现与训练相关的其他方法/90
∣5.2.7 代码实现:构建模型,用于训练、测试、使用/92
∣5.2.8 代码实现:通过二次迭代来训练微调模型/94
∣5.2.9 代码实现:测试模型/96
5.3 扩展:通过摄像头实时分辨男女/100
5.4 TF-slim接口中的更多成熟模型/100
∣5.5 实例13:用TF-Hub库微调模型以评估人物的年龄/100
∣5.5.1 准备样本/101
∣5.5.2 下载TF-Hub库中的模型/102
∣5.5.3 代码实现:测试TF-Hub库中的MobileNet_V2模型/104
∣5.5.4 用TF-Hub库微调MobileNet_V2模型/107
∣5.5.5 代码实现:用模型评估人物的年龄/109
∣5.5.6 扩展:用TF-Hub库中的其他模型实现不同领域的分类任务/113
∣5.6 总结/113
∣5.7 练习题/114
∣5.7.1 基于TF-slim接口的练习/115
∣5.7.2 基于TF-Hub库的练习/115
-
第6章 用TensorFlow编写训练模型的程序/117
6.1 快速导读/117
∣6.1.1 训练模型是怎么一回事/117
∣6.1.2 用“静态图”方式训练模型/117
∣6.1.3 用“动态图”方式训练模型/118
∣6.1.4 什么是估算器框架接口(Estimators API)/119
∣6.1.5 什么是tf.layers接口/120
∣6.1.6 什么是tf.keras接口/121
∣6.1.7 什么是tf.js接口/122
∣6.1.8 什么是TFLearn框架/123
∣6.1.9 该选择哪种框架/123
∣6.1.10 分配运算资源与使用分布策略/124
∣6.1.11 用tfdbg调试TensorFlow模型/127
∣6.1.12 用钩子函数(Training_Hooks)跟踪训练状态/127
∣6.1.13 用分布式运行方式训练模型/128
∣6.1.14 用T2T框架系统更方便地训练模型/128
∣6.1.15 将TensorFlow 1.x中的代码移植到2.x版本/129
∣6.1.16 TensorFlow 2.x中的新特性——自动图/130
6.2 实例14:用静态图训练一个具有保存检查点功能的回归模型/131
∣6.2.1 准备开发步骤/131
∣6.2.2 生成检查点文件/131
∣6.2.3 载入检查点文件/132
∣6.2.4 代码实现:在线性回归模型中加入保存检查点功能/132
∣6.2.5 修改迭代次数,二次训练/135
6.3 实例15:用动态图(eager)训练一个具有保存检查点功能的回归模型/136
∣6.3.1 代码实现:启动动态图,生成模拟数据/136
∣6.3.2 代码实现:定义动态图的网络结构/137
∣6.3.3 代码实现:在动态图中加入保存检查点功能/138
∣6.3.4 代码实现:按指定迭代次数进行训练,并可视化结果/139
∣6.3.5 运行程序,显示结果/140
∣6.3.6 代码实现:用另一种方法计算动态图梯度/141
∣6.3.7 扩展实例16:在动态图中获取参数变量/142
∣6.3.8 小心动态图中的参数陷阱/144
∣6.3.9 扩展实例17:在静态图中使用动态图/145
6.4 实例18:用估算器框架训练一个回归模型/147
∣6.4.1 代码实现:生成样本数据集/147
∣6.4.2 代码实现:设置日志级别/148
∣6.4.3 代码实现:实现估算器的输入函数/148
∣6.4.4 代码实现:定义估算器的模型函数/149
∣6.4.5 代码实现:通过创建config文件指定硬件的运算资源/151
∣6.4.6 代码实现:定义估算器/152
∣6.4.7 用tf.estimator.RunConfig控制更多的训练细节/153
∣6.4.8 代码实现:用估算器训练模型/153
∣6.4.9 代码实现:通过热启动实现模型微调/155
∣6.4.10 代码实现:测试估算器模型/158
∣6.4.11 代码实现:使用估算器模型/158
∣6.4.12 扩展实例19:为估算器添加日志钩子函数/159
6.5 实例20:将估算器代码改写成静态图代码/161
∣6.5.1 代码实现:复制网络结构/161
∣6.5.2 代码实现:重用输入函数/163
∣6.5.3 代码实现:创建会话恢复模型/163
∣6.5.4 代码实现:继续训练/163
6.6 实例21:用tf.layers API在动态图上识别手写数字/165
∣6.6.1 代码实现:启动动态图并加载手写图片数据集/165
∣6.6.2 代码实现:定义模型的类/166
∣6.6.3 代码实现:定义网络的反向传播/167
∣6.6.4 代码实现:训练模型/167
6.7 实例22:用tf.keras API训练一个回归模型/168
∣6.7.1 代码实现:用model类搭建模型/168
∣6.7.2 代码实现:用sequential类搭建模型/169
∣6.7.3 代码实现:搭建反向传播的模型/171
∣6.7.4 代码实现:用两种方法训练模型/172
∣6.7.5 代码实现:获取模型参数/172
∣6.7.6 代码实现:测试模型与用模型进行预测/173
∣6.7.7 代码实现:保存模型与加载模型/173
∣6.7.8 代码实现:将模型导出成JSON文件,再将JSON文件导入模型/175
∣6.7.9 扩展实例23:在tf.keras接口中使用预训练模型ResNet/176
∣6.7.10 扩展:在动态图中使用tf.keras接口/178
∣6.7.11 扩展实例24:在静态图中使用tf.keras接口/178
6.8 实例25:用tf.js接口后方训练一个回归模型/180
∣6.8.1 代码实现:在HTTP的头标签中添加tfjs模块/180
∣6.8.2 代码实现:用JavaScript脚本实现回归模型/181
∣6.8.3 运行程序:在浏览器中查看效果/181
∣6.8.4 扩展:tf.js 接口的应用场景/182
6.9 实例26:用估算器框架实现分布式部署训练/182
∣6.9.1 运行程序:修改估算器模型,使其支持分布式/182
∣6.9.2 通过TF_CONFIG进行分布式配置/183
∣6.9.3 运行程序/185
∣6.9.4 扩展:用分布策略或KubeFlow框架进行分布式部署/186
6.10 实例27:在分布式估算器框架中用tf.keras接口训练ResNet模型,识别图片中是橘子还是苹果/186
∣6.10.1 样本准备/186
∣6.10.2 代码实现:准备训练与测试数据集/187
∣6.10.3 代码实现:制作模型输入函数/187
∣6.10.4 代码实现:搭建ResNet模型/188
∣6.10.5 代码实现:训练分类器模型/189
∣6.10.6 运行程序:评估模型/190
∣6.10.7 扩展:全连接网络的优化/190
6.11 实例28:在T2T框架中用tf.layers接口实现MNIST数据集分类/191
∣6.11.1 代码实现:查看T2T框架中的数据集(problems)/191
∣6.11.2 代码实现:构建T2T框架的工作路径及下载数据集/192
∣6.11.3 代码实现:在T2T框架中搭建自定义卷积网络模型/193
∣6.11.4 代码实现:用动态图方式训练自定义模型/194
∣6.11.5 代码实现:在动态图中用metrics模块评估模型/195
6.12 实例29:在T2T框架中,用自定义数据集训练中英文翻译模型/196
∣6.12.1 代码实现:声明自己的problems数据集/196
∣6.12.2 代码实现:定义自己的problems数据集/197
∣6.12.3 在命令行下生成tfrecoder格式的数据/198
∣6.12.4 查找T2T框架中的模型及超参,并用指定的模型及超参进行训练/199
∣6.12.5 用训练好的T2T框架模型进行预测/201
∣6.12.6 扩展:在T2T框架中,如何选取合适的模型及超参/202
6.13 实例30:将TensorFlow 1.x中的代码升级为可用于2.x版本的代码/203
∣6.13.1 准备工作:创建Python虚环境/203
∣6.13.2 使用工具转换源码/204
∣6.13.3 修改转换后的代码文件/204
∣6.13.4 将代码升级到TensorFlow 2.x版本的经验总结/205
∣
第3篇 进阶
∣
-第7章 特征工程——会说话的数据/208
7.1 快速导读/208
∣7.1.1 特征工程的基础知识/208
∣7.1.2 离散数据特征与连续数据特征/209
∣7.1.3 了解特征列接口/210
∣7.1.4 了解序列特征列接口/210
∣7.1.5 了解弱学习器接口——梯度提升树(TFBT接口)/210
∣7.1.6 了解特征预处理模块(tf.Transform)/211
∣7.1.7 了解因子分解模块/212
∣7.1.8 了解加权矩阵分解算法/212
∣7.1.9 了解Lattice模块——点阵模型/213
∣7.1.10 联合训练与集成学习/214
7.2 实例31:用wide_deep模型预测人口收入/214
∣7.2.1 了解人口收入数据集/214
∣7.2.2 代码实现:探索性数据分析/217
∣7.2.3 认识wide_deep模型/218
∣7.2.4 部署代码文件/219
∣7.2.5 代码实现:初始化样本常量/220
∣7.2.6 代码实现:生成特征列/220
∣7.2.7 代码实现:生成估算器模型/222
∣7.2.8 代码实现:定义输入函数/223
∣7.2.9 代码实现:定义用于导出冻结图文件的函数/224
∣7.2.10 代码实现:定义类,解析启动参数/225
∣7.2.11 代码实现:训练和测试模型/226
∣7.2.12 代码实现:使用模型/227
∣7.2.13 运行程序/228
7.3 实例32:用弱学习器中的梯度提升树算法预测人口收入/229
∣7.3.1 代码实现:为梯度提升树模型准备特征列/230
∣7.3.2 代码实现:构建梯度提升树模型/230
∣7.3.3 代码实现:训练并导出梯度提升树模型/231
∣7.3.4 代码实现:设置启动参数,运行程序/232
∣7.3.5 扩展:更灵活的TFBT接口/233
7.4 实例33:用feature_column模块转换特征列/233
∣7.4.1 代码实现:用feature_column模块处理连续值特征列/234
∣7.4.2 代码实现:将连续值特征列转化成离散值特征列/237
∣7.4.3 代码实现:将离散文本特征列转化为one-hot与词向量/239
∣7.4.4 代码实现:根据特征列生成交叉列/246
7.5 实例34:用sequence_feature_column接口完成自然语言处理任务的数据预处理工作/248
∣7.5.1 代码实现:构建模拟数据/248
∣7.5.2 代码实现:构建词嵌入初始值/249
∣7.5.3 代码实现:构建词嵌入特征列与共享特征列/249
∣7.5.4 代码实现:构建序列特征列的输入层/250
∣7.5.5 代码实现:建立会话输出结果/251
7.6 实例35:用factorization模块的kmeans接口聚类COCO数据集中的标注框/253
∣7.6.1 代码实现:设置要使用的数据集/253
∣7.6.2 代码实现:准备带聚类的数据样本/253
∣7.6.3 代码实现:定义聚类模型/255
∣7.6.4 代码实现:训练模型/256
∣7.6.5 代码实现:输出图示化结果/256
∣7.6.6 代码实现:提取并排序聚类结果/258
∣7.6.7 扩展:聚类与神经网络混合训练/258
7.7 实例36:用加权矩阵分解模型实现基于电影评分的推荐系统/259
∣7.7.1 下载并加载数据集/259
∣7.7.2 代码实现:根据用户和电影特征列生成稀疏矩阵/260
∣7.7.3 代码实现:建立WALS模型,并对其进行训练/261
∣7.7.4 代码实现:评估WALS模型/263
∣7.7.5 代码实现:用WALS模型为用户推荐电影/264
∣7.7.6 扩展:使用WALS的估算器接口/265
7.8 实例37:用Lattice模块预测人口收入/265
∣7.8.1 代码实现:读取样本,并创建输入函数/266
∣7.8.2 代码实现:创建特征列,并保存校准关键点/267
∣7.8.3 代码实现:创建校准线性模型/270
∣7.8.4 代码实现:创建校准点阵模型/270
∣7.8.5 代码实现:创建随机微点阵模型/271
∣7.8.6 代码实现:创建集合的微点阵模型/271
∣7.8.7 代码实现:定义评估与训练函数/272
∣7.8.8 代码实现:训练并评估模型/273
∣7.8.9 扩展实例38:将点阵模型嵌入神经网络中/274
7.9 实例38:结合知识图谱实现基于电影的推荐系统/278
∣7.9.1 准备数据集/278
∣7.9.2 预处理数据/279
∣7.9.3 搭建MKR模型/279
∣7.9.4 训练模型并输出结果/286
7.10 总结:可解释性算法的意义/286
-
第8章 卷积神经网络(CNN)——在图像处理中应用最广泛的模型/287
8.1 快速导读/287
∣8.1.1 认识卷积神经网络/287
∣8.1.2 什么是空洞卷积/288
∣8.1.3 什么是深度卷积/290
∣8.1.4 什么是深度可分离卷积/290
∣8.1.5 了解卷积网络的缺陷及补救方法/291
∣8.1.6 了解胶囊神经网络与动态路由/292
∣8.1.7 了解矩阵胶囊网络与EM路由算法/297
∣8.1.8 什么是NLP任务/298
∣8.1.9 了解多头注意力机制与内部注意力机制/298
∣8.1.10 什么是带有位置向量的词嵌入/300
∣8.1.11 什么是目标检测任务/300
∣8.1.12 什么是目标检测中的上采样与下采样/301
∣8.1.13 什么是图片分割任务/301
8.2 实例39:用胶囊网络识别黑白图中服装的图案/302
∣8.2.1 熟悉样本:了解Fashion-MNIST数据集/302
∣8.2.2 下载Fashion-MNIST数据集/303
∣8.2.3 代码实现:读取及显示Fashion-MNIST数据集中的数据/304
∣8.2.4 代码实现:定义胶囊网络模型类CapsuleNetModel/305
∣8.2.5 代码实现:实现胶囊网络的基本结构/306
∣8.2.6 代码实现:构建胶囊网络模型/309
∣8.2.7 代码实现:载入数据集,并训练胶囊网络模型/310
∣8.2.8 代码实现:建立会话训练模型/311
∣8.2.9 运行程序/313
∣8.2.10 扩展实例40:实现带有EM路由的胶囊网络/314
8.3 实例41:用TextCNN模型分析评论者是否满意/322
∣8.3.1 熟悉样本:了解电影评论数据集/322
∣8.3.2 熟悉模型:了解TextCNN模型/322
∣8.3.3 数据预处理:用preprocessing接口制作字典/323
∣8.3.4 代码实现:生成NLP文本数据集/326
∣8.3.5 代码实现:定义TextCNN模型/327
∣8.3.6 代码实现:训练TextCNN模型/330
∣8.3.7 运行程序/332
∣8.3.8 扩展:提升模型精度的其他方法/333
8.4 实例42:用带注意力机制的模型分析评论者是否满意/333
∣8.4.1 熟悉样本:了解tf.keras接口中的电影评论数据集/333
∣8.4.2 代码实现:将tf.keras接口中的IMDB数据集还原成句子/334
∣8.4.3 代码实现:用tf.keras接口开发带有位置向量的词嵌入层/336
∣8.4.4 代码实现:用tf.keras接口开发注意力层/338
∣8.4.5 代码实现:用tf.keras接口训练模型/340
∣8.4.6 运行程序/341
∣8.4.7 扩展:用Targeted Dropout技术进一步提升模型的性能/342
8.5 实例43:搭建YOLO V3模型,识别图片中的酒杯、水果等物体/343
∣8.5.1 YOLO V3模型的样本与结构/343
∣8.5.2 代码实现:Darknet-53 模型的darknet块/344
∣8.5.3 代码实现:Darknet-53 模型的下采样卷积/345
∣8.5.4 代码实现:搭建Darknet-53模型,并返回3种尺度特征值/345
∣8.5.5 代码实现:定义YOLO检测模块的参数及候选框/346
∣8.5.6 代码实现:定义YOLO检测块,进行多尺度特征融合/347
∣8.5.7 代码实现:将YOLO检测块的特征转化为bbox attrs单元/347
∣8.5.8 代码实现:实现YOLO V3的检测部分/349
∣8.5.9 代码实现:用非极大值抑制算法对检测结果去重/352
∣8.5.10 代码实现:载入预训练权重/355
∣8.5.11 代码实现:载入图片,进行目标实物的识别/356
∣8.5.12 运行程序/358
8.6 实例44:用YOLO V3模型识别门牌号/359
∣8.6.1 工程部署:准备样本/359
∣8.6.2 代码实现:读取样本数据,并制作标签/359
∣8.6.3 代码实现:用tf.keras接口构建YOLO V3模型,并计算损失/364
∣8.6.4 代码实现:在动态图中训练模型/368
∣8.6.5 代码实现:用模型识别门牌号/372
∣8.6.6 扩展:标注自己的样本/374
8.7 实例45:用Mask R-CNN模型定位物体的像素点/375
∣8.7.1 下载COCO数据集及安装pycocotools/376
∣8.7.2 代码实现:验证pycocotools及读取COCO数据集/377
∣8.7.3 拆分Mask R-CNN模型的处理步骤/383
∣8.7.4 工程部署:准备代码文件及模型/385
∣8.7.5 代码实现:加载数据创建模型,并输出模型权重/385
∣8.7.6 代码实现:搭建残差网络ResNet/387
∣8.7.7 代码实现:搭建Mask R-CNN模型的骨干网络ResNet/393
∣8.7.8 代码实现:可视化Mask R-CNN模型骨干网络的特征输出/396
∣8.7.9 代码实现:用特征金字塔网络处理骨干网络特征/400
∣8.7.10 计算RPN中的锚点/402
∣8.7.11 代码实现:构建RPN/403
∣8.7.12 代码实现:用非极大值抑制算法处理RPN的结果/405
∣8.7.13 代码实现:提取RPN的检测结果/410
∣8.7.14 代码实现:可视化RPN的检测结果/412
∣8.7.15 代码实现:在MaskRCNN类中对ROI区域进行分类/415
∣8.7.16 代码实现:金字塔网络的区域对齐层(ROIAlign)中的区域框与特征的匹配算法/416
∣8.7.17 代码实现:在金字塔网络的ROIAlign层中按区域边框提取内容/418
∣8.7.18 代码实现:调试并输出ROIAlign层的内部运算值/421
∣8.7.19 代码实现:对ROI内容进行分类/422
∣8.7.20 代码实现:用检测器DetectionLayer检测ROI内容,得到最终的实物矩形/426
∣8.7.21 代码实现:根据ROI内容进行实物像素分割/432
∣8.7.22 代码实现:用Mask R-CNN模型分析图片/436
∣
8.8 实例46:训练Mask R-CNN模型,进行形状的识别/439
∣8.8.1 工程部署:准备代码文件及模型/440
∣8.8.2 样本准备:生成随机形状图片/440
∣8.8.3 代码实现:为Mask R-CNN模型添加损失函数/442
∣8.8.4 代码实现:为Mask R-CNN模型添加训练函数,使其支持微调与全网训练/444
∣8.8.5 代码实现:训练并使用模型/446
∣8.8.6 扩展:替换特征提取网络/449
-
第9章 循环神经网络(RNN)——处理序列样本的神经网络/450
9.1 快速导读/450
∣9.1.1 什么是循环神经网络/450
∣9.1.2 了解RNN模型的基础单元LSTM与GRU/451
∣9.1.3 认识QRNN单元/451
∣9.1.4 认识SRU单元/451
∣9.1.5 认识IndRNN单元/452
∣9.1.6 认识JANET单元/453
∣9.1.7 优化RNN模型的技巧/453
∣9.1.8 了解RNN模型中多项式分布的应用/453
∣9.1.9 了解注意力机制的Seq2Seq框架/454
∣9.1.10 了解BahdanauAttention与LuongAttention/456
∣9.1.11 了解单调注意力机制/457
∣9.1.12 了解混合注意力机制/458
∣9.1.13 了解Seq2Seq接口中的采样接口(Helper)/460
∣9.1.14 了解RNN模型的Wrapper接口/460
∣9.1.15 什么是时间序列(TFTS)框架/461
∣9.1.16 什么是梅尔标度/461
∣9.1.17 什么是短时傅立叶变换/462
9.2 实例47:搭建RNN模型,为女孩生成英文名字/463
∣9.2.1 代码实现:读取及处理样本/463
∣9.2.2 代码实现:构建Dataset数据集/466
∣9.2.3 代码实现:用tf.keras接口构建生成式RNN模型/467
∣9.2.4 代码实现:在动态图中训练模型/468
∣9.2.5 代码实现:载入检查点文件并用模型生成名字/469
∣9.2.6 扩展:用RNN模型编写文章/471
9.3 实例48:用带注意力机制的Seq2Seq模型为图片添加内容描述/471
∣9.3.1 设计基于图片的Seq2Seq/471
∣9.3.2 代码实现:图片预处理——用ResNet提取图片特征并保存/472
∣9.3.3 代码实现:文本预处理——过滤处理、字典建立、对齐与向量化处理/475
∣9.3.4 代码实现:创建数据集/477
∣9.3.5 代码实现:用tf.keras接口构建Seq2Seq模型中的编码器/477
∣9.3.6 代码实现:用tf.keras接口构建Bahdanau类型的注意力机制/478
∣9.3.7 代码实现:搭建Seq2Seq模型中的解码器Decoder/478
∣9.3.8 代码实现:在动态图中计算Seq2Seq模型的梯度/480
∣9.3.9 代码实现:在动态图中为Seq2Seq模型添加检查点功能/480
∣9.3.10 代码实现:在动态图中训练Seq2Seq模型/481
∣9.3.11 代码实现:用多项式分布采样获取图片的内容描述/482
9.4 实例49:用IndRNN与IndyLSTM单元制作聊天机器人/485
∣9.4.1 下载及处理样本/486
∣9.4.2 代码实现:读取样本,分词并创建字典/487
∣9.4.3 代码实现:对样本进行向量化、对齐、填充预处理/489
∣9.4.4 代码实现:在Seq2Seq模型中加工样本/489
∣9.4.5 代码实现:在Seq2Seq模型中,实现基于IndRNN与IndyLSTM的动态多层RNN编码器/491
∣9.4.6 代码实现:为Seq2Seq模型中的解码器创建Helper/491
∣9.4.7 代码实现:实现带有Bahdanau注意力、dropout、OutputProjectionWrapper的解码器/492
∣9.4.8 代码实现:在Seq2Seq模型中实现反向优化/493
∣9.4.9 代码实现:创建带有钩子函数的估算器,并进行训练/494
∣9.4.10 代码实现:用估算器框架评估模型/496
∣9.4.11 扩展:用注意力机制的Seq2Seq模型实现中英翻译/498
9.5 实例50:预测飞机发动机的剩余使用寿命/498
∣9.5.1 准备样本/499
∣9.5.2 代码实现:预处理数据——制作数据集的输入样本与标签/500
∣9.5.3 代码实现:建立带有JANET单元的多层动态RNN模型/504
∣9.5.4 代码实现:训练并测试模型/505
∣9.5.5 运行程序/507
∣9.5.6 扩展:为含有JANET单元的RNN模型添加注意力机制/508
9.6 实例51:将动态路由用于RNN模型,对路透社新闻进行分类/509
∣9.6.1 准备样本/509
∣9.6.2 代码实现:预处理数据——对齐序列数据并计算长度/510
∣9.6.3 代码实现:定义数据集/510
∣9.6.4 代码实现:用动态路由算法聚合信息/511
∣9.6.5 代码实现:用IndyLSTM单元搭建RNN模型/513
∣9.6.6 代码实现:建立会话,训练网络/514
∣9.6.7 扩展:用分级网络将文章(长文本数据)分类/515
9.7 实例52:用TFTS框架预测某地区每天的出生人数/515
∣9.7.1 准备样本/515
∣9.7.2 代码实现:数据预处理——制作TFTS框架中的读取器/515
∣9.7.3 代码实现:用TFTS框架定义模型,并进行训练/516
∣9.7.4 代码实现:用TFTS框架评估模型/517
∣9.7.5 代码实现:用模型进行预测,并将结果可视化/517
∣9.7.6 运行程序/518
∣9.7.7 扩展:用TFTS框架进行异常值检测/519
9.8 实例53:用Tacotron模型合成中文语音(TTS)/520
∣9.8.1 准备安装包及样本数据/520
∣9.8.2 代码实现:将音频数据分帧并转为梅尔频谱/521
∣9.8.3 代码实现:用多进程预处理样本并保存结果/523
∣9.8.4 拆分Tacotron网络模型的结构/525
∣9.8.5 代码实现:搭建CBHG网络/527
∣9.8.6 代码实现:构建带有混合注意力机制的模块/529
∣9.8.7 代码实现:构建自定义wrapper/531
∣9.8.8 代码实现:构建自定义采样器/534
∣9.8.9 代码实现:构建自定义解码器/537
∣9.8.10 代码实现:构建输入数据集/539
∣9.8.11 代码实现:构建Tacotron网络/542
∣9.8.12 代码实现:构建Tacotron网络模型的训练部分/545
∣9.8.13 代码实现:训练模型并合成音频文件/546
∣9.8.14 扩展:用pypinyin模块实现文字到声音的转换/551
-
========第4篇 高级
-
第10章 生成式模型——能够输出内容的模型/554
10.1 快速导读/554
∣10.1.1 什么是自编码网络模型/554
∣10.1.2 什么是对抗神经网络模型/554
∣10.1.3 自编码网络模型与对抗神经网络模型的关系/555
∣10.1.4 什么是批量归一化中的自适应模式/555
∣10.1.5 什么是实例归一化/556
∣10.1.6 了解SwitchableNorm及更多的归一化方法/556
∣10.1.7 什么是图像风格转换任务/557
∣10.1.8 什么是人脸属性编辑任务/558
∣10.1.9 什么是TFgan框架/558
10.2 实例54:构建DeblurGAN模型,将模糊相片变清晰/559
∣10.2.1 获取样本/559
∣10.2.2 准备SwitchableNorm算法模块/560
∣10.2.3 代码实现:构建DeblurGAN中的生成器模型/560
∣10.2.4 代码实现:构建DeblurGAN中的判别器模型/562
∣10.2.5 代码实现:搭建DeblurGAN的完整结构/563
∣10.2.6 代码实现:引入库文件,定义模型参数/563
∣10.2.7 代码实现:定义数据集,构建正反向模型/564
∣10.2.8 代码实现:计算特征空间损失,并将其编译到生成器模型的训练模型中/566
∣10.2.9 代码实现:按指定次数训练模型/568
∣10.2.10 代码实现:用模型将模糊相片变清晰/569
∣10.2.11 练习题/572
∣10.2.12 扩展:DeblurGAN模型的更多妙用/572
10.3 实例55:构建AttGAN模型,对照片进行加胡子、加头帘、加眼镜、变年轻等修改/573
∣10.3.1 获取样本/573
∣10.3.2 了解AttGAN模型的结构/574
∣10.3.3 代码实现:实现支持动态图和静态图的数据集工具类/575
∣10.3.4 代码实现:将CelebA做成数据集/577
∣10.3.5 代码实现:构建AttGAN模型的编码器/581
∣10.3.6 代码实现:构建含有转置卷积的解码器模型/582
∣10.3.7 代码实现:构建AttGAN模型的判别器模型部分/584
∣10.3.8 代码实现:定义模型参数,并构建AttGAN模型/585
∣10.3.9 代码实现:定义训练参数,搭建正反向模型/587
∣10.3.10 代码实现:训练模型/592
∣10.3.11 扩展实例56:为人脸添加不同的眼镜/595
∣10.3.12 扩展:AttGAN模型的局限性/597
10.4 实例57:用RNN.WGAN模型模拟生成恶意请求/597
∣10.4.1 获取样本:通过Panabit设备获取恶意请求样本/597
∣10.4.2 了解RNN.WGAN模型/600
∣10.4.3 代码实现:构建RNN.WGAN模型/601
∣10.4.4 代码实现:训练指定长度的RNN.WGAN模型/607
∣10.4.5 代码实现:用长度依次递增的方式训练模型/612
∣10.4.6 运行代码/613
∣10.4.7 扩展:模型的使用及优化/614
-
第11章 模型的攻与防——看似智能的AI也有脆弱的一面/616
11.1 快速导读/616
∣11.1.1 什么是FGSM方法/616
∣11.1.2 什么是cleverhans模块/616
∣11.1.3 什么是黑箱攻击/617
∣11.1.4 什么是基于雅可比矩阵的数据增强方法/618
∣11.1.5 什么是数据中毒攻击/620
11.2 实例58:用FGSM方法生成样本,并攻击PNASNet模型,让其将“狗”识别成“盘子”/621
∣11.2.1 代码实现:创建PNASNet模型/621
∣11.2.2 代码实现:搭建输入层并载入图片,复现PNASNet模型的预测效果/623
∣11.2.3 代码实现:调整参数,定义图片的变化范围/624
∣11.2.4 代码实现:用梯度下降方式生成对抗样本/625
∣11.2.5 代码实现:用生成的样本攻击模型/626
∣11.2.6 扩展:如何防范攻击模型的行为/627
∣11.2.7 代码实现:将数据增强方式用在使用场景,以加固PNASNet模型,防范攻击/627
11.3 实例59:击破数据增强防护,制作抗旋转对抗样本/629
∣11.3.1 代码实现:对输入的数据进行多次旋转/629
∣11.3.2 代码实现:生成并保存鲁棒性更好的对抗样本/630
∣11.3.3 代码实现:在PNASNet模型中比较对抗样本的效果/631
11.4 实例60:以黑箱方式攻击未知模型/633
∣11.4.1 准备工程代码/633
∣11.4.2 代码实现:搭建通用模型框架/634
∣11.4.3 代码实现:搭建被攻击模型/637
∣11.4.4 代码实现:训练被攻击模型/638
∣11.4.5 代码实现:搭建替代模型/639
∣11.4.6 代码实现:训练替代模型/639
∣11.4.7 代码实现:黑箱攻击目标模型/641
∣11.4.8 扩展:利用黑箱攻击中的对抗样本加固模型/645
-
=====第5篇 实战——深度学习实际应用
-
第12章 TensorFlow模型制作——一种功能,多种身份/648
12.1 快速导读/648
∣12.1.1 详细分析检查点文件/648
∣12.1.2 什么是模型中的冻结图/649
∣12.1.3 什么是TF Serving模块与saved_model模块/649
∣12.1.4 用编译子图(defun)提升动态图的执行效率/649
∣12.1.5 什么是TF_Lite模块/652
∣12.1.6 什么是TFjs-converter模块/653
12.2 实例61:在源码与检查点文件分离的情况下,对模型进行二次训练/653
∣12.2.1 代码实现:在线性回归模型中,向检查点文件中添加指定节点/654
∣12.2.2 代码实现:在脱离源码的情况下,用检查点文件进行二次训练/657
∣12.2.3 扩展:更通用的二次训练方法/659
12.3 实例62:导出/导入冻结图文件/661
∣12.3.1 熟悉TensorFlow中的freeze_graph工具脚本/661
∣12.3.2 代码实现:从线性回归模型中导出冻结图文件/662
∣12.3.3 代码实现:导入冻结图,并用模型进行预测/664
12.4 实例63:逆向分析冻结图模型/665
∣12.4.1 使用import_to_tensorboard工具/666
∣12.4.2 用TensorBoard工具查看模型结构/666
12.5 实例64:用saved_model模块导出与导入模型文件/668
∣12.5.1 代码实现:用saved_model模块导出模型文件/668
∣12.5.2 代码实现:用saved_model模块导入模型文件/669
∣12.5.3 扩展:用saved_model模块导出带有签名的模型文件/670
12.6 实例65:用saved_model_cli工具查看及使用saved_model模型/672
∣12.6.1 用show参数查看模型/672
∣12.6.2 用run参数运行模型/673
∣12.6.3 扩展:了解scan参数的黑名单机制/674
∣12.7 实例66:用TF-Hub库导入、导出词嵌入模型文件/674
∣12.7.1 代码实现:模拟生成通用词嵌入模型/674
∣12.7.2 代码实现:用TF-Hub库导出词嵌入模型/675
∣12.7.3 代码实现:导出TF-Hub模型/678
∣12.7.4 代码实现:用TF-Hub库导入并使用词嵌入模型/680
-
第13章 部署TensorFlow模型——模型与项目的深度结合/681
13.1 快速导读/681
∣13.1.1 什么是gRPC服务与HTTP/REST API/681
∣13.1.2 了解TensorFlow对移动终端的支持/682
∣13.1.3 了解树莓派上的人工智能/683
13.2 实例67:用TF_Serving部署模型并进行远程使用/684
∣13.2.1 在Linux系统中安装TF_Serving/684
∣13.2.2 在多平台中用Docker安装TF_Serving/685
∣13.2.3 编写代码:固定模型的签名信息/686
∣13.2.4 在Linux中开启TF_Serving服务/688
∣13.2.5 编写代码:用gRPC访问远程TF_Serving服务/689
∣13.2.6 用HTTP/REST API访问远程TF_Serving服务/691
∣13.2.7 扩展:关于TF_Serving的更多例子/694
13.3 实例68:在安卓手机上识别男女/694
∣13.3.1 准备工程代码/694
∣13.3.2 微调预训练模型/695
∣13.3.3 搭建安卓开发环境/698
∣13.3.4 制作lite模型文件/701
∣13.3.5 修改分类器代码,并运行APP/702
13.4 实例69:在iPhone手机上识别男女并进行活体检测/703
∣13.4.1 搭建iOS开发环境/703
∣13.4.2 布署工程代码并编译/704
∣13.4.3 载入Lite模型,实现识别男女功能/706
∣13.4.4 代码实现:调用摄像头并采集视频流/707
∣13.4.5 代码实现:提取人脸特征/710
∣13.4.6 活体检测算法介绍/712
∣13.4.7 代码实现:实现活体检测算法/713
∣13.4.8 代码实现:完成整体功能并运行程序/714
13.5 实例70:在树莓派上搭建一个目标检测器/717
∣13.5.1 安装树莓派系统/718
∣13.5.2 在树莓派上安装TensorFlow/721
∣13.5.3 编译并安装Protobuf/725
∣13.5.4 安装OpenCV/726
∣13.5.5 下载目标检测模型SSDLite/726
∣13.5.6 代码实现:用SSDLite 模型进行目标检测/727
-
第14章 商业实例——科技源于生活,用于生活/730
14.1 实例71:将特征匹配技术应用在商标识别领域/730
∣14.1.1 项目背景/730
∣14.1.2 技术方案/730
∣14.1.3 预处理图片——统一尺寸/731
∣14.1.4 用自编码网络加夹角余弦实现商标识别/731
∣14.1.5 用卷积网络加triplet-loss提升特征提取效果/731
∣14.1.6 进一步的优化空间/732
14.2 实例72:用RNN抓取蠕虫病毒/732
∣14.2.1 项目背景/733
∣14.2.2 判断是否恶意域名不能只靠域名/733
∣14.2.3 如何识别恶意域名/733
14.3 实例73:迎宾机器人的技术关注点——体验优先/734
∣14.3.1 迎宾机器人的产品背景/734
∣14.3.2 迎宾机器人的实现方案/734
∣14.3.3 迎宾机器人的同类产品/736
14.4 实例74:基于摄像头的路边停车场项目/737
∣14.4.1 项目背景/737
∣14.4.2 技术方案/738
∣14.4.3 方案缺陷/738
∣14.4.4 工程化补救方案/738
14.5 实例75:智能冰箱产品——硬件成本之痛/739
∣14.5.1 智能冰箱系列的产品背景/739
∣14.5.2 智能冰箱的技术基础/740
∣14.5.3 真实的非功能性需求——低成本/740
∣14.5.4 未来的技术趋势及应对策略/741