Press "Enter" to skip to content

「动手学习Tensorflow」- Tensorflow综述I

“  一文概览Tensorflow方方面面。 ”

 

 

大家好,我是人工智能工程师Alpha浪。

 

今天,我们开始「动手学习Tensorflow – Tensorflow 综述」部分。

 

快速学习一门新技术的最好方法之一,就是首先对这门技术有着全局的认识,然后在深入了解每一部分的细节。

 

综述就是最好的给你全局认识的读物。

 

关注公众号“ AI工程师成长之路 ”, 回复” Tensorflow知多少 “, 获取最新最全的自制tensorflow综述PPT。

 

01

 

 

什幺是Tensorflow

 

Tensorflow 是Google在2015年发布的一个端到端开源机器学习平台。

 

它的前身是Google内部从2011年开始使用的Disbelief。

 

 

那幺为什幺叫做 Tensorflow 呢?

 

Tensor 表示多维数组,Flow表示流动,从字面上来看Tensorflow的意思为多维数组在流动。

 

Tensorflow将数值计算表达为一个计算图,图中的节点为算子,图中的边为多维数组。

 

 

一次数值计算由对应的多维数组 (Tensor) 流过相应的算子 (Operator)而表达,即Tensor 在Flow,所以叫做Tensorflow。

 

 

02

 

 

Why Tensorflow

 

为什幺我们要选择使用Tensorflow呢?

 

Tensorflow 由Google出品,Google家开源的工具一般都还不错 (Google 大法好)。

 

Tensorflow有着强大的社区和生态,在工业界有着广泛的成功案例。Tensorflow从2015年发布到2020年,已经是一项很成熟的技术方案了,部署在线上的Tensorflow,已经经历过了数次双十一流量高峰检验。

 

 

Tensorflow支持多种语言,C++, Python, java,javascript,swift etc。Java在国内是很多科技公司的线上编程语言,支持Java的tensorflow比那些只支持c++和python的库要能打的很多。

 

Tensorflow支持分布式训练和部署。

 

更多选择Tensorflow的理由,我们在上一篇 深度学习框架纷争也有提及。

 

Tensorflow从2015年开源到现在,已经发布了104个版本,从单纯的机器学习算法开发包,已经发展到一个巨大的生态系统,成为了一个端到端的机器学习平台。

 

如今的Tensorflow包含以下四个部分:

 

Tensorflow核心开源库

 

Tensorflow.js

 

针对移动设备和IOT设备的Tensorflow Lite

 

针对成产环境的Tfx和Tensorflow Serving

 

Tensorflow核心库

 

Tensorflow核心库是我们最常用的部分了,通过它,我们可以轻松构建机器学习模型。

 

通常来讲,我们都是使用Tensorflow 核心库的python api进行模型的编写。

 

在下一篇文章中,我们会介绍Tensorflow入门实战,本 篇 先介绍Tensorflow核心库的一些基础以及概念。

 

Tensorflow中的两种模式

 

Tensorflow中存在两种模式。

 

在Tensorflow2.X之后,默认是eager execution模式,即动态图模式。

 

动态图模式,在执行计算的同时构建计算图,可以像获取python中的变量值一样获取Tensor中的值,编写模型和调试起来非常方便。

 

在Tensorflow1.x的版本中,默认是非eager execution模式,即静态图模式。

 

静态图模式,首先进行计算图的构建,然后在该计算图上才执行多次计算来进行模型的训练和评估。

 

Tensor值不能在它定义的时候获取的到,只有在真正计算的时候才能从session中获取,调试起来非常麻烦,被很多人吐槽。

 

动态图模式非常适合线下编写调试模型;静态图模式则比较适合线上的场景,一次构建好计算图,然后在这个计算图上执行计算,比边构建图边计算工程效率要高很多。

 

Tensorflow三种实现模型的方式

 

在Tensorflow中,我们可以有三种实现模型的方式。

 

在早期的Tensorflow1.x版本中,大家都是通过low-level api,直接使用graph和session来编写模型。

 

在后来的Tensorflow1.x版本中,则是推荐使用Estimator来编写模型。

 

在如今的Tensorflow2.x版本中,官方推荐使用Keras api来编写模型。

 

Tensorflow编程模型中的一些基本概念

 

Tensorflow中,我们会遇到以下概念:Tensor,Variable,Placeholder和 Operator。

 

广义上说,Tensorflow中变量分为两种类型,Tensor和Operator,其中,Tensor表示多维数组,包括了像Variable和Placeholder这样的specific tensor。Operator表示算子,例如相加,相乘等。

 

例如,我们想执行下图中的一个简单的relu模型。

 

参数W和b我们会定义成Variable,一般模型的参数都会定义成Variable类型的Tensor。

 

输入变量X会定义成Placeholder,Placeholder是我们要fed进计算图的那部分tensor,例如输入和label。

 

而像Add,MatMul和RELU则是算子,对输入的Tensor值进行相关计算。

 

 

Tensorflow中模型的三种存储格式

 

Tensorflow中模型可以有三种存储格式,分别是check point,saved model以及frozen graph格式。

 

Check point模型可能是我们接触最多的模型格式了,我们在Tensorflow中直接模型存储的方式就是以check point的格式来存储。

 

Check point将全部学到的Variable tensor值进行保存,但是不保存模型结构,因此只有在模型source code存在的时候才能对check point格式的模型进行加载。

 

Saved model是Tensorflow Serving加载的模型格式。除了保存变量Variable的值之外,它还保存模型的结构,因此没有模型的Source code也能对saved model进行加载。

 

Saved model格式常用在线上部署,例如通过Tensorflow serving来部署,或者通过tensorflow c++或者java api来进行模型的inference。

 

Frozen Graph格式目前在Tensorflow官方文档中已经看不到了,但是它在业界还是有一定的应用场景的。

 

Frozen Graph根据模型的输入和输出,只保留在infercne阶段和它们相关联的计算图中的节点和边,进而可以去除掉在Inference阶段用不到的tensor和operator,使得模型更小。

 

Tensorflow Dataset

 

Tensorflow Dataset是用来构建模型输入pipeline的。

 

例如,我们通过Tensorflow Dataset来设定batch size的大小以及迭代的epoch轮数。

 

Tensorflow Dataset是Estimator和Keras Model的输入格式。

 

Tensorboard

 

Tensorboard 是Tensorflow中提供的可视化工具。

 

它不仅可以可视化模型试验过程中模型的metrics,如accuracy,loss等;它还可以可视化计算图中的节点和边;同时它还可以可视化图片,可视化降维后embedding的低维空间等。

 

值得提的一点是,不仅Tensorflow可以使用Tensorboard进行可视化,像Pytorch等也可以使用它做可视化。

 

 

TfDebug

 

TfDebug还是Tensorflow1.x版本中的一个工具,现在在Tensorflow 2.x的文档中中已经没有了它的身影。

 

在Tensorflow1.x静态图模式下,只有在计算图真正执行的时候才能获取Tensor的值,而不能在Tensor定义的地方获取它的值。

 

那是一段痛苦的记忆,那个时候只有通过Tfdebug这个工具,才能进行debug,既麻烦低效又痛苦。

 

现在Tensorflow2.x版本中,默认是动态图方式,debug非常方便,TfDebug也就再也用不到了^_^ 。

 

Tensorflow中GPU的使用

 

在这里要提一个在Tensorflow中使用GPU的好习惯。

 

Tensorflow默认会对GPU卡全部占用,即使是执行很少的运算。而如果这块卡被一个人全部占用,那幺其他人就得不到使用。

 

因此在使用gpu的时候,一定要进行以下设置:

 

 

 

可以使用tf.test.is_gpu_avaibalbe() 来查看当前gpu是否可用,如果不可用,要检查下是否是gpu驱动没有安装,以及是否没有安装Tensorflow-gpu。

 

可以使用  os.environ[‘CUDA_VISIBLE_DEVICES’] = 0,1 来进行gpu卡的选择。

 

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注