Tensorflow从入门到精通之——Tensorflow基本操做

前边的章节介绍了什么是Tensorflow,本节将带你们真正走进Tensorflow的世界,学习Tensorflow一些基本的操做及使用方法。同时也欢迎你们关注咱们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习、深度学习的知识!

Tensorflow是一种计算图模型,即用图的形式来表示运算过程的一种模型。Tensorflow程序通常分为图的构建和图的执行两个阶段。图的构建阶段也称为图的定义阶段,该过程会在图模型中定义所需的运算,每次运算的的结果以及原始的输入数据均可称为一个节点(operation ,缩写为op)。咱们经过如下程序来讲明图的构建过程:python

程序2-1:编程

程序2-1定义了图的构建过程,“import tensorflow as tf”,是在python中导入tensorflow模块,并另起名为“tf”;接着定义了两个常量op,m1和m2,均为1*2的矩阵;最后将m1和m2的值做为输入建立一个矩阵加法op,并输出最后的结果result。api

咱们分析最终的输出结果可知,其并无输出矩阵相加的结果,而是输出了一个包含三个属性的Tensor(Tensor的概念咱们会在下一节中详细讲解,这里就再也不赘述)。数组

以上过程即是图模型的构建阶段:只在图中定义所须要的运算,而没有去执行运算。咱们能够用图2-1来表示:session


图2-1 图的构建阶段数据结构


第二个阶段为图的执行阶段,也就是在会话(session)中执行图模型中定义好的运算。

咱们经过程序2-2来解释图的执行阶段:dom

程序2-2:机器学习

 

程序2-2描述了图的执行过程,首先经过“tf.session()”启动默认图模型,再调用run()方法启动、运行图模型,传入上述参数result,执行矩阵的加法,并打印出相加的结果,最后在任务完成时,要记得调用close()方法,关闭会话。分布式

除了上述的session写法外,咱们更建议你们,把session写成如程序2-4所示“with”代码块的形式,这样就无需显示的调用close释放资源,而是自动地关闭会话。ide

程序2-3:

此外,咱们还能够利用CPU或GPU等计算资源分布式执行图的运算过程。通常咱们无需显示的指定计算资源,Tensorflow能够自动地进行识别,若是检测到咱们的GPU环境,会优先的利用GPU环境执行咱们的程序。但若是咱们的计算机中有多于一个可用的GPU,这就须要咱们手动的指派GPU去执行特定的op。以下程序2-4所示,Tensorflow中使用with...device语句来指定GPU或CPU资源执行操做。

程序2-4:

 

上述程序中的“tf.device(“/gpu:2”)”是指定了第二个GPU资源来运行下面的op。依次类推,咱们还能够经过“/gpu:3”、“/gpu:4”、“/gpu:5”...来指定第N个GPU执行操做。

关于GPU的具体使用方法,咱们会在下面的章节结合案例的形式具体描述。

Tensorflow中还提供了默认会话的机制,如程序2-5所示,咱们经过调用函数as_default()生成默认会话。

程序2-5:

咱们能够看到程序2-5和程序2-2有相同的输出结果。咱们在启动默认会话后,能够经过调用eval()函数,直接输出变量的内容。

有时,咱们须要在Jupyter或IPython等python交互式环境开发。Tensorflow为了知足用户的这一需求,提供了一种专门针对交互式环境开发的方法InteractiveSession(),具体用法如程序2-6所示:

程序2-6:

程序2-6就是交互式环境中常常会使用的InteractiveSession()方法,其建立sess对象后,能够直接输出运算结果。

综上所述,咱们介绍了Tensorflow的核心概念——计算图模型,以及定义图模型和运行图模型的几种方式。接下来,咱们思考一个问题,为何Tensorflow要使用图模型?图模型有什么优点呢?

首先,图模型的最大好处是节约系统开销,提升资源的利用率,能够更加高效的进行运算。由于咱们在图的执行阶段,只须要运行咱们须要的op,这样就大大的提升了资源的利用率;其次,这种结构有利于咱们提取中间某些节点的结果,方便之后利用中间的节点去进行其它运算;还有就是这种结构对分布式运算更加友好,运算的过程能够分配给多个CPU或是GPU同时进行,提升运算效率;最后,由于图模型把运算分解成了不少个子环节,因此这种结构也让咱们的求导变得更加方便。

2.3.2 Tensor介绍

Tensor(张量)是Tensorflow中最重要的数据结构,用来表示Tensorflow程序中的全部数据。Tensor本是普遍应用在物理、数学领域中的一个物理量。那么在Tensorflow中该如何理解Tensor的概念呢?

实际上,咱们能够把Tensor理解成N维矩阵(N维数组)。其中零维张量表示的是一个标量,也就是一个数;一维张量表示的是一个向量,也能够看做是一个一维数组;二维张量表示的是一个矩阵;同理,N维张量也就是N维矩阵。

在计算图模型中,操做间所传递的数据均可以看作是Tensor。那Tensor的结构究竟是怎样的呢?咱们能够经过程序2-7更深刻的了解一下Tensor。

程序2-7:

程序2-7的输出结果代表:构建图的运算过程输出的结果是一个Tensor,且其主要由三个属性构成:Name、Shape和Type。Name表明的是张量的名字,也是张量的惟一标识符,咱们能够在每一个op上添加name属性来对节点进行命名,Name的值表示的是该张量来自于第几个输出结果(编号从0开始),上例中的“mul_3:0”说明是第一个结果的输出。Shape表明的是张量的维度,上例中shape的输出结果(1,1)说明该张量result是一个二维数组,且每一个维度数组的长度是1。最后一个属性表示的是张量的类型,每一个张量都会有惟一的类型,常见的张量类型如图2-2所示。


图2-2 经常使用的张量类型


咱们须要注意的是要保证参与运算的张量类型相一致,不然会出现类型不匹配的错误。如程序2-8所示,当参与运算的张量类型不一样时,Tensorflow会报类型不匹配的错误:

程序2-8:

正如程序的报错所示:m1是int32的数据类型,而m2是float32的数据类型,二者的数据类型不匹配,因此发生了错误。因此咱们在实际编程时,必定注意参与运算的张量数据类型要相同。

2.3.3 常量、变量及占位符

Tensorflow中对常量的初始化,不论是对数值、向量仍是对矩阵的初始化,都是经过调用constant()函数实现的。由于constant()函数在Tensorflow中的使用很是频繁,常常被用于构建图模型中常量的定义,因此接下来,咱们经过程序2-9了解一下constant()的相关属性:
程序2-9:

如程序2-9所示,函数constant有五个参数,分别为value,name,dtype,shape和verify_shape。其中value为必选参数,其它均为可选参数。Value为常量的具体值,能够是一个数字,一维向量或是多维矩阵。Name是常量的名字,用于区别其它常量。Dtype是常量的类型,具体类型可参见图2-2。Shape是指常量的维度,咱们能够自行定义常量的维度。

verify_shape是验证shape是否正确,默认值为关闭状态(False)。也就是说当该参数true状态时,就会检测咱们所写的参数shape是否与value的真实shape一致,若不一致就会报TypeError错误。如:上例中的实际shape为(2,0),若咱们将参数中的shape属性改成(2,1),程序就会报以下错误:

TypeError: Expected Tensor's shape: (2, 1), got (2,).

Tensorflow还提供了一些常见常量的初始化,如:tf.zeros、tf.ones、tf.fill、tf.linspace、tf.range等,都可以快速初始化一些常量。例如:咱们想要快速初始化N维全0的矩阵,咱们能够利用tf.zeros进行初始化,如程序2-10所示:

程序2-10:

程序2-10向咱们展现了tf.zeros和tf.zeros_like的用法。其它常见常量的具体初始化用法能够参考Tensorflow官方手册:https://www.tensorflow.org/api_guides/python/constant_op

此外,Tensorflow还能够生成一些随机的张量,方便快速初始化一些随机值。如:tf.random_normal()、tf.truncated_normal()、tf.random_uniform()、tf.random_shuffle()等。如程序2-11所示,咱们以tf.random_normal()为例,来看一下随机张量的具体用法:

程序2-11:

随机张量random_normal()有shape、mean、stddev、dtype、seed、name六个属性。 shape是指张量的形状,如上述程序是生成一个2行3列的tensor;mean是指正态分布的均值;stddev是指正太分布的标准差;dtype是指生成tensor的数据类型;seed是分发建立的一个随机种子;而name是给生成的随机张量命名。

Tensorflow中的其它随机张量的具体使用方法和属性介绍,能够参见Tensorflow官方手册:https://www.tensorflow.org/api_guides/python/constant_op。这里将不在一一赘述。

除了常量constant(),变量variable()也是在Tensorflow中常常会被用到的函数。变量的做用是保存和更新参数。执行图模型时,必定要对变量进行初始化,通过初始化后的变量才能拿来使用。变量的使用包括建立、初始化、保存、加载等操做。首先,咱们经过程序2-12了解一下变量是如何被建立的:

程序2-12:

程序2-12展现了建立变量的多种方式。咱们能够把函数variable()理解为构造函数,构造函数的使用须要初始值,而这个初始值是一个任何形状、类型的Tensor。也就是说,咱们

既能够经过建立数字变量、一维向量、二维矩阵初始化Tensor,也可使用常量或是随机常量初始化Tensor,来完成变量的建立。

当咱们完成了变量的建立,接下来,咱们要对变量进行初始化。变量在使用前必定要进行初始化,且变量的初始化必须在模型的其它操做运行以前完成。一般,变量的初始化有三种方式,如程序2-13所示:

程序2-13:

程序2-13说明了初始化变量的三种方式:初始化所有变量、初始化变量的子集以及初始化单个变量。首先,global_variables_initializer()方法是无论全局有多少个变量,所有进行初始化,是最简单也是最经常使用的一种方式;variables_initializer()是初始化变量的子集,相比于所有初始化化的方式更加节约内存;Variable()是初始化单个变量,函数的参数即是要初始化的变量内容。经过上述的三种方式,咱们即可以实现变量的初始化,放心的使用变量了。

咱们常常在训练模型后,但愿保存训练的结果,以便下次再使用或是方便往后查看,这时就用到了Tensorflow变量的保存。变量的保存是经过tf.train.Saver()方法建立一个Saver管理器,来保存计算图模型中的全部变量。具体代码如程序2-14所示:

程序2-14:

咱们要注意,咱们的存储文件save.ckpt是一个二进制文件,Saver存储器提供了向该二进制文件保存变量和恢复变量的方法。保存变量的方法就是程序中的save()方法,保存的内容是从变量名到tensor值的映射关系。完成该存储操做后,会在对应目录下生成如图2-3所示的文件:


图2-3 保存变量生成的相应文件


Saver提供了一个内置的计数器自动为checkpoint文件编号。这就支持训练模型在任意步骤屡次保存。此外,还能够经过global_step参数自行对保存文件进行编号,例如:global_step=2,则保存变量的文件夹为model.ckpt-2。

那如何才能恢复变量呢?首先,咱们要知道必定要用和保存变量相同的Saver对象来恢复变量。其次,不须要事先对变量进行初始化。具体代码如程序2-15所示:
程序2-15:

本程序示例中,咱们要注意:变量的获取是经过restore()方法,该方法有两个参数,分别是session和获取变量文件的位置。咱们还能够经过latest_checkpoint()方法,获取到该目录下最近一次保存的模型。

以上就是对变量建立、初始化、保存、加载等操做的介绍。此外,还有一些与变量相关的重要函数,如:eval()等。

认识了常量和变量,Tensorflow中还有一个很是重要的经常使用函数——placeholder。placeholder是一个数据初始化的容器,它与变量最大的不一样在于placeholder定义的是一个模板,这样咱们就能够session运行阶段,利用feed_dict的字典结构给placeholder填充具体的内容,而无需每次都提早定义好变量的值,大大提升了代码的利用率。Placeholder的具体用法如程序2-16所示:

程序序2-16:

 

程序2-16演示了placeholder占位符的使用过程。Placeholder()方法有dtype,shape和name三个参数构成。dtype是必填参数,表明传入value的数据类型;shape是选填参数,表明传入value的维度;name也是选填参数,表明传入value的名字。咱们能够把这三个参数看做为形参,在使用时传入具体的常量值。这也是placeholder不一样于常量的地方,它不能够直接拿来使用,而是须要用户传递常数值。

最后,Tensorflow中还有一个重要的概念——fetch。Fetch的含义是指能够在一个会话中同时运行多个op。这就方便咱们在实际的建模过程当中,输出一些中间的op,取回多个tensor。Fetch的具体用法如程序2-17所示:

程序2-17:

程序2-17展现了fetch的用法,即咱们利用session的run()方法同时取回多个tensor值,方便咱们查看运行过程当中每一步op的输出结果。

程序2-18:

小结:本节旨在让你们学会Tensorflow的基础知识,为后边实战的章节打下基础。主要讲了Tensorflow的核心——计算图模型,如何定义图模型和计算图模型;还介绍了Tensor的概念,以及Tensorflow中的常量、变量、占位符、feed等知识点。你们都掌握了吗?

最后,对深度学习感兴趣,热爱Tensorflow的小伙伴,欢迎关注咱们的网站!http://www.tensorflownews.com

相关文章
相关标签/搜索