此博客只是学习笔记,不具有任何参考价值
TensorFlow 将程序分为两个独立的部分来构建神经网络的蓝图
- 计算图的定义
计算图定义神经网络的蓝图,但其中的张量还没有相关的数值,
为了构建计算图,需要定义所有要执行的常量、变量和运算操作
- 计算图的执行
使用会话对象来实现计算图的执行。会话对象封装了评估张量和操作对象的环境。
这里真正实现了运算操作并将信息从网络的一层传递到另外一层。不同张量对象的值
仅在会话对象中被初始化、访问和保护。在此之前张量对象只被抽象定义,在绘画中才被赋予实际意义。
计算图:是包含节点和边的网络。
- 节点:对象(张量和运算操作)
每个节点可以有零个或多个输入,但只有一个输出。
- 边:运算操作之间流动的张量
- 定义数据
- 张量(tensor)
- 对象(常量、变量和占位符)
- 所有计算(运算操作对象)
- 实例:通过定义并执行计算图实现两个向量相加
import tensorflow as tf
v_1 = tf.constant([2,4,5,6])
v_2 = tf.constant([4,5,2,5])
add = tf.add(v_1,v_2)
with tf.Session() as sess:
print(sess.run(add))
#sess = tf.Session()
#print(sess.run(add))
#sess.close()
[ 6 9 7 11]
每个会话都需要使用close()关闭,而with格式可以在运行结束时隐式关闭会话
- 实例的深入分析
计算图的构建:添加变量和操作,并按照逐层神经网络的顺序传递他们(让张量流动)
TensorFlow 还允许使用 with tf.device() 命令来使用具有不同计算图形对象的特定设备(CPU/GPU)。
在例子中计算图由三个节点组成,v_1 和v_2 表示这两个向量,Add时要对他们执行的操作,
接下来为了是这个图生效,首相需要使用tf.Session() 定义一个会话对象 sess 然后使用Session 类中定义的run方法运行它
run(fetches,feed_dict=None,options=None,run_metadata)
运算结果的值在 fetches 中提取;在示例中,提取的张量为 add。run 方法将导致在每次执行该计算图的时候,都将对与 v_add 相关的张量和操作进行赋 值。如果抽取的不是 v_add 而是 v_1,那么最后给出的是向量 v_1 的运行结果:
[2 4 5 6]
此外,一次可以提取一个或多个张量或操作对象,例如,如果结果抽取的是 [v_1...add]
import tensorflow as tf
v_1 = tf.constant([2,4,5,6])
v_2 = tf.constant([4,5,2,5])
add = tf.add(v_1,v_2)
with tf.Session() as sess:
print(sess.run((add,v_2,v_1)))
(array([ 6, 9, 7, 11]), array([4, 5, 2, 5]), array([2, 4, 5, 6]))
- 拓展
养成显式定义所有张量和操作对象的习惯,不仅可使代码更具可读性,还可以帮助你以更清晰的方式可视化计算图。