一、计算图
TensorFlow中两个最重要的概念,一个是Tensor,一个是Flow。Tensor就是张量,Flow就是计算流。计算图中的每个节点就是一个张量,而张量之间的依赖关系就是计算流,也就是在计算图中从一个Tensor通过计算流到另一个Tensor。
import tensorflow as tf a = tf.constant([1.0,2.0], name='a') b = tf.constant([3.0,4.0], name='b') result = a + b
通过tf.get_default_graph函数可以获取当前默认的计算图,通过tf.Graph()定义一个计算图。计算图除了可以用来隔离张量和计算,也可以在某个计算图中单独定义使用某个GPU设备。
在计算图中,可以通过集合collection
来管理不同类别的资源,比如通过tf.add_to_collection
函数可以将资源加入一个或多个集合中,然后通过tf.get_collection
获取一个集合里面的所有资源。这里的资源可以是张量、变量或者运行TensorFlow程序所需要的队列资源等。
二、张量(Tensor)
从TensorFlow的名字中就可以看出张量(Tensor)是一个很重要的概念,可以说tensorflow中的最基本单元。通俗理解就是在TensorFlow中都以Tensor为基本单元计算流的。也可以被理解为多维数组。在张量中并没有真正保存数字,它保存的是如何得到这些数字的计算过程,需要通过会话session的run才能得到具体数字。
一个张量主要保存了三个属性:名字:name,维度:shape,类型:type。
三、会话
会话的主要作用就是拥有并管理TensorFlow程序运行时的所有资源,当所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄露。
在TensorFlow中,有两种用于运行计算图(graph)的会话(session)
-
tf.Session( )
-
tf.InteractivesSession( )
1)tf.Session( )
import tensorflow as tf # 构建graph a = tf.add(3, 5) # 运行graph sess = tf.Session() # 创建tf.Session的一个对象sess print(sess.run(a)) sess.close() # 关闭sess对象
#一个session可能会占用一些资源,比如变量、队列和读取器(reader)。我们使用sess.close()关闭会话或者使用上下文管理器释放这些不再使用的资源。
建议的写法:
import tensorflow as tf # 构建graph matrix1 = tf.constant([[3., 3.]]) matrix2 = tf.constant([[2.], [2.]]) product = tf.matmul(matrix1, matrix2) # 运行graph with tf.Session() as sess: # 使用"with"语句,自动关闭会话 print(sess.run(product))
2) tf.InteractivesSession( )
// 进入python3交互式环境 # python3 >>> import tensorflow as tf // 进入一个交互式会话 >>> sess = tf.InteractiveSession() >>> a = tf.constant(5.0) >>> b = tf.constant(6.0) >>> c = a * b // We can just use 'c.eval()' without passing 'sess' >>> print(c.eval()) >>> sess.close() // 关闭交互式会话 >>> exit() // 退出python3交互式环境
四、变量
在TensorFlow中变量tf.Variable的作用就是保存和更新神经网络中的参数的,和其它编程语言类似,TensorFlow中的变量也需要指定初始值。变量也是张量。
weights=tf.Variable(tf.random_normal([2,3],stddev=2)) #初始化变量,变量的初始值可以设置成随机数,常数或者通过其它变量的初始值计算得到。 #tf.random_normal([2,3],stddev=2)会产生一个2x3的矩阵,矩阵中的元素是均值为0,标准差为2的正态分布生成的随机数。
通过其它变量来初始化
w2=tf.Variable(weights.initialized_value())
TensorFlow随机数生成函数
TensorFlow常数生成函数
要使用变量,首先要通过session的run运行初始化变量,因为变量也是一个张量,上面的只是定义了计算过程,并没有真正执行:
sess.run(w2.initializer)#初始化w2真正赋值 #一次初始化所有变量 init_op=tf.initialize_all_variables() sess.run(init_op)
五、placeholder
变量主要针对的神经网络中的参数,placeholder主要针对的样本中的输入数据X及其对应的Y。因为如果每轮迭代中输入数据都都以 x=tf.constant([[3., 3.]])形式输入的话(必须转换成张量),计算图将会非常之大,这是因为每生成一个常量,都会在计算图中增加一个节点,如果经过成千上万次的迭代的话,那就会生成非常多的节点,利用率也比较低。TensorFlow提供了placeholder机制来解决了这个问题,placeholder相当于定义了一个位置,这个位置中的数据在运行时再指定。这样程序中就不需要生成大量的常量来提供输入数据,而只需要将数据通过placeholder传入Tensorflow计算图。
import tensorflow as tf import numpy as np x = np.ones((2, 3)) y = np.ones((3, 2)) input1 = tf.placeholder(tf.int32) input2 = tf.placeholder(tf.int32) output = tf.matmul(input1, input2) with tf.Session() as sess: print(sess.run(output, feed_dict = {input1:x, input2:y}))
使用tf.placeholder( ),为某些操作的输入创建占位符,其中feed_dict是一个字典,在字典中需要给出每个用到的placeholder的取值,如果某个需要的placeholder没有被指定取值程序就会报错。注意,feed注入的值不能是tf的tensor对象,应该是Python常量、字符串、列表、numpy ndarrays,或者TensorHandles。