一图看懂tensorflow核心概念和流程


尝试tensorflow几个月了,对照着几本书一行代码一行代码的敲了一些案例,从刚开始一脸懵逼到现在基本上能够看懂完整的tensorflow样例代码,中间遇到了很多困惑和踩了很多坑,这个体验跟我从C++转换为Java完全不同。编程代码的切换,更多的时候是语法和API的切换,编程的逻辑思维没有变;但从写业务代码转为写tensorflow的机器学习代码,一切都变了,语法和API的变化是小事,关键是概念变了、逻辑变了,如果没有转换思维,很难理解tensorflow的机器学习具体应该怎么做,下面就是我总结的一些经验,希望让大家少走弯路。

废话不多说,先上一张图:

一图看懂tensorflow核心概念和流程

这张图是理解tensorflow概念和流程的关键,下面我们来具体解释一下。

【tensorflow流程】

要使用tensorflow来完成一项事情(例如分类、回归),整体上分为四个步骤:

1)准备训练数据(参考图中“训练数据”)

简单来说,tensorflow的思维和传统的编程思维不一样,传统的编程思维是按照逻辑一步一步实现功能,而tensorflow的编程思维是训练算法一步一步逼近精确,而训练的基础就是训练数据,也就是你的大数据集中的一个小样本数据。例如经典的数字识别,数据集可以是几百万几千万,训练数据集只要5000个数据就可以了。

很多的书籍和Demo都是使用tensorflow官方或者一些研究机构已经准备好的训练数据,这让很多初学者陷入了一个误区,以为训练数据的准备是很简单的,事实上我认为如果真的要在行业里面应用机器学习,训练数据的准备和标准化也许是最耗费时间和资金的。例如,如果我们要开发一个X光识别肺癌的机器学习算法,首先需要准备10万张肺部的X光片,然后由医生来标注每张X光片哪些地方可能是癌症的症状,最终确诊是不是真的是癌症。

2)定义算法(参考图中“算法定义”)

算法是机器学习的核心,重要性无需多言。

需要提醒的是,tensorflow对通用的算法的封装已经很完善,我们并不需要了解算法实现很细的细节,更加不需要自己去实现各种通用的算法,大部分情况下,只要了解通用算法的原理,然后简单调用API,完成我们自己的业务算法即可。例如常见的算法:

tf.sigmoid: sigmoid算法实现

tf.nn.softmax: softmax算法实现

tf.squared_difference:差平方

tf.train.GradientDescentOptimizer:梯度下降算法优化器

tf.nn.relu:relu算法

tf.tanh:双曲正切函数

tf.nn.conv2d:卷积层

tf.nn.max_pool:池化层

3)训练算法(参考图中“算法训练”)

前面提到而tensorflow的编程思维是训练算法一步一步逼达到精确,训练的核心就是“损失函数”和“优化器”,其中“损失函数”需要我们自己去实现,“优化器”只需要调用tensorflow提供的即可,如果是大神级别的,估计可以自己实现优化器。

4)算法应用(图中没有画出)

这一步是水到渠成的,算法训练OK后,直接应用即可,这部分不是关键,不详细展开。

以上步骤是环环相扣的:算法用到了训练数据,损失函数调用了算法,优化器调用了损失函数


下面介绍一下tensorflow的关键概念以及之间的联系:

1)输入:指训练数据集中的输入数据,tensorflow的数据对象是张量,因此输入数据也是张量;

2)结果:指训练数据集中和输入数据对应的结果数据,输入数据和结果数据的用途不同,下面会详细介绍,这两个数据都是我们要提前准备的。

3)算法(图中的“算法定义”):算法是需要我们自己根据业务来定义的,算法依赖两个常见的tensorflow概念,一个叫占位符,一个叫变量;算法可以是传统的机器学习算法,也可以是深度学习算法。

4)占位符:为何要多出占位符这个概念,我开始也理解了半天,其实这里的占位符就是和传统编程的函数参数类似,在定义函数的时候我们用参数来代表输入数据,在定义算法或者损失函数的时候我们用占位符来代表训练数据集中的数据,等到真正运行的时候再将训练数据替换占位符。

5)变量:tensorflow的变量和传统编程里面的变量用途差异很大,导致我理解花费了较长时间,后来才明白变量是tensorflow的核心概念,所谓的tensorflow训练,其实就是通过优化器来调整变量的值,使得算法更加精确;

6)损失函数(图中的“损失函数”):损失函数是tensorflow训练的核心,tensorflow通过优化器调整变量的值,使得算法更加精确,如何判断算法更加精确呢?其实就是通过损失函数来判断,损失函数输出值越小,算法就更加精确。

损失函数其实就是将算法结果(图中“算法结果”)和训练结果(图中的“结果”)进行对比,同算法一样,损失函数在定义的时候也用到了占位符,这个占位符代表的是训练数据集的结果数据。

看了吴恩达的课程,里面介绍算法的时候用了cost function(成本函数),我简单研究了一下,这个函数和损失函数是相关的,简单来说:损失函数是针对单个训练样本的,成本函数是针对所有训练样本的均值,我们只需要定义损失函数,我猜测优化器会基于损失函数来计算成本函数,更多请参考:机器学习中的目标函数、损失函数、代价函数有什么区别?