TensorFlow程序一般分为定义计算与执行计算两个阶段,任何TensorFlow程序在执行前都会先定义相应的计算图,然后执行定义的计算图。
计算图是TensorFlow最基本的概念,TensorFlow中每一个计算都会转化为计算图上的节点,而节点之间的边描述了计算之间的依赖关系。有以下程序
`
import tensorflow as tf
#定义常量,并命名为name_a
a=tf.constant([1,2],name=’name_a’)
b=tf.constant([3,4],name=’name_b’)
c=a+b
`
在tensorflow程序中,系统会自动维护一个默认的计算图,通过tf.get_default_graph函数可以获取当前默认的计算图。在上面的代码执行过程中,tensorflow会自动的将定义的节点a,b转化到计算图上。
除了默认的计算图,tensorflow还提供tf.Graph函数来生成新的计算图,不同的计算图上的张量和运算都不会共享。
这里就涉及到张量,张量是tensorflow中数据的形式,主要保存节点的名字、维度、类型三个属性,可以简单的理解为多维数组,但它并不直接采用数组的形式,只是对运算结果的引用,这样设计感觉是为了节省存储空间。
在定义常量的时候,例如a=tf.constant([1,2],name=’name_a’),其中tf.constant([1,2],name=’name_a’)只是在计算图上定义了一个常量计算节点,这个节点的名称命名为name_a,计算的结果为一个张量,将其计算过程保存在a中。
当执行
a=tf.constant([1,2],name=’name_a’)
print(a)
时,输出会是
Tensor(“name_a_1:0”, shape=(2,), dtype=int32)
其中”name_a_1:0”表示节点name_a输出的第一个结果(编号从0开始)
shape=(2,) 说明张量是一个一维数组,这个数据的长度为2
dtype=int32代表张量的数据的类型
要想输出具体的值,在会话中用进行
张量的引入也大大提高了代码的可读性,因为在神经网络中,会存在很多的中间计算,如果没有张量来保存中间结果,那么代码可读性将会变得很差。
定义好计算节点之后,用会话的方式运行定义的节点,常用的方式是
with tf.Session() as sess:
sess.run(…)
这种方式的优点是程序运行完毕自动关闭资源。
要想程序在指定的GPU上运行,或者打印日志等操作,可以在定义会话的时候,通过ConfigProto配置会话
例如config=tf.ConfigProto(allow_soft_placement=True,log_device_placement=True)
sess=tf.Session(config=config)
这样就配置了在GPU不能运行的运算自动放到CPU上运行,同时还能记录每个节点被安排到那个设备上计算了