TensorFlow :HelloWorld

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值