
作者|blackblog? 编辑| 布袋熊
TensorFlow?是一个用于人工智能的开源神器。作为常用的机器学习框架,可被用于语音识别或图像识别等多项机器学习和深度学习领域,且上手简单,教材丰富。
本篇文章将带领大家一步一步上手TensorFlow,小伙伴们学起来呀~
TensorFlow从名字上,我们就可以对他有一定的理解。
Tensor:张量,表示N维数组。
Flow:流,表示给予数据流图的计算。
TensorFlow一句话:一个采用数据流图,用于数值计算的开源软件库。节点在图中表示数学操作,图中的线则表示在节点间相互联系的多维数据数组,即张量。

本文重点在于TensorFlow基础知识的讲解,包括安装,Graph,Session,Variable,Feed,Fetch的讲解。
更多关于TensorFlow的知识,可以登陆其官网进行查询:
https://www.tensorflow.org
工欲善其事?必先利其器,安装tf自然是第一步。
首先安装好python,我使用的是python3.6,确认自己是否安装有pip。
使用这两句话可以查询自己的pip是否安装正确
1 2
| $ pip -V # for Python 2.7 $ pip3 -V # for Python 3.n
|
安装TensorFlow
1 2
| $ pip -V # for Python 2.7 $ pip3 -V # for Python 3.n
|
如果上一句代码执行失败,执行如下代码
1 2
| $ sudo pip install --upgrade tfBinaryURL # Python 2.7 $ sudo pip3 install --upgrade tfBinaryURL # Python 3.n
|
如果想要安装其他版本的tf,执行如下代码,自行修改URL就可以安装不同版本的tf了
1 2
| $ sudo pip3 install --upgrade https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.6.0-py3-none-any.whl
|
安装好后进入python
1 2 3 4
| import tensorflow as tf hello = tf.constant('Hello,?TensorFlow!') sess = tf.Session() print(sess.run(hello))
|
正确输出如下内容,表示安装成功
TensorFlow就是一个采用数据流图,用于数值计算的开源软件库。节点在图中表示数学操作,图中的线则表示在节点间相互联系的多维数据数组,即张量。

此图来自于TensorFlow中文社区
图(Graph):表示计算任务。
会话(Session):建立会话,此时会生成一张空图;在会话中添加节点和边,形成一张图,一个会话可以有多个图,通过执行这些图得到结果。
张量(Tensor):一个N维数组,用来表示数据。
变量(Variable):用来记录一些数据和状态。
feed和fetch:用于对数据进行操作
TensorFlow?是一个编程系统,?使用图来表示计算任务。?图中的节点被称之为?op?(operation?的缩写)。一个?op?获得?0?个或多个?Tensor,?执行计算,?产生?0?个或多个?Tensor。
每个?Tensor?是一个类型化的多维数组.?例如,?你可以将一小组图像集表示为一个四维浮点数数组,?这四个维度分别是?[batch,?height,?width,?channels]。
构建图的第一步,?是创建源op。
源op不需要任何输入,?例如?常量?(Constant)。源?op?的输出被传递给其它?op?做运算.
创建一个图
1 2 3 4 5 6 7 8
| import tensorflow as tf # 创建一个常量 op, 产生一个 1x2 矩阵. 这个 op 被作为一个节点加到默认图中. t1 = tf.constant([[3.,3.]]) #创建另外一个常量 op, 产生一个 2x1 矩阵. t2 = tf.constant([[4.],[4.]]) #创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入 # 返回值 'product' 代表矩阵乘法的结果. product = tf.matmul(t1,t2)
|
用到的两个函数:
1 2 3
| tf.constant(value, dtype=None, shape=None, name='Const')#用于创建一个内容为value,类型为dtype,大小为shape的常量Tensor。 tf.matmul(a, b, transpose_a=False, transpose_b=False, a_is_sparse=False, b_is_sparse=False, name=None)#将矩阵a与矩阵b相乘,返回a*b的结果
|
上一步中完成后,默认图中现有三个节点,两个constant?op,一个matmul?op。但这仅仅是完成了图的创建,如果要得到最终的结果,我们必须要启动这个图。
启动图的第一步就是构造一个会话(Sess),创建一个Session对象。调用?sess?的?run()?方法来执行矩阵乘法?op,?传入?product?作为该方法的参数。函数调用?‘run(product)’?触发了图中三个?op?(两个常量?op?和一个矩阵乘法?op)?的执行。最终任务结束,关闭会话。
1 2 3 4 5 6 7
| # 启动默认图. sess = tf.Session() # 调用 sess 的 'run()' 方法来执行矩阵乘法 op, 传入 'product' 作为该方法的参数. result = sess.run(product) print (result) # 任务完成, 关闭会话. sess.close()
|
最终的输出结果为:
我们也可以使用with代码块来实现对话的自动关闭,在离开with代码块时,会话会自动关闭。
1 2 3
| with tf.Session() as?sess: result = sess.run(product) print(result)
|
最终的输出结果为:
使用上述方法,会出现一个对话被绑定在一个变量上的情况,有的时候我们并不想这么做,所以我们可以使用交互式对话的方式避免这样的情况。
使用 Tensor.eval() 和 Operation.run() 方法代替 Session.run()
1 2 3 4 5 6 7 8
| sess = tf.InteractiveSession() x = tf.Variable([1.0, 2.0]) #后面会讲到Variable a = tf.constant([5.0, 3.0]) #?使用初始化器?initializer?op?的?run()?方法初始化?'x',由于x是一个Variable,所以我们要对其进行初始化。 x.initializer.run() # 增加一个减法 subtract op, 从 'x' 减去 'a'. 运行减法 op, 输出结果 sub = tf.subtract(x,a) print (sub.eval())
|
最终的输出结果为:
TensorFlow的名字中第一个单词就是Tensor,可见Tensor在TensorFlow中的重要性。
Tensor可以理解为是一个数据结构,其实就是一个N维数组。TensorFlow用tensor表示所有的数据。
在计算图中,操作间传递的数据都是tensor。
一个?tensor包含一个静态类型rank,和一个shape。
阶(Rank)用于描述张量的维数
一阶Tensor可以理解为数学上的向量,二阶Tensor可以理解为数学上的矩阵。
对于一个二阶张量你可以用语句t[i,?j]来访问其中的任何元素。而对于三阶张量你可以用’t[i,?j,?k]’来访问其中的任何元素。
1 2 3 4 5 6 7 8
| with tf.Session() as?sess: t1 = tf.constant([1.0,2.0,3.0]) t2 = tf.constant([[1.0,2.0],[3.0,4.0]]) t3 = tf.constant([[[2.0,4.0],[6.0,8.0]],[[1.0,2.0],[3.0,4.0]]]) print(t1[0].eval()) print(t2[1].eval()) print(t2[1,0].eval()) print(t3[1,0].eval())
|
输出结果如下:
1 2 3 4
| 1.0 [ 3. 4.] 3.0 [ 1. 2.]
|
不同阶的数学表示

这个属性与nparray的shape属性基本一致,因为一个Tensor可以理解为是一个N维数组,所以Shape属性就是获取数组的大小。
1 2 3 4 5 6 7
| with tf.Session() as?sess: t1 = tf.constant([1.0,2.0,3.0]) t2 = tf.constant([[1.0,2.0],[3.0,4.0]]) t3 = tf.constant([[[2.0,4.0],[6.0,8.0]],[[1.0,2.0],[3.0,4.0]]]) print(t1.shape) print(t2.shape) print(t3.shape)
|
输出结果如下:
不同的数据类型

变量用来记录一些数据和状态,维护图执行过程中的状态信息。
当训练模型时,用变量来存储和更新参数。变量包含张量?(Tensor)存放于内存的缓存区。建模时它们需要被明确地初始化,模型训练后它们必须被存储到磁盘。这些变量的值可在之后模型训练和分析是被加载。
当创建一个变量时,可以一个张量作为初始值传入构造函数Variable()。初始值可以是常量也可以是随机值。
但注意,初始化变量时,都需要指定传入张量的Shape,Tensor的Shape会自动成为变量的Shape。
1 2 3
| #创建两个变量 weights = tf.Variable(tf.random_normal([784, 20], stddev=0.35),name="weights") biases = tf.Variable(tf.zeros([20]), name="biases")
|
变量的初始化必须在模型的其它操作运行之前先明确地完成。最简单的方法就是添加一个给所有变量初始化的操作,并在使用模型之前首先运行那个操作。
除此之外,也可以从检查点文件中重新获取变量值。
使用tf.initialize_all_variables()初始化所有变量
1
| init = tf.global_variables_initializer()
|
使用tf.initialize_all_variables()将所有的变量并行的初始化。
我们也可以使用一个变量的initialized_value()方法初始化另一个变量的值。
1 2
| #使用weights初始化w2 w2 = tf.Variable(w1.initialized_value(), name="w2")
|
最后我们整体执行一下
1 2 3 4 5 6 7 8 9 10 11 12
| #创建两个变量 w1 = tf.Variable(tf.random_normal([784, 20], stddev=0.35),name="weights") b1 = tf.Variable(tf.zeros([20]), name="biases") #初始化所有变量 init = tf.global_variables_initializer() #使用weights初始化w2 w2 = tf.Variable(w1.initialized_value(), name="w2") with tf.Session() as?sess: sess.run(init) print(w1) print(b1) print(w2)
|
输出结果:
1 2 3
| 'weights:0' shape=(784, 20) dtype=float32_ref> 'biases:0' shape=(20,) dtype=float32_ref> 'w2:0' shape=(784, 20) dtype=float32_ref>
|
我们在训练模型的过程中,经常需要将已经训练好的模型进行保存,这个时候我们需要将其变量进行保存,并在下一次使用时进行恢复。
使用tf.train.Saver()创建一个Saver来管理模型中的所有变量。
变量的保存
1 2 3 4 5 6 7 8 9 10
| # 创建一些变量 w1 = tf.Variable(tf.random_normal([784, 20], stddev=0.35),name="weights") b1 = tf.Variable(tf.zeros([20]), name="biases") # 初始化 init_op = tf.global_variables_initializer() # 创建一个Saver saver = tf.train.Saver() with tf.Session() as?sess: sess.run(init_op) save_path = saver.save(sess, "./tmp/model.ckpt")
|
保存成功后,一般会得到这四个文件

变量的恢复
此时我们不再需要对变量进行初始化
1 2 3 4 5 6 7 8
| # 创建一些变量 w1 = tf.Variable(tf.random_normal([784, 20], stddev=0.35),name="weights") b1 = tf.Variable(tf.zeros([20]), name="biases") # 创建一个Saver saver = tf.train.Saver() with tf.Session() as?sess: # Restore variables from disk. saver.restore(sess, "./tmp/model.ckpt")
|
# 创建一个变量, 初始化为标量 0. state = tf.Variable(0, name="counter") # 创建一个 op, 其作用是使 state 增加 1 one = tf.constant(1) new = tf.add(state, one) update = tf.assign(state, new) #使用assign将 new 赋值给 state # 启动图后, 变量必须先经过`初始化` (init) op 初始化, # 首先必须增加一个`初始化` op 到图中. init_op = tf.global_variables_initializer() # 启动图, 运行 op with tf.Session() as?sess: # 运行 'init' op sess.run(init_op) # 打印 'state' 的初始值 print (sess.run(state)) # 运行 op, 更新 'state', 并打印 'state' for _ in range(3): sess.run(update) print(sess.run(state))
|
输出结果:
其中的一个函数:
tf.assign(ref,?value,?validate_shape=None,?use_locking=None,?name=None),函数完成了将value赋值给ref的作用。其中:ref?必须是tf.Variable创建的tensor,如果ref=tf.constant()会报错!
Fetch用于取回操作的输出内容。
为了取回操作的输出内容,可以在使用?Session对象的?run()调用执行图时,传入一些?tensor,这些tensor会帮助你取回结果。
需要获取的多个?tensor?值,在?op?的一次运行中一起获得(而不是逐个去获取?tensor)。
1 2 3 4 5 6 7
| input1 = tf.constant(3.0) input2 = tf.constant(2.0) added= tf.add(input1, input2) mul = tf.multiply(input1, added) with tf.Session() as?sess: result = sess.run([mul, added]) #需要获取的多个?tensor?值,在?op?的一次运行中一起获得(而不是逐个去获取?tensor)。 print (result)
|
输出的结果:
feed?使用一个tensor值临时替换一个操作的输出结果。
可以将feed数据作为run()调用的参数。
feed只在调用它的方法内有效,方法结后,feed就会消失。
最常见的用例是将某些特殊的操作指定为?“feed”?操作,?标记的方法是使用?tf.placeholder()?为这些操作创建占位符。
1 2 3 4 5
| input1 = tf.placeholder(tf.float32) input2 = tf.placeholder(tf.float32) output = tf.multiply(input1, input2) with tf.Session() as?sess: print?(sess.run([output],?feed_dict={input1:[5.],?input2:[2.]}))
|
输出的结果:
1
| [array([ 10.], dtype=float32)]
|

爱数据,爱技术,爱AI,36大数据社群(大数据交流、AI技术学习群、机器人研究、AI+行业、企业合作群)火热招募中,对大数据和AI感兴趣的小伙伴们。增加AI小秘书微信号:a769996688,说明身份即可加入。
欢迎投稿,投稿/合作:dashuju36@qq.com
如果您觉得文章不错,那就分享到朋友圈~
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/