原创博客,转载请注明出处!
0、基本流程
- 使用张量表示数据.
- 使用图 (graph) 来表示计算任务
- 使用会话(Session)来执行图
- 使用fetch取回数据,feed为操作赋值
下面我们一步步分析
首先导入包,tensorflow通常简称为tf
import tensorflow as tf
1、张量(tensor)
张量是tensorflow框架使用的基本的数据机构,张量其实就是多维数组,在python中可以理解为嵌套的多维列表。张量的维度称为阶,0阶张量又称为标量,1阶张量又称为向量,2阶张量又称为矩阵。
3 # 0阶张量,标量
[1., 2., 3.] # 1阶张量,向量大小为3
[[1., 2., 3.], [4., 5., 6.]] # 2阶张量,两行三列的矩阵
[[[1., 2.],[3., 4.],[5., 6.]], [[7., 8.],[9., 10.],[11., 12.]]] # 3阶张量,大小为2*3*2
2、常量(constant)与变量(variable)
tensorflow中用tf.constant创建常量,如:
c1 = tf.constant([[3., 3.]])#创建一个一行两列的矩阵常量,其值均为3
c2 = tf.constant([[2.],[2.]])#创建一个两行一列的矩阵常量,其值均为2
变量(Variable)是特殊的张量(Tensor),它的值可以是一个任何类型和形状的张量,用tf.Variable创建变量,如:
state = tf.Variable(0, name="counter")#创建一个0阶变量并初始化为0
创建变量的时候必须将一个张量作为初始值传入构造函数Variable(),TensorFlow提供了一系列操作符来初始化张量如tf.random_normal和tf.zeros。
#用一个形状(2,)的张量(2维向量)去初始化一个变量
v = tf.Variable([20,30],name="v")
#用标准差为0.35的正太分布初始化一个形状(10,20)的变量
w = tf.Variable(tf.random_normal([10, 20], stddev=0.35),
name="w")
#用一个形状为(20,)的张量(里面的元素值全部为0的20维向量)去初始化一个变量
b = tf.Variable(tf.zeros([20]), name="b")
附:tf.truncated_normal和tf.random_normal一样都是生成正态分布随机数,不同是前者去除边缘值。
3、计算图(computational graph)和会话(session)
TensorFlow 使用图来表示计算的任务,即图描述了计算的过程,图中的节点被称之为 op (operation 的缩写),一个节点(op)接受0或多个张量作为输入,然后产生0个或多个张量作为输出。
此外,图必须在会话里被启动,会话将图的 op 分发到 CPU 或 GPU 之类的 设备上,同时提供执行 op 的方法,这些方法执行后,将产生的 tensor 返回.,在 Python 中,返回的 tensor 是 numpy ndarray 对象; 在 C 和 C++ 语言中,返回的 tensor 是 tensorflow::Tensor 实例。
TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段,在构建阶段,op 的执行步骤被描述成一个图; 在执行阶段, 使用会话执行执行图中的 op。例如通常在构建阶段创建一个图来表示和训练神经网络,然后在执行阶段反复执行图中的训练 op。
(1)构建图(构建阶段)
构建图的第一步是创建源op (source op),源 op 不需要任何输入,例如常量 (Constant),源 op 的输出被传递给其它 op 做运算。
在python中,op 构造器的返回值代表被构造出的 op 的输出,这些返回值可以传递给其它 op 构造器作为输入。
TensorFlow Python 库有一个默认图 (default graph),op 构造器可以为其增加节点:
import tensorflow as tf
# 创建一个常量 op, 产生一个 1x2 矩阵. 这个 op 被作为一个节点
# 加到默认图中.
#
# 构造器的返回值代表该常量 op 的返回值.
matrix1 = tf.constant([[3., 3.]])
# 创建另外一个常量 op, 产生一个 2x1 矩阵.
matrix2 = tf.constant([[2.],[2.]])
# 创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入.
# 返回值 'product' 代表矩阵乘法的结果.
product = tf.matmul(matrix1, matrix2)
默认图现在有三个节点,两个 constant() op和一个matmul() op,注意此时只是定义好了计算的方式,还没有真正的计算,为了真正进行矩阵相乘运算,并得到矩阵乘法的结果,你必须在下面说的会话里启动这个图。
(2)在一个会话中启动图(执行阶段)
启动图的第一步是创建一个 Session 对象,如果无任何创建参数,会话构造器将启动默认图:
# 启动默认图.
sess = tf.Session()
# 调用 sess 的 'run()' 方法来执行矩阵乘法 op, 传入 'product' 作为该方法的参数.
# 上面提到, 'product' 代表了矩阵乘法 op 的输出, 传入它是向方法表明, 我们希望取回
# 矩阵乘法 op 的输出.
#
# 整个执行过程是自动化的, 会话负责传递 op 所需的全部输入. op 通常是并发执行的.
#
# 函数调用 'run(product)' 触发了图中三个 op (两个常量 op 和一个矩阵乘法 op) 的执行.
#
# 返回值 'result' 是一个 numpy `ndarray` 对象.
result = sess.run(product)
print result
# ==> [[ 12.]]
# 任务完成, 关闭会话.
sess.close()
Session 对象在使用完后需要关闭以释放资源,除了显式调用 close 外,也可以使用 "with" 代码块来自动完成关闭动作。
with tf.Session() as sess:
result = sess.run([product])
print result
为了取回张量(输出值),在Session的run()调用执行时传入张量,在刚刚的例子中,我们只取回了单个节点product,你也可以取回多个张量。需要获取的多个 tensor 值,在 op 的一次运行中一起获得(而不是逐个去获取 tensor)。
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)
with tf.Session():
result = sess.run([mul, intermed])
print result
# 输出:
# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]
4、占位符
上述示例在计算图中引入了张量,以常量或变量的形式存储,tensorflow中还提供另外一种机制,即先定义占位符,等到真正执行的时候再用具体值去填充或更新占位符的值。
用tf.placeholder()创建占位符,Session.run的feed_dict参数填充值。
input1 = tf.placeholder(tf.types.float32)
input2 = tf.placeholder(tf.types.float32)
output = tf.mul(input1, input2)
with tf.Session() as sess:
print sess.run([output], feed_dict={input1:[7.], input2:[2.]})
# 输出:
# [array([ 14.], dtype=float32)]
参考:http://www.tensorfly.cn/tfdoc/get_started/basic_usage.html