什么是计算图?
计算图又被称为是有向图,数据流图。
TensorFlow是一个通过计算图的形式来表述计算的编程系统。TensorFlow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。
下图展示了通过TensorBoard画出来的两个向量相加的计算图。
(TensorBoard的使用参考我的博客:http://blog.csdn.net/hongxue8888/article/details/69389171)
什么是数据流图(Data Flow Graph)?
数据流图是描述有向图中的数值计算过程。有向图中的节点通常代表数学运算,但也可以表示数据的输入、输出和读写等操作;有向图中的边表示节点之间的某种联系,它负责传输多维数据(Tensors)。图中这些tensors的flow也就是TensorFlow的命名来源。
节点可以被分配到多个计算设备上,可以异步和并行地执行操作。因为是有向图,所以只有等到之前的入度节点们的计算状态完成后,当前节点才能执行操作。
计算图的构造流程:
import tensorflow as tf
import numpy as np
x_data = np.float32(np.random.rand(2,100))
y_data = np.dot([0.1 , 0.2] , x_data) + 0.3
b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1,2],-1.0,1.0))
y = tf.matmul(W,x_data) + b
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
1.inference()-尽可能地构建好图表,满足促使神经网路向前反馈并做出预测的要求。
2.loss()-往inference图表中添加生产损失(loss)所需要的操作(ops)。
3.training()-往损失图表中添加计算并应用梯度(gradients)所需的操作。
计算图的使用
TensorFlow程序一般分为两个阶段:
1、定义计算图中所有的计算。
2、执行计算。
先看这段代码:
a = tf.constant([1.0, 2.0], name="a")
print(a.graph is tf.get_default_graph())
输出:true
说明在TensorFlow程序中,系统会自动维护一个默认的计算图,通过tf.get_default_graph方法可以获取当前默认的计算图。
当然,除了使用默认的计算图,可以通过tf.Graph方法来生成新的计算图。注意,不同计算图上的张量和运算都不会共享。以下代码显示了如何在不同计算图上定义和使用变量。
import tensorflow as tf
g1 = tf.Graph()
with g1.as_default():
v = tf.get_variable("v", [1], initializer = tf.zeros_initializer()) # 设置初始值为0
g2 = tf.Graph()
with g2.as_default():
v = tf.get_variable("v", [1], initializer = tf.ones_initializer()) # 设置初始值为1
with tf.Session(graph = g1) as sess:
tf.global_variables_initializer().run()
with tf.variable_scope("", reuse=True):
print(sess.run(tf.get_variable("v")))
with tf.Session(graph = g2) as sess:
tf.global_variables_initializer().run()
with tf.variable_scope("", reuse=True):
print(sess.run(tf.get_variable("v")))
输出:
[ 0.]
[ 1.]
在计算图1中将v初始化为0;在计算图2中将v初始化成为1。可以看到运行不同计算图时,变量v的值也是不一样的。