基本使用
- 使用图(graph)来表示计算任务
- 通过Sessions来执行图计算
- 使用tensor表示数据
- 通过变量Variable维护状态
- 使用feed和fetch可以为任意的操作赋值或从其中获取数据
TensorFlow是一种将计算表示为图的编程系统。图中的节点称为ops(operation的简称)。一个ops使用0个或以上的Tensors,通过执行某些运算,产生0个或以上的Tensors。一个Tensor是一个多维数组或列表。图必须在会话(Session)里被启动。
下面我们来看一个基本的例子:
#导入tensorflow,用tf代替
import tensorflow as tf
#创建一个常量(constant)op,a为一行两列的矩阵
a = tf.constant([[3,3]])
#创建另一个常量(constant)op,b为两行一列的矩阵
b = tf.constant([[2],[3]])
#矩阵乘法op(matmul),传入a,b
c = tf.matmul(a, b)
#输出结果
print(result)
口算得出,result应该等于15,那我们来看一下,结果是不是这样的呢。
结果并不是15,而是得到一个Tensor。
我们前面说过,tensorflow中的计算都应该在会话(Session)中进行,在这里我们只是定义了这些op,但是并没有执行。
接下来我们定义一个会话,看看执行结果:
#定义一个会话, 启动默认的图
sess = tf.Session()
#调用sess的run方法执行矩形乘法op
#run(c)触发了图中3个op
result = sess.run(c)
#输出结果result
print(result)
#关闭会话
sess.close()
让我们来看看加上这段代码后的运行结果:
输出结果正确,跟我们所想的一样。
来说说执行的过程:
在会话运行中,到语句 result = sess.run(c)的时候,程序会往上寻找c这个op。
找到c= tf.matmul(a, b)时停住,这时候运行矩阵乘法op,又需要找到a,b这两个op,程序继续往上寻找。
a= tf.constant([[3,3]]),b= tf.constant([[2],[3]]),找到a,b这两个常量op后,再回到上一步。
最终tf.run()方法运行结束,输出result结果,关闭会话。
我们可以知道这过程就是一个一层一层调用的过程。
还有另一种会话的定义方法,此方法不需要关闭会话。
#不需要执行关闭操作
with tf.Session() as sess:
# 调用sess的run方法执行矩形乘法op
# run(c)触发了图中3个op
result = sess.run(c)
print(result)
让我们看看这个方法的运行结果:
两个会话的定义方法,最后的输出结果相同。选择哪一种定义方法,可以根据自己的喜好来使用。
一个很简单的小程序,用来理解会话运行的过程。
变量
变量创建及使用
前面我们接触了常量,现在我们来看一看变量的使用。
import tensorflow as tf
x = tf.Variable([1,2])
a = tf.constant([3,3])
#增加一个减法op
sub = tf.subtract(x, a)
#增加一个加法op
add = tf.add(x,sub)
#全局变量的初始化
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print(sess.run(sub))
print(sess.run(add))
这里我们创建了一个常量与一个变量,从这个程序中看起来,好像常量与变量的使用没什么区别,请你们注意这个代码。
init = tf.global_variables_initializer()
这个代码的作用应该很容易看出来,初始化所有的变量,在图中,如果想使用变量的话,就必须在使用之前run()这个方法。
如果不运行这个方法的话,则会提示
我们发现提示中有:Attempting to use uninitialized value Variable。尝试使用未初始化的变量,这个操作是不允许的。所以如果有需要使用变量的地方,一定要记得进行变量的初始化操作。
附上该程序运行结果:
变量第二种创建方式
前面我们说到一种变量创建的方式为tf.Variable(),但是使用这个函数前,我们必须要输入一个准确的值进去。变量变量,经常我们其实并不知道其的具体数值。所有第二种创建方式:placeholder( )方法。
我们先看一段程序:
import tensorflow as tf
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1, input2)
with tf.Session() as sess:
#feed的数据以字典的形式传入
print(sess.run(output, feed_dict={input1:7.0, input2:2.0}))
这里的placeholder()可以理解为占位符,我不知道该变量的具体数值是什么,但我知道其具体的数据类型。同时我们发现在使用placeholder()方法来创建变量的时候,不需要初始化变量的特点。
但是使用该方法时,需要用到feed_dict来传入具体数值。
本程序中input1被传入数值7.0,input2被传入数值2.0,则按我们呢的猜想来看,最后的output应该为14.0。
来看看运行结果跟我们猜想的一样。这就是feed_dict的功能。
学习完常量,变量,大家可以按自己的想法,来写一些程序,运行看看结果是否正确。