1.5 TensorFlow开发流程
在成功安装库TensorFlow之后,接下来就可以使用它编写机器学习程序。在使用TensorFlow编写程序之前,需要先了解使用TensorFlow实现机器学习的基本流程。对于绝大多数机器学习应用来说,使用TensorFlow实现机器学习的基本流程如下:
(1)准备数据集
(2)构建模型
(3)训练模型
(4)验证模型
在接下来的内容中,将详细讲解上述各个流程的详细知识。
1.5.1 准备数据集
数据集,又称为资料集、数据集合或资料集合,是一种由数据所组成的集合。数据集通常用英文单词Data set(或dataset)表示,是一个数据的集合,通常以表格形式出现。每一列代表一个特定变量。每一行都对应于某一成员的数据集的问题。它列出的价值观为每一个变量,如身高和体重的一个物体或价值的随机数。每个数值被称为数据资料。对应于行数,该数据集的数据可能包括一个或多个成员。
机器学习需要大量的数据来训练模型,尤其是训练神经网络。在进行机器学习时,数据集一般会被划分为训练集和测试集,很多时候还会进一步划分出验证集(个别人称之为开发集)。但是很多新手,尤其是刚刚接触到机器学习的读者,往往对数据集的划分没有概念,甚至有的人把训练后得到的模型在训练数据上取得的正确率当做是实际正确率,这是不对的。
1. 数据集的划分
在现实应用中,一般有三种划分数据集的方法,具体说明如下:
(1)方法1:按一定比例划分为训练集和测试集
这种方法也称为保留法,我们通常取8-2、7-3、6-4、5-5比例切分,直接将数据随机划分为训练集和测试集,然后使用训练集来生成模型,再用测试集来测试模型的正确率和误差,以验证模型的有效性。
方法一常见于决策树、朴素贝叶斯分类器、线性回归和逻辑回归等任务中。
(2)方法2:交叉验证法
交叉验证一般采用k折交叉验证,即k-fold cross validation,往往k取为10。在这种数据集划分法中,我们将数据集划分为k个子集,每个子集均做一次测试集,每次将其余的作为训练集。在交叉验证时,我们重复训练k次,每次选择一个子集作为测试集,并将k次的平均交叉验证的正确率作为最终的结果。
(3)训练集、验证集、测试集法
我们首先将数据集划分为训练集和测试集,由于模型的构建过程中也需要检验模型,检验模型的配置,以及训练程度,过拟合还是欠拟合,所以会将训练数据再划分为两个部分,一部分是用于训练的训练集,另一部分是进行检验的验证集。验证集可以重复使用,主要是用来辅助我们构建模型的。
训练集用于训练得到神经网络模型,然后用验证集验证模型的有效性,挑选获得最佳效果的模型,直到我们得到一个满意的模型为止。最后,当模型“通过”验证集之后,我们再使用测试集测试模型的最终效果,评估模型的准确率,以及误差等。测试集只在模型检验时使用,绝对不能根据测试集上的结果来调整网络参数配置,以及选择训练好的模型,否则会导致模型在测试集上过拟合。
一般来说,最终的正确率,训练集大于验证集,验证集大于测试集。对于部分机器学习任务,我们划分的测试集必须是模型从未见过的数据,比如语音识别中一个完全不同的人的说话声,图像识别中一个完全不同的识别个体。这时,一般来说,训练集和验证集的数据分布是同分布的,而测试集的数据分布与前两者会略有不同。在这种情况下,通常,测试集的正确率会比验证集的正确率低得多,这样就可以看出模型的泛化能力,可以预测出实际应用中的真实效果。
这种方法是深度学习中经常使用的方法,因为效果相比前面的更好。该方法之所以会更好,原因是它暴露给测试集的信息更少。只是,我们有时候会控制不住自己,不断地对着测试集调参,会使其逐渐失去效果,导致模型在测试集上出现过拟合。不过测试集上正确率越高,往往实际中应用效果也越好,即使此时测试集也参与了调参。
2. 数据集的来源
在机器学习开发过程中,我们既可以制作自己的数据集,也可以使用第三方数据集。
(1)使用第三方数据集
在现实应用中,很多企业、组织和个人制作了大量的数据。例如在TensorFlow官方教程中用到了MNIST数据集,这便是一个第三方数据集。MNIST是一个非常经典的数据集,是美国邮政系统开发的一个开源数据集。对于刚刚开始学习机器学习的读者来说,首先需要学会使用别人提供的数据集。MNIST数据集由四部分组成,分别是:
- train-images-idx2-ubyte.gz:训练图片集,大小是9912422 bytes;
- train-labels-idx1-ubyte.gz:训练标签集,大小是28881 bytes;
- t10k-images-idx2-ubyte.gz:测试图片集,大小是1648877 bytes;
- t10k-labels-idx1-ubyte.gz:测试标签集,大小是4542 bytes。
MNIST数据集是一个手写体数据集,简单来说就是如图1-15所示的这些东西。
我们登录MNIST官方网站下载数据集,下载到本地后的效果如图1-16所示。可以看出这个其实并不是普通的文本文件或是图片文件,而是一个压缩文件,下载并解压出来,我们看到的是二进制文件,其中训练图片集的内容部分如此,如图1-17所示。MNIST训练集有60000个用例,也就是说在这个文件里面包含了60000个标签内容,每一个标签的值为0到9之间的一个数。
图1-17 解压后发现是二进制文件
除了MNIST数据集外,还有很多机构和组织推出了数据集,比较常用的有如下几个:
- 加州大学欧文机器学习资源库
加州大学欧文机器学习资源库目前维护了559个数据集,我们可以通过搜索界面快速查看所有数据集。在使用这些数据集之前,建议阅读其官方的引文政策。
- Open Images数据集
该数据集的大小高达500 GB(压缩后),是一个包含近900万个图像URL的数据集,这些图像跨越了数千个类的图像级标签边框并且进行了注释。该数据集包含9,011,219张图像的训练集,41,260张图像的验证集以及125,436张图像的测试集。
- IMDB评论数据集
这是电影爱好者的梦幻数据集,它意味着二元情感分类,并具有比此领域以前的任何数据集更多的数据。除了训练和测试评估示例之外,还有更多未标记的数据供你使用。原始文本和预处理的单词格式包也包括在内。
- 格物钛数据集
格物钛(上海)智能科技有限公司是一家AI初创型科技公司。提供针对非结构化数据存储、标注、模型训练和管理预测的一站式AI服务平台产品。在格物钛官方网站中收集了市面中常见的第三方数据集,包括国内和国外的,开发者可以下载并使用这些数据集进行学习。
(2)自己制作数据集
我们可以从现实世界中得到大量的图片,例如用手机拍照,拍了上千、上万张照片,然后我们给每一张照片起一个文件名。接下来就可以讲这些照片制作成数据集,每个文件名可以作为数据集中的标签。我们也可以使用网络爬虫技术获取很多照片信息和文字信息,例如某商城中所有商品的价格信息和销量信息,我们基于爬虫得到的文字数据,也可以制作出自己的数据集。在制作数据集时经常用到CV2、PIL和numpy等Python库。
1.5.2 构建模型
在机器学习中,“模型”是运行在数据上的机器学习算法的输出。模型是在训练数据上运行机器学习算法后保存的“东西”,它表示用于进行预测所需的规则、数字和任何其他特定于算法的数据结构。
1. 算法和模型的关系
在机器学习中,“算法”是在数据上运行以创建机器学习“模型”的过程。机器学习算法执行“模式识别”。算法从数据中“学习”,或者对数据集进行“拟合”。机器学习的算法有很多,比如:
- 分类算法:如K- 近邻算法;
- 回归的算法:如线性回归;
- 聚类的算法:如 K- 均值算法。
我们可以把机器学习算法想象成计算机科学中的任何其他算法。例如,你可能熟悉的一些其他类型的算法包括用于数据排序的冒泡排序和用于搜索的最佳优先排序。接下来我举一些例子,可以让大家清楚地明白这一点:
- 线性回归算法的结果是一个由具有特定值的稀疏向量组成的模型。
- 决策树算法的结果是一个由具有特定值的 if-then 语句树组成的模型。
- 神经网络/反向传播/梯度下降算法一起产生一个由具有特定值的向量或权重矩阵和特定值的图结构组成的模型。
在机器学习中,模型对于初学者来说更具挑战性,因为它与计算机科学中的其他算法没有明确的类比。最好的类比是将机器学习模型想象成一个“程序”。
机器学习模型“程序”由数据和利用数据进行预测的过程组成。例如,考虑线性回归算法和由此产生的模型。该模型由系数(数据)向量组成,这些系数(数据)与作为输入的一行新数据相乘并求和,以便进行预测(预测过程)。我们将数据保存为机器学习模型,以备后用。
我们经常使用机器学习库提供的机器学习模型的预测过程。有时候,我们可以自己实现预测过程作为我们应用程序的一部分。考虑到大多数预测过程都非常简单,这通常都是直截了当的。因为模型由数据和如何使用数据对新数据进行预测的过程组成,所以我们也可以将这一过程视为一种预测算法:
机器学习模型 == 模型数据 + 预测算法
这种区分对于理解广泛的算法非常有帮助。例如,大多数算法的所有工作都在“算法”中,而“预测算法”的工作很少。在通常情况下,算法是某种优化程序,即在训练数据集上使模型(数据 + 预测算法)的误差最小化。线性回归算法就是一个很好的例子。它执行一个优化过程(或用线性代数进行分析求解),找到一组权重,使训练数据集上的误差之和平方最小化。
2. 构建预测模型
构建模型是在实际进行一个项目之前要进行的工作,相当于设计,要针对用户需求设计合适的预测模型和优化模型。当我们把机器学习运用到实际的工作中时,是期望机器可以具有一些人才有的智能。简单的说,输入是一个集合,输出也是一个集合,我们要建立输入集合与输出集合之间的关系模型,使系统接受到一个输入之后,可以经过这个关系模型的计算,映射到输出集合上的一个点。
而把输入和输出关联起来的这个关系模型,就是我们要创建的预测模型。这个模型可以很简单,比如,下面的公式就是建立了一个预测模型:
y=W*x+b
上述公式就是一个线性模型,当然也可以是比较复杂的模型。比如我们常用的包含多个隐藏层的卷积神经网络模型,都是建立起了输入与输出之间的一个关系,让我们接受到一个新的输入时,可以根据输入算出一个输出。
3. 构建优化模型
在构建出预测模型之后,其实这个模型什么事也干不了,只是随便写的一个表示输出与输入关系的函数。但是在初始情况下,他并不能很好的完成这个任务。下面我们要做的事情就是用正确的数据带入这个函数,求出函数的参数,比如上面公式中的W和b。因为每一对正确的数据带进去都会得到一个参数,那么到底我们选择哪一个呢,这就是我们要构建的优化模型,也就是我们常说的损失函数,用一种在数学上可计算的方式,去逼近我们理想中的那个参数。比如:
cross_entropy = -tf.reduce_sum(y * tf.log(y_fc2))
这样一个损失函数,函数的值cross_entropy 越小,就代表预测模型越好。那么我们就把问题转化为让损失函数趋于最小值的问题。这里我们常用的方法是梯度下降法,高等数学的理论告诉我们:
- 一个函数f(x,y)的对某个参数x的偏导数可以反应该函数在向量x附近的变化速度。
- 导函数的值为正代表函数递增,为负代表函数递减。
因此,这里我们只要使用链式法则,用cross_entropy 对每一层的权重参数w求偏导数,就可以得到权重参数的变化率,然后再用该参数的当前值减去(学习速度*偏导数的值),就可以完成权重参数的微调(减去,表示使导函数为负)。
这就是优化模型的训练原理,这里我们只要设计得出这个损失函数就行了。TensorFlow的直译含义是“张量流”,就是通过使张量在图中流动的方式来计算。使用库TensorFlow构建模型过程,就是构建这个图的过程。
1.5.3 训练模型
训练模型就是要使数据在构建的图中跑起来。我们可以把机器想象成一个小婴儿,你正带这个婴儿在公园里晒太阳,公园里有很多人在遛狗。你可以告诉婴儿这个动物是狗,那个也是狗。但突然一只猫跑过来,你告诉他,这个不是狗。久而久之,小孩就会产生认知模式。这个学习过程就叫“训练”,所形成的认知模式就是“模型”。
1.5.4 验证模型
模型验证是指测定标定后的交通模型对未来数据的预测能力(即可信程度)的过程。通俗一点讲,验证模型就是验证我们前面制作的模型的准确率。继续用钱买在公园教导小婴儿识别动物的例子,假设在经过一段时间的训练后,小婴儿就会产生认知模式。这时,再跑过来一个动物时,你问小孩,这个是狗吧?他会回答是或者否。这个测试小婴儿识别动物的过程,实际上就是一个验证模型。所谓的验证,就是验证我们的训练结果。