
本书通过案例讲解如何使用TensorFlow 解决深度学习的实际任务, 每章都包含TensorFlow 1.x 和2.0 的代码实现。全书共分10 章,主要讲解卷积神经网络、LSTM、Seq2Seq、Transformer、BERT、文本卷积、GBDT、FM、FFM、Dlib、MTCNN、VGG、AlphaGo / AlphaZero、BiLSTM、DQN、Gym、GAN 等技术,包含的项目有CIFAR-100 图像分类、彩票预测、古诗生成、推荐系统、广告点击率预测、人脸识别、中国象棋、汉字OCR、FlappyBird 和超级马里奥、人脸生成。
前言 在过去的几年中,人工智能和深度学习是一个不断被提及的话题,最令大众熟知的恐怕就是 AlphaGo 与柯洁、李世乭的围棋大战了。而最近,人工智能OpenAI Five 在DOTA 2 的比赛中击败 了世界冠军OG,人工智能的发展总会给人带来惊喜。除了上述“大事件”,人工智能和深度学习 早就深入我们的生活当中,比如无人驾驶汽车、人脸识别,或者订外卖时App 给我们做的推荐。 在经历了互联网、移动互联网的浪潮之后,可以说现在我们已经步入了人工智能的时代。 我第一次接触机器学习和深度学习时就被深深地吸引了,感觉自己就像一块海绵被投入到大 海里,看书、看视频、看源码,学习新的知识使我感到非常兴奋。相信此刻的你也跟当年学习的 我的状态是一样的吧,本书将我对深度学习的理解、从开源社区学到的知识分享给大家,希望能 为你的学习提供一些帮助。 本书以案例的形式,讲解各种深度学习理论和相应场景的实践,包含TensorFlow 1.x 和TensorFlow 2.0 的代码实现。全书共分10 章。第1 章讲解了卷积神经网络理论知识,第2 章讲解了如 何进行CIFAR-100 图像分类实践。第3 章介绍了循环神经网络(RNN 和LSTM),以及在彩票预 测和古诗生成上的实践。在第3 章的最后,介绍了Seq2Seq、Transformer 和BERT 模型。第4 章 以电影推荐系统为例,分享了推荐系统的实现。第5 章介绍了广告点击率预测。第6 章讲解了人 脸识别的实践,包含使用OpenCV、dlib 和MTCNN 进行人脸检测,使用dlib、FaceNet 和VGG16 等方式提取人脸特征,然后讨论了比较人脸特征的几种方式。最后,使用上述技术实现了一个在 视频中找人的应用。第7 章分析了AlphaGo 和AlphaZero 的论文原文,讲解了蒙特卡罗树搜索 (MCTS)和神经网络的结构,并且通过实现中国象棋复现了AlphaZero。第8 章介绍了OCR 在 汉字识别上的应用,并且讲解了BiLSTM 的多种类型,最后实现了一个端到端的汉字识别网络。 第9 章介绍了DQN 算法,用于玩Flappy Bird。然后介绍了OpenAI Baselines 和Gym 的用法,并 用于玩“超级马里奥”。最后介绍了OpenAI 提出的具有好奇心的强化学习算法。第10 章讲解了 生成对抗网络(GAN)及衍生的变种DCGAN、WGAN 和WGAN-GP 算法,用于人脸生成的实 践。最后介绍了PG-GAN 和TL-GAN 的理论。 限于篇幅,以及作者能力有限,书中难免有错漏之处,本书仅仅是将作者掌握的知识做了总 结与分享。当然,这些知识不属于我个人,首先要感谢那些工作在人工智能第一线的科学家们, 是他们将研究成果公布出来,让大家可以阅读论文和博客。更要感谢开源社区的贡献者们,使我 们可以阅读源码参考学习。还要感谢同样喜欢技术分享的人们,我所能做的跟他们一样,就是将 分享的“火炬”继续传递下去。书中在引用时都会给出引用的出处,在这里一并表示感谢。 写作本书的过程,是对自己所学知识的一次梳理,回过头来重新审视自己对某些知识的理 解,又是一次成长。同时,写作的过程又是孤独的、寂寞的,有时觉得自己就像在山洞里练剑一 样。感谢我的妻子对我的理解和支持,在写作期间,她在国内带着孩子,听从了我“在交稿前不 要来打扰”的安排。最要感谢的是我的妈妈,是她培养了我学习与钻研的习惯。最后还要感谢电 子工业出版社的郑柳洁和葛娜老师,她们对本书的出版和编辑提供了很多专业性的指导和帮助, 没有她们的付出,本书无法与大家见面。 希望本书的内容能够为你提供帮助,权当抛砖引玉,为你的深度学习知识打下基础。 程世东 2019 年4 月于日本
目录 1 卷积神经网络与环境搭建1 1.1 概述 1 1.2 卷积神经网络 2 1.2.1 卷积层 3 1.2.2 修正线性单元. 6 1.2.3 池化层 8 1.2.4 全连接层 8 1.2.5 softmax 层 9 1.2.6 LeNet-5 网络 9 1.3 准备开发环境 10 1.3.1 Anaconda 环境搭建 10 1.3.2 安装TensorFlow 1.x 11 1.3.3 FloydHub 使用介绍 13 1.3.4 AWS 使用介绍 18 1.4 本章小结 26 2 卷积神经网络实践:图像分类27 2.1 概述 27 2.2 卷积神经网络项目实践:基于TensorFlow 1.x 27 2.2.1 数据预处理. 28 2.2.2 网络模型 33 2.2.3 训练网络 39 2.3 卷积神经网络项目实践:基于TensorFlow 2.0 41 2.3.1 TensorFlow 2.0 介绍 41 2.3.2 CIFAR-100 分类网络的TensorFlow 2.0 实现 44 2.4 本章小结. 60 3 彩票预测和生成古诗61 3.1 概述 61 3.2 RNN 61 3.3 LSTM 63 3.4 嵌入矩阵. . 66 3.5 实现彩票预测 69 3.5.1 数据预处理. 70 3.5.2 构建神经网络. 71 3.5.3 训练神经网络 75 3.5.4 分析网络训练情况 83 3.5.5 生成预测号码. 88 3.6 文本生成. 93 3.7 生成古诗:基于TensorFlow 2.0 96 3.7.1 数据预处理 96 3.7.2 构建网络 99 3.7.3 开始训练. 102 3.7.4 生成古诗 102 3.8 自然语言处理 106 3.8.1 序列到序列 106 3.8.2 Transformer . 108 3.8.3 BERT 112 3.9 本章小结 118 4 个性化推荐系统119 4.1 概述 . 119 4.2 MovieLens 1M 数据集分析. 120 4.2.1 下载数据集 . 120 4.2.2 用户数据. 120 4.2.3 电影数据. 122 4.2.4 评分数据. 123 4.3 数据预处理. 123 4.3.1 代码实现. . 124 4.3.2 加载数据并保存到本地 . 127 4.3.3 从本地读取数据 128 4.4 神经网络模型设计 128 4.5 文本卷积神经网络 130 4.6 实现电影推荐:基于TensorFlow 1.x 131 4.6.1 构建计算图 131 4.6.2 训练网络 139 4.6.3 实现个性化推荐 144 4.7 实现电影推荐:基于TensorFlow 2.0 154 4.7.1 构建模型 154 4.7.2 训练网络 166 4.7.3 实现个性化推荐 166 4.8 本章小结 169 5 广告点击率预估:Kaggle 实战170 5.1 概述 . 170 5.2 下载数据集. . 170 5.3 数据字段的含义 . 171 5.4 点击率预估的实现思路 172 5.4.1 梯度提升决策树. 172 5.4.2 因子分解机. . 172 5.4.3 场感知分解机 . 174 5.4.4 网络模型 175 5.5 数据预处理. 176 5.5.1 GBDT 的输入数据处理. 177 5.5.2 FFM 的输入数据处理. 177 5.5.3 DNN 的输入数据处理 179 5.5.4 数据预处理的实现. 180 5.6 训练FFM 188 5.7 训练GBDT . 197 5.8 用LightGBM 的输出生成FM 数据. 203 5.9 训练FM . 207 5.10 实现点击率预估:基于TensorFlow 1.x . 218 5.10.1 构建神经网络 219 5.10.2 训练网络 . 225 5.10.3 点击率预估 . 231 5.11 实现点击率预估:基于TensorFlow 2.0 . 237 5.12 本章小结 . 245 6 人脸识别246 6.1 概述. . . . 246 6.2 人脸检测. 247 6.2.1 OpenCV 人脸检测 . 247 6.2.2 dlib 人脸检测 251 6.2.3 MTCNN 人脸检测 254 6.3 提取人脸特征. 264 6.3.1 使用FaceNet 提取人脸特征 . 264 6.3.2 使用VGG 网络提取人脸特征 265 6.3.3 使用dlib 提取人脸特征. 272 6.4 人脸特征的比较. . 276 6.5 从视频中找人的实现. 282 6.6 视频找人的案例实践. . 284 6.7 人脸识别:基于TensorFlow 2.0 . . 302 6.8 本章小结. . 303 7 AlphaZero / AlphaGo 实践:中国象棋304 7.1 概述. . . 304 7.2 论文解析 . . 305 7.2.1 蒙特卡罗树搜索算法. 307 7.2.2 神经网络. 312 7.2.3 AlphaZero 论文解析. 314 7.3 实现中国象棋:基于TensorFlow 1.x . 317 7.3.1 中国象棋着法表示和FEN 格式. 317 7.3.2 输入特征的设计 321 7.3.3 实现神经网络. 323 7.3.4 神经网络训练和预测. 327 7.3.5 通过自我对弈训练神经网络 330 7.3.6 自我对弈 334 7.3.7 实现蒙特卡罗树搜索:异步方式. 340 7.3.8 训练和运行 353 7.4 实现中国象棋:基于TensorFlow 2.0,多GPU 版. 354 7.5 本章小结 364 8 汉字OCR 365 8.1 概述. 365 8.2 分类网络实现汉字OCR 365 8.2.1 图片矫正 366 8.2.2 文本切割. 368 8.2.3 汉字分类网络. 369 8.3 端到端的汉字OCR:基于TensorFlow 1.x . 371 8.3.1 CNN 设计 372 8.3.2 双向LSTM 设计. . 374 8.3.3 CTC 损失 385 8.3.4 端到端汉字OCR 的网络训练. 388 8.4 汉字OCR:基于TensorFlow 2.0 395 8.4.1 CNN 的实现. 395 8.4.2 双向LSTM 的实现. 396 8.4.3 OCR 网络的训练. 403 8.5 本章小结. 406 9 强化学习:玩转Flappy Bird 和超级马里奥407 9.1 概述. 407 9.2 DQN 算法. 407 9.3 实现DQN 玩Flappy Bird:基于TensorFlow 1.x . 412 9.4 实现DQN 玩Flappy Bird:基于TensorFlow 2.0 . 417 9.5 使用OpenAI Baselines 玩超级马里奥. . 424 9.5.1 Gym . 424 9.5.2 自定义Gym 环境. . 426 9.5.3 使用Baselines 训练. . 431 9.5.4 使用训练好的智能体玩游戏. . 437 9.5.5 开始训练马里奥游戏智能体. . 438 9.6 具有好奇心的强化学习算法. 443 9.7 本章小结. . 444 10 生成对抗网络实践:人脸生成445 10.1 概述 . 445 10.2 GAN . 446 10.3 DCGAN . 447 10.3.1 生成器. . 448 10.3.2 判别器. 449 10.4 WGAN 449 10.5 WGAN-GP . 451 10.5.1 WGAN-GP 算法. 451 10.5.2 训练WGAN-GP 生成人脸:基于TensorFlow 1.x . 452 10.5.3 训练WGAN-GP 生成人脸:基于TensorFlow 2.0 . . 462 10.6 PG-GAN 和TL-GAN . . 469 10.7 本章小结. . 473