
本书从机器学习、图像处理的基本概念入手,逐步阐述深度学习图像处理技术的基本原理以及简单的实现。继而以几个实战案例来介绍如何使用深度学习方法,在数据分析竞赛中取得较高的排名。最后,通过一个实战案例,介绍如何将模型放入 iOS 程序,制作相应的人工智能手机App。
本书适用于对深度学习有兴趣、希望入门这一领域的理工科大学生、研究生,以及希望了解该领域基本原理的软件开发人员。此外,本书所有案例均提供了云环境上的代码,便于读者复现结果,并进行深入
学习。
前 言
回想2017年4月,当清华大学出版社的编辑找到杨培文和我,商量着写一本与深度学习相关的书时,我还是比较缺乏信心的。首先,自己本专业是基因组学,或者说是生物学,机器学习方面的知识都是自学的。其次,我根本就没有写过书,由我参与撰写,可能是班门弄斧,内容有误都是小事,万一写的内容给读者灌输了错误的观念、在大方向上误导了初学阶段的读者,实在是难辞其咎。
出版社方面同样了解我们的情况,跟我们说出版社这次想出一本面向非数学、计算机相关专业的书,希望语言更加通俗易懂,例子更贴近实际项目,让非专业出身的人看了以后,对机器学习、图像处理以及深度学习三者有一个最基本的认识。这里,我经常向生物、医学专业背景的人解释机器学习模型的原理,而培文则有多次数据分析竞赛名列前茅的经历,因此出版社希望我们两位尝试一下。
所以接下来编写书籍的过程中,我们的定位就是相比现在市面上主流的相关书籍,前几章写得更加通俗,把入门的门槛再降低一些;然后后面的章节基于参加数据分析竞赛的实战过程,把最终的目标再定高一些;最后我们的配套代码以及环境(http://github.com/Jinglue/DL4Img)要让初学者可以很容易地跑起来,把书籍的内容落在实际运用中。
我们希望这本书可以让非科班出身的读者快速了解深度学习的基本原理,将相关技术举一反三,运用在自己的课题、项目中。以我自己为例,在书籍编写完成后的审阅过程中,我仔细阅读了培文撰写的运用循环神经网络进行验证码识别这一章节(第10章)的内容,后来参加百度AI挑战赛时,最初的模型就是培文整理的配套代码,后来经过调整,最后取得了第二名的成绩。
最后一点,阅读本书,需要读者具有基本的Python编程基础,以及科学计算相关模块的了解。这部分内容本书并未涉及,但读者可以通过斯坦福大学cs228 相关配套入门习题进行简单的了解,我们对此进行了汉化(https://jizhi.ai/blog/post/cs228-py)。
在此感谢景略集智的王文凯、柯希阳在书籍编写过程中提供的帮助。
胡博强
2018年7月18日
目 录
第1章 搭建指定的开发环境1
1.1 为什么要使用指定的开发环境1
1.2 硬件准备2
1.2.1 在亚马逊租用云GPU服务器2
1.2.2 在腾讯云租用GPU服务器4
1.2.3 在云服务器中开启搭载开发环境的Docker服务8
1.3 软件准备9
1.3.1 在Ubuntu 16.04下配置环境9
1.3.2 在CentOS 7下配置环境12
1.4 参考文献及网页链接12
第2章 温故知新——机器学习基础知识13
2.1 人工智能、机器学习与深度学习13
2.2 训练一个传统的机器学习模型15
2.2.1 第一步,观察数据16
2.2.2 第二步,预览数据17
2.3 数据挖掘与训练模型29
2.3.1 第一步,准备数据29
2.3.2 第二步,挖掘数据特征31
2.3.3 第三步,使用模型37
2.3.4 第四步,代码实战44
2.4 参考文献及网页链接49
第3章 数形结合——图像处理基础知识50
3.1 读取图像文件进行基本操作51
3.1.1 使用python-opencv读取图片51
3.1.2 借助python-opencv进行不同编码格式的转换52
3.1.3 借助python-opencv改变图片尺寸53
3.2 用简单的矩阵操作处理图像53
3.2.1 对图像进行复制与粘贴53
3.2.2 把图像当成矩阵进行处理——二维码转换成矩阵54
3.3 使用OpenCV“抠图”——基于颜色通道以及形态特征59
3.4 基于传统特征的传统图像分类方法64
3.4.1 将图片简化为少数区域并计算每个区域轮廓特征的方向66
3.4.2 将HOG变换运用在所有正负样本中68
3.4.3 训练模型70
3.4.4 将训练好的分类器运用在新的图片中71
3.5 参考文献及网页链接73
第4章 继往开来——使用深度神经网络框架74
4.1 从逻辑回归说起74
4.2 深度学习框架76
4.3 基于反向传播算法的自动求导77
4.4 简单的深度神经网络框架实现80
4.4.1 数据结构部分81
4.4.2 计算图部分83
4.4.3 使用方法85
4.4.4 训练模型86
4.5 参考文献及网页链接89
第5章 排列组合——深度神经网络框架的模型元件90
5.1 常用层92
5.1.1 Dense92
5.1.2 Activation92
5.1.3 Dropout93
5.1.4 Flatten94
5.2 卷积层94
5.2.1 Conv2D94
5.2.2 Cropping2D101
5.2.3 ZeroPadding2D101
5.3 池化层102
5.3.1 MaxPooling2D102
5.3.2 AveragePooling2D102
5.3.3 GlobalAveragePooling2D103
5.4 正则化层与过拟合104
5.5 反卷积层105
5.6 循环层109
5.6.1 SimpleRNN109
5.6.2 LSTM109
5.6.3 GRU110
5.7 参考文献及网页链接110
第6章 少量多次——深度神经网络框架的输入处理112
6.1 批量生成训练数据113
6.2 数据增强115
6.3 参考文献及网页链接117
第7章 愚公移山——深度神经网络框架的模型训练118
7.1 随机梯度下降119
7.2 动量法120
7.3 自适应学习率算法121
7.4 实验案例124
7.5 参考文献及网页链接128
第8章 小试牛刀——使用深度神经网络进行CIFAR-10数据分类129
8.1 上游部分——基于生成器的批量生成输入模块131
8.2 核心部分——用各种零件搭建深度神经网络131
8.3 下游部分——使用凸优化模块训练模型132
8.4 参考文献及网页链接133
第9章 见多识广——使用迁移学习提升准确率134
9.1 猫狗大战1.0——使用卷积神经网络直接进行训练135
9.1.1 导入数据135
9.1.2 可视化137
9.1.3 分割训练集和验证集138
9.1.4 搭建模型140
9.1.5 模型训练141
9.1.6 总结142
9.2 猫狗大战2.0——使用ImageNet数据集预训练模型142
9.2.1 迁移学习142
9.2.2 数据预处理143
9.2.3 搭建模型143
9.2.4 模型可视化144
9.2.5 训练模型145
9.2.6 提交到kaggle评估146
9.3 猫狗大战3.0——使用多种预训练模型组合提升表现146
9.3.1 载入数据集147
9.3.2 使用正确的预处理函数147
9.3.3 搭建特征提取模型并导出特征147
9.3.4 搭建并训练全连接分类器模型148
9.3.5 在测试集上预测149
9.4 融合模型150
9.4.1 获取特征150
9.4.2 数据持久化151
9.4.3 构建模型151
9.4.4 在测试集上预测152
9.5 总结153
9.6 参考文献及网页链接154
第10章 看图识字——使用深度神经网络进行文字识别155
10.1 使用卷积神经网络进行端到端学习155
10.1.1 编写数据生成器157
10.1.2 使用生成器157
10.1.3 构建深度卷积神经网络158
10.1.4 模型可视化158
10.1.5 训练模型160
10.1.6 计算模型总体准确率161
10.1.7 测试模型161
10.1.8 模型总结162
10.2 使用循环神经网络改进模型162
10.2.1 CTC Loss163
10.2.2 模型结构164
10.2.3 模型可视化165
10.2.4 数据生成器167
10.2.5 评估模型168
10.2.6 评估回调169
10.2.7 训练模型169
10.2.8 测试模型171
10.2.9 再次评估模型171
10.2.10 总结173
10.3 识别四则混合运算验证码(初赛)173
10.3.1 问题描述174
10.3.2 数据集探索174
10.3.3 模型结构176
10.3.4 结果可视化181
10.3.5 总结182
10.4 识别四则混合运算验证码(决赛)183
10.4.1 问题描述183
10.4.2 数据集探索184
10.4.3 数据预处理186
10.4.4 模型结构192
10.4.5 生成器195
10.4.6 模型的训练197
10.4.7 预测结果198
10.4.8 模型结果融合199
10.4.9 其他尝试200
10.4.10 小结202
10.5 参考文献及网页链接203
第11章 见习医生——使用全卷积神经网络分割病理切片中的癌组织205
11.1 任务描述205
11.1.1 赛题设置205
11.1.2 数据描述206
11.1.3 数据标注206
11.2 总体思路206
11.3 构造模型207
11.3.1 准备数据208
11.3.2 构建模型214
11.3.3 模型优化217
11.4 程序执行225
11.5 模型结果可视化226
11.5.1 加载函数226
11.5.2 选择验证集并编写预测函数226
11.5.3 根据tensorborad可视化结果选择最好的模型228
11.5.4 尝试逐步降低学习率230
11.6 观察模型在验证集上的预测表现231
11.7 参考文献及网页链接234
第12章 知行合一——如何写一个深度学习App235
12.1 CAM可视化235
12.2 导出分类模型和CAM可视化模型236
12.2.1 载入数据集236
12.2.2 提取特征237
12.2.3 搭建和训练分类器237
12.2.4 搭建分类模型和CAM模型238
12.2.5 可视化测试239
12.2.6 保存模型241
12.2.7 导出mlmodel模型文件241
12.3 开始编写App242
12.3.1 创建工程242
12.3.2 配置工程244
12.3.3 测试工程249
12.3.4 运行程序249
12.4 使用深度学习模型250
12.4.1 将模型导入到工程中250
12.4.2 数据类型转换函数250
12.4.3 实施CAM可视化252
12.4.4 模型效果254
12.5 参考文献及网页链接255
本书以通俗易懂的语言简要讲解机器学习的核心概念,通过比较传统机器学习和深度神经网络的区别,引入深度神经网络的应用领域,将一个完整的深度神经网络的复杂结构拆成输入处理、模型元件以及模型优化三个子块,并详细说明如何将深度神经网络模型应用在移动端App制作中。
基于理论讲解,由浅入深地引出若干个经典案例,讲解当前深度神经网络在图像处理领域的应用。
本书同时提供了基于云GPU容器(Docker)的完整在线开发环境,方便初学者直接学习核心代码。
杨培文,北京工商大学,优达学城机器学习课程毕业项目的评审。目前研究方向是深度学习在图像方面的应用,同时致力于机器学习、深度学习和无人车等方面知识的普及与教育。在 kaggle 猫狗大战项目中达到 top1.2%。