之前发过了几篇关于机器学习的帖子, 使用的框架多为 TensorFlow.
TensorFlow 是一个用于人工智能的开源神器. 作为常用的机器学习框架, 可被用于语音识别或图像识别等多项机器学习和深度学习领域, 且上手简单, 教材丰富.
TensorFlow 从名字上, 我们就可以对他有一定的理解.
Tensor: 张量, 表示 N 维数组.
Flow: 流, 表示给予数据流图的计算.
TensorFlow 一句话: 一个采用数据流图, 用于数值计算的开源软件库. 节点在图中表示数学操作, 图中的线则表示在节点间相互联系的多维数据数组, 即张量.
本篇博客的重点在于 TensorFlow 基础知识的讲解, 包括安装, Graph,Session,Variable,Feed,Fetch 的讲解.
更多关于 TensorFlow 的知识, 可以登陆其官网进行查询
https://www.tensorflow.org
TensorFlow 的安装
工欲善其事 必先利其器, 安装 tf 自然是第一步.
首先安装好 python, 我使用的是 python3.6, 确认自己是否安装有 pip.
使用这两句话可以查询自己的 pip 是否安装正确
- $ pip -V # for Python 2.7
- $ pip3 -V # for Python 3.n
安装 TensorFlow
- $ pip -V # for Python 2.7
- $ pip3 -V # for Python 3.n
如果上一句代码执行失败, 执行如下代码
- $ sudo pip install --upgrade tfBinaryURL # Python 2.7
- $ sudo pip3 install --upgrade tfBinaryURL # Python 3.n
如果想要安装其他版本的 tf, 执行如下代码, 自行修改 URL 就可以安装不同版本的 tf 了
- $ sudo pip3 install --upgrade \
- https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.6.0-py3-none-any.whl
安装好后进入 python
- import tensorflow as tf
- hello = tf.constant('Hello, TensorFlow!')
- sess = tf.Session()
- print(sess.run(hello))
正确输出如下内容, 表示安装成功
Hello, TensorFlow!
TensorFlow 的基本概念
TensorFlow 就是一个采用数据流图, 用于数值计算的开源软件库. 节点在图中表示数学操作, 图中的线则表示在节点间相互联系的多维数据数组, 即张量.
[图片上传失败...(image-ad4af5-1526269253221)]
此图来自于 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 做运算.
创建一个图
- 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)
用到的两个函数:
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) 的执行. 最终任务结束, 关闭会话.
- # 启动默认图.
- sess = tf.Session()
- # 调用 sess 的'run()' 方法来执行矩阵乘法 op, 传入'product' 作为该方法的参数.
- result = sess.run(product)
- print (result)
- # 任务完成, 关闭会话.
- sess.close()
最终的输出结果为:
[[ 24.]]# 没问题, 算对了
我们也可以使用 with 代码块来实现对话的自动关闭, 在离开 with 代码块时, 会话会自动关闭.
- with tf.Session() as sess:
- result = sess.run(product)
- print(result)
最终的输出结果为:
[[ 24.]]
交互式对话
使用上述方法, 会出现一个对话被绑定在一个变量上的情况, 有的时候我们并不想这么做, 所以我们可以使用交互式对话的方式避免这样的情况.
使用 Tensor.eval() 和 Operation.run() 方法代替 Session.run()
- 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())
最终的输出结果为:
[-4. -1.] #没错, 又算对了
张量(Tensor)
TensorFlow 的名字中第一个单词就是 Tensor, 可见 Tensor 在 TensorFlow 中的重要性.
Tensor 可以理解为是一个数据结构, 其实就是一个 N 维数组. TensorFlow 用 tensor 表示所有的数据.
在计算图中, 操作间传递的数据都是 tensor.
一个 tensor 包含一个静态类型 rank, 和一个 shape.
阶(Rank)
阶 (Rank) 用于描述张量的维数
一阶 Tensor 可以理解为数学上的向量, 二阶 Tensor 可以理解为数学上的矩阵.
对于一个二阶张量你可以用语句 t[i, j]来访问其中的任何元素. 而对于三阶张量你可以用't[i, j, k]'来访问其中的任何元素.
- 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.0
- [ 3. 4.]
- 3.0
- [ 1. 2.]
不同阶的数学表示
[图片上传失败...(image-6af2d5-1526269253221)]
形状(Shape)
这个属性与 nparray 的 shape 属性基本一致, 因为一个 Tensor 可以理解为是一个 N 维数组, 所以 Shape 属性就是获取数组的大小.
- 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)
输出结果如下:
- (3,)
- (2, 2)
- (2, 2, 2)
数据类型(dtype)
不同的数据类型
[图片上传失败...(image-d88d2d-1526269253221)]
变量
变量用来记录一些数据和状态, 维护图执行过程中的状态信息.
当训练模型时, 用变量来存储和更新参数. 变量包含张量 (Tensor)存放于内存的缓存区. 建模时它们需要被明确地初始化, 模型训练后它们必须被存储到磁盘. 这些变量的值可在之后模型训练和分析是被加载.
变量的创建
当创建一个变量时, 可以一个张量作为初始值传入构造函数 Variable(). 初始值可以是常量也可以是随机值.
但注意, 初始化变量时, 都需要指定传入张量的 Shape,Tensor 的 Shape 会自动成为变量的 Shape.
- # 创建两个变量
- 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()初始化所有变量
init = tf.global_variables_initializer()
使用 tf.initialize_all_variables()将所有的变量并行的初始化.
我们也可以使用一个变量的 initialized_value()方法初始化另一个变量的值.
- # 使用 weights 初始化 w2
- w2 = tf.Variable(w1.initialized_value(), name="w2")
最后我们整体执行一下
- # 创建两个变量
- 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)
输出结果:
- <tf.Variable 'weights:0' shape=(784, 20) dtype=float32_ref>
- <tf.Variable 'biases:0' shape=(20,) dtype=float32_ref>
- <tf.Variable 'w2:0' shape=(784, 20) dtype=float32_ref>
变量的保存与恢复
我们在训练模型的过程中, 经常需要将已经训练好的模型进行保存, 这个时候我们需要将其变量进行保存, 并在下一次使用时进行恢复.
使用 tf.train.Saver()创建一个 Saver 来管理模型中的所有变量.
变量的保存
- # 创建一些变量
- 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")
保存成功后, 一般会得到这四个文件
[图片上传失败...(image-298326-1526269253221)]
变量的恢复
此时我们不再需要对变量进行初始化
- # 创建一些变量
- 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))
输出结果:
0 1 2 3
其中的一个函数: tf.assign(ref, value, validate_shape=None, use_locking=None, name=None), 函数完成了将 value 赋值给 ref 的作用. 其中: ref 必须是 tf.Variable 创建的 tensor, 如果 ref=tf.constant()会报错!
Fetch
Fetch 用于取回操作的输出内容.
为了取回操作的输出内容, 可以在使用 Session 对象的 run()调用执行图时, 传入一些 tensor, 这些 tensor 会帮助你取回结果.
需要获取的多个 tensor 值, 在 op 的一次运行中一起获得(而不是逐个去获取 tensor).
- 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)
输出的结果:
[15.0, 5.0]
Feed
feed 使用一个 tensor 值临时替换一个操作的输出结果.
可以将 feed 数据作为 run()调用的参数.
feed 只在调用它的方法内有效, 方法结后, feed 就会消失.
最常见的用例是将某些特殊的操作指定为 "feed" 操作, 标记的方法是使用 tf.placeholder() 为这些操作创建占位符.
- 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.]}))
输出的结果:
[array([ 10.], dtype=float32)]
小结
本篇博客讲的主要是讲解 TensorFlow 的基本知识, 本次小项目的代码点击此处 https://blog-1253353217.cos.ap-chengdu.myqcloud.com/blog8 tf startup/tf-test.py 即可下载, 省事情吧, 都不用 git clone
来源: http://www.jianshu.com/p/5b0783eed1ee