TensorFlow学习笔记1

TensorFlow框架的基本使用

TensorFlow是谷歌开源的深度学习平台,在Github上拥有最多的Star数。足见其影响力有多大!所以自己决定系统的学习一下框架的基本构成和使用方法。

首先必须了解TensorFlow遵循的几个原则:
* 使用 (Graph) 来表示计算任务.
* 在被称之为 会话 (Session)上下文 (context) 中执行图.
* TensorFlow 程序使用 tensor 数据结构来代表所有的数据, 计算图中, 操作间传递的数据都是 tensor.可以把 TensorFlow tensor 看作是一个 n 维的数组或列表.
* 通过 变量 (Variable) 维护状态.
* 使用 feed 和 fetch 可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据.

TensorFlow 是一个编程系统, 使用图来表示计算任务. 图中的节点被称之为 op (operation 的缩写). 一个 op 获得 0 个或多个 Tensor, 执行计算,产生 0 个或多个 Tensor. 每个 Tensor 是一个类型化的多维数组.
例如, 你可以将一小组图像集表示为一个四维浮点数数组,
这四个维度分别是 [batch, height, width, channels].

如何通过会话来实现一个简单的矩阵乘法?

  • 首先创建源 op (source op). 源 op 不需要任何输入, 例如 常量 (Constant). 源 op 的输出被传递给其它 op 做运算. 代码形式就为:
import tensorflow as tf` #引入TensorFlow库
matrix1 = tf.constant([[3.,3.]]) #创建op,1*2的矩阵。这个 op 被作为一个节点加到默认图中
matrix2 = tf.constant([[2.],[2.]]) #创建另一个op,2*1的矩阵。
product = tf.matmul(matrix1,maxtrix2)#矩阵相乘
  • 在会话中启动图
    启动图的第一步是创建一个 Session 对象, 如果无任何创建参数, 会话构造器将启动默认图.相关代码为:
    sess = tf.session()#启动默认图
    然后调用 sess 的 ‘run()’ 方法来执行矩阵乘法 op,传入 ‘product’ 作为该方法的参数:
    result = sess.run(product)
    打印结果:
    print result
    输出为==>[[ 12.]]
    sess.close() # 关闭会话
    当然 也可以使用这种方式来完成自动关闭的操作:
 with tf.Session() as sess:
 result = sess.run([product])
 print result

如何显示地调用GPU?

在实现上, TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU或 GPU). 一般你不需要显式指定使用 CPU 还是 GPU, TensorFlow 能自动检测. 如果检测到 GPU, TensorFlow 会尽可能地利用找到的第一个 GPU 来执行操作.

如果机器上有超过一个可用的 GPU, 除第一个外的其它 GPU 默认是不参与计算的. 为了让 TensorFlow
使用这些 GPU, 你必须将 op 明确指派给它们执行. 可以通过下面的形式来执行操作:

with tf.Session() as sess:
    with tf.device("/gpu:1"):
        matrix1 = tf.constant([[3.,3.]]
        matrix2 = tf.constant([[2.],[2.]])
        product = tf.matmul(matrix1, matrix2)
        ...

调用规则如下:

*  `"/cpu:0"`: 机器的 CPU.
*  `"/gpu:0"`: 机器的第一个 GPU, 如果有的话.
*  `"/gpu:1"`: 机器的第二个 GPU, 以此类推.

如何使用交互式的TensorFlow对话?

目的:为了便于使用诸如 IPython 之类的 Python 交互环境
代码步骤:

import tensorflow as tf
sess = tf.InteractiveSession() #创建交互式对话
a = tf.Variable([1.0, 2.0])
b = tf.constant([3.0, 3.0])
a.initializer.run() #使用初始化器 initializer op 的 run() 方法初始化 'a'
sub = tf.sub(a,b) #增加一个减法 sub op, 从 'x' 减去 'a'. 运行减法 op, 输出结果 
print = sub.eval() #结果为==> [-2. -1.]

如何使用变量实现一个简单的计数器?

state = tf.Variable(0,name = "counter") #创建一个变量, 初始化为标量 0.
one = tf.constant(1) #创建一个 op, 其作用是使 state 增加 1
new_value = tf.add(state,one)
update = tf.assign(state,new_value)#图所描绘的表达式的一部分,如 `add()` 操作一样.
init_op = tf.initialize_all_variables() #初始化(init) op 操作
# 启动图, 运行 op
with tf.Session() as sess:
    sess.run(init_op) #运行 'init' op
    print sess.run(state) #打印 'state' 的初始值
    # 运行 op, 更新 'state', 并打印 'state'
    for _ in range(3)
        sess.run(update)
        print sess.run(state)
运行结果是:
# 0
# 1
# 2
# 3

总结:通常会将一个统计模型中的参数表示为一组变量。例如可以将一个神经网络的权重作为某个变量存储在一个 tensor 中。在训练过程中, 通过重复运行训练图, 更新这个 tensor。

另外,在使用 Session 对象的 run() 调用 执行图时,怎么取回多个节点。在之前的例子里, 我们只取回了单个节点 state

input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2,input3)
mul = tf.mul(input1,intermed)

with tf.Session() as sess:
    result = sess.run([mul, intermed])
    print result

#输出: [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]

总结:需要获取的多个 tensor 值,在 op 的一次运行中一起获得,而不是逐个去获取 tensor。

feed机制!!

该机制可以临时替代图中的任意操作中的 tensor,可以对图中任何操作提交补丁, 直接插入一个 tensor。
feed 只在调用它的方法内有效, 方法结束, feed 就会消失. 最常见的用例是将某些特殊的操作指定为 “feed” 操作,方法是使用 tf.placeholder() 为这些操作创建占位符.

input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.mul(input1, input2)

with tf.Session() as sess:
    print sess.run([output], feed_dict = {input1:[7.], input2:[2.]}

#输出:[array([ 14.], dtype=float32)]

[feed MNIST的教程] (http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_tf.html)

全文参考:http://wiki.jikexueyuan.com/project/tensorflow-zh/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值