1、TensorFlow简介
>使用计算图 (graph) 来表示计算任务.
>在被称之为会话 (Session) 的上下文 (context) 中执行图.
>使用 tensor 表示数据.
>通过变量 (Variable) 维护状态.
>使用feed和fetch可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据.
TensorFlow 是一个编程系统, 使用图来表示计算任务. 图中的节点被称之为 op (operation 的缩写). 一个 op 获得 0 个或多个 Tensor, 执行计算, 产生 0 个或多个 Tensor. 每个 Tensor 是一个类型化的多维数组. 例如, 你可以将一小组图像集表示为一个四维浮点数数组, 这四个维度分别是 [batch, height, width, channels].
一个 TensorFlow 图描述了计算的过程. 为了进行计算, 图必须在 会话 里被启动. 会话 将图的 op 分发到诸如 CPU 或 GPU 之类的 设备 上, 同时提供执行 op 的方法. 这些方法执行后, 将产生的 tensor 返回. 在 Python 语言中, 返回的 tensor 是 numpy ndarray 对象; 在 C 和 C++ 语言中, 返回的 tensor 是 tensorflow::Tensor 实例.
2、计算图:
一个使用TensorFlow编写的程序主要分为两个部分,一个是构建计算图部分,一个是执行计算图。在构建阶段, op 的执行步骤被描述成一个图。在执行阶段, 使用会话执行执行图中的 op。例如, 通常在构建阶段创建一个图来表示和训练神经网络, 然后在执行阶段反复执行图中的训练 op.
3、张量(tensor):
TensorFlow即Tensor(张量)+Flow(流动).Tensor即张量,TensorFlow 程序使用 tensor 数据结构来代表所有的数据, 程序中数据的流转都是采用tensor的形式进行的。在TensorFlow中,可以将张量理解为数组。如果是0阶张量,那么将代表这个张量是一个标量,也就是一个数字。如果是一阶张量可以理解为向量或者是一维数组,n阶张量可以理解为n维的数组。但TensorFlow的张量的实现并没有直接采用数组的形式,张量它只是对运算结果的引用。此外,TensorFlow的张量和numpy的数组是不一样的,TensorFlow的计算结果不是一个数组而是一个张量的结构形式,在这个张量中,它包含了三个重要的属性,名字、维度、类型。
4、会话(session)
图必须在会话(Session)里被启动.会话(Session)将图分发到设备(CPU/GPU)上,并提供执行节点op的方法,计算结果以tensor返回。Session提供的是运行环境,用完要及时释放.释放方式有两种:显式关闭/调用代码块。
5、安装(参考博文),下面是使用实例
1)显式关闭会话
# 计算两个向量的乘积:
import tensorflow as tf
# 产生一个 1x2 矩阵,加到默认图中
# 两个常量op
matrix1 = tf.constant([[3., 1.]])
matrix2 = tf.constant([[2.], [3.]])
# 一个矩阵乘法op
product = tf.matmul(matrix1, matrix2)
# 启动默认图
sess = tf.Session()
# 函数调用run()触发图中三个op的执行
result = sess.run(product)
print result
# 关闭会话
sess.close()
2)采用代码块:使用with句块开始一个会话,在with句块结束时会话(Session)会被自动析构释放掉.
# 计算两个向量的乘积:
import tensorflow as tf
# 产生一个 1x2 矩阵,加到默认图中
# 两个常量op
matrix1 = tf.constant([[3., 1.]])
matrix2 = tf.constant([[2.], [3.]])
# 一个矩阵乘法op
product = tf.matmul(matrix1, matrix2)
with tf.Session() as sess:
result = sess.run([product])
print result
3)交互式会话InteractiveSession()
InteractiveSession() 主要是避免 Session(会话)被一个变量持有。
a = tf.constant(1.0)
b = tf.constant(2.0)
c = a + b
# 下面的两种情况是等价的
with tf.Session():
print c.eval()
sess = tf.InteractiveSession()
print (c.eval())
sess.close()
#输出:
3.0
3.0
4)使用tf.train.Supervisor(logdir=logdir, init_op=tf.global_variables_initializer()).managed_session():简化编程,避免显示地实现restore操作,在从文件读取数据时,可以避免使用tf.train.start_queue_runners(),参考。
Supervisor帮助我们处理一些事情
(1)自动去checkpoint加载数据或初始化数据
(2)自身有一个Saver,可以用来保存checkpoint
(3)有一个summary_computed用来保存Summary
所以,我们就不需要:
(1)手动初始化或从checkpoint中加载数据
(2)不需要创建Saver,使用sv内部的就可以
(3)不需要创建summary writer
实例:
在不使用Supervisor的时候,我们的代码经常是这么组织的:
variables
...
ops
...
summary_op
...
merge_all_summarie
saver
init_op
with tf.Session() as sess:
writer = tf.tf.train.SummaryWriter()
sess.run(init)
saver.restore()
for ...:
train
merged_summary = sess.run(merge_all_summarie)
writer.add_summary(merged_summary,i)saver.save
下面介绍如何用Supervisor来改写上面程序:
a = tf.Variable(1)
b = tf.Variable(2)
c = tf.add(a,b)
update = tf.assign(a,c)
tf.scalar_summary("a",a)
init_op = tf.initialize_all_variables()
merged_summary_op = tf.merge_all_summaries()
sv = tf.train.Supervisor(logdir="/home/keith/tmp/",init_op=init_op) #logdir用来保存checkpoint和summary
saver=sv.saver # 创建saver
with sv.managed_session() as sess: #会自动去logdir中去找checkpoint,如果没有的话,自动执行初始化
for i in xrange(1000):
update_ = sess.run(update)
print update_
if i % 10 == 0:
merged_summary = sess.run(merged_summary_op)
sv.summary_computed(sess, merged_summary,global_step=i)
if i%100 == 0:
saver.save(sess,logdir="/home/keith/tmp/",global_step=i)
5)会话(Session)将图分发到设备(CPU/GPU)上:
当设备上不止一个GPU时,需要使用with…Device语句指定op操作到不同的CPU或GPU上。使用字符串指定设备的标识:“/cpu:0”:CPU
“/gpu:0”:第一个GPU
“/gpu:1”:第二个GPU
import tensorflow as tf
with tf.Session() as sess:
with tf.device("/cpu:0"):
matrix1 = tf.constant([[1., 3., 1]])
matrix2 = tf.constant([[3.], [2.], [1.]])
product = tf.matmul(matrix1, matrix2)
sess = tf.Session()
result = sess.run([product])
print result