TensorFlow官方文档笔记(一)

TensorFlow的简介和基本用法

介绍TensorFlow


  • TensorFlow是一个采用数据流图(data-flow-graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

  • 数据流图(Data Flow Graph)

    • 数据流图用“节点”(nodes)和“线”(edges)的有向图来描述数学计算。
    • “节点” 一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。
    • “线”表示“节点”之间的输入/输出关系。这些数据“线”可以输运“size可动态调整”的多维数据数组,即“张量”(tensor)。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。
  • TensorFlow的特征
    • 高度的灵活性:TensorFlow 不是一个严格的“神经网络”库。只要你可以将你的计算表示为一个数据流图,你就可以使用Tensorflow。
    • 真正的可移植性(Portability):Tensorflow 在CPU和GPU上运行,比如说可以运行在台式机、服务器、手机移动设备等等。
    • 将科研和产品联系在一起:使用Tensorflow可以让应用型研究者将想法迅速运用到产品中,也可以让学术性研究者更直接地彼此分享代码,从而提高科研产出率。
    • 自动求微分:基于梯度的机器学习算法会受益于Tensorflow自动求微分的能力。你只需要定义预测模型的结构,将这个结构和目标函数(objective-function)结合在一起,并添加数据,Tensorflow将自动为你计算相关的微分导数。
    • 多语言支持:Tensorflow 有一个合理的c++使用界面,也有一个易用的python使用界面来构建和执行你的graphs。你可以直接写python/c++程序,也可以用交互式的ipython界面来用Tensorflow尝试些想法,它可以帮你将笔记、代码、可视化等有条理地归置好。
    • 性能最优化:由于Tensorflow给予了线程、队列、异步操作等以最佳的支持,你可以自由地将Tensorflow图中的计算元素分配到不同设备上,Tensorflow可以帮你管理好这些不同副本。
# 下列代码生成了一些三维数据,然后用一个平面拟合它。

import tensorflow as tf
import numpy as np

# 使用Numpy生成假数据(phony data),总共100个点。
x_data = np.float32(np.random.rand(2, 100))  # 随机输入
y_data = np.dot([0.100, 0.200], x_data) + 0.300

# 构造一个线性模型
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)

# 初始化变量
init = tf.global_variables_initializer() # 原来的tf.initialize_all_variable已经过时了 

# 启动图(graph)
sess = tf.Session()
sess.run(init)

# 拟合平面
for step in  range(0, 201):
    sess.run(train)
if step % 20 == 0:
    print (step, sess.run(W), sess.run(b))

# 得到最佳拟合结果W:[[0.100 0.200]],b:[0.300]

基本用法


基本使用

  • 使用 TensorFlow,你必须明白 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 实例。

计算图

  • TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段。在构建阶段,op的执行步骤被描述成一个图。在执行阶段,使用会话执行执行图中的op。
  • 例如:通常在构建阶段创建一个图来表示和训练神经网络, 然后在执行阶段反复执行图中的训练op。
  • TensorFlow 支持 C,C++,Python 编程语言。目前,TensorFlow 的 Python 库更加易用,它提供了大量的辅助函数来简化构建图的工作,这些函数尚未被 C 和 C++ 库支持。三种语言的会话库 (session libraries) 是一致的。

构建图

  • 构建图的第一步是创建源 op (source op。 源 op 不需要任何输入,例如常量 (Constant)。源 op 的输出被传递给其它 op 做运算。
  • Python 库中,op 构造器的返回值代表被构造出的 op 的输出,这些返回值可以传递给其它 op 构造器作为输入。
  • TensorFlow Python 库有一个默认图 (default graph), op 构造器可以为其增加节点,这个默认图对许多程序来说已经足够用了。
import tensorflow as tf

# 创建一个常量op,产生一个1*2矩阵,这个op被作为一个节点。
# 加到默认图中。
# 构造器的返回值代表该常量op的返回值。
matrix1 = tf.constant([[3., 3.]])  # 注意即使是一维矩阵,仍然要两个中括号。

# 创建另外一个常量op,产生一个2*1矩阵。
matrix2 = tf.constant([[2.], [2.]]) 

# 创建一个矩阵乘法matmul op,把'matrix1''matrix2'作输入。
# 返回值'product'代表矩阵乘法的结果。
product = tf.matmul(matrix1, matrix2)
  • 默认图现在有三个节点:两个 constant() op,和一个matmul() op。为了真正进行矩阵相乘运算,并得到矩阵乘法的 结果,必须在会话里启动这个图。

在一个会话中启动图

  • 构造阶段完成后,才能启动图。启动图的第一步是创建一个 Session 对象,如果无任何创建参数,会话构造器将启动默认图。
# 启动默认图。
sess = tf.Session()

# 调用sess的'run()'方法来执行矩阵乘法op,传入'product'作为该方法的参数。
# 'product'代表了矩阵乘法op的输出,传入它是向方法表明,我们希望取回。
# 矩阵乘法op的输出。
#
# 整个执行过程是自动化的,会话负责传递op所需的全部输入,op通常是并发执行的。
#
# 函数调用'run(product)'触发了图中三个op(两个常量op和一个矩阵乘法op)的执行。
#
# 返回值'result'是一个numpy`ndarray`对象。
result = sess.run(product)
print (result)
# ==>[[12.]]

# 任务完成,关闭会话。
sess.close()
  • Session 对象在使用完后需要关闭以释放资源。除了显式调用 close 外,也可以使用 “with” 代码块来自动完成关闭动作。
with tf.Session() as sess:
    result = sess.run([product])
    print result        
  • 在实现上,TensorFlow 将图形定义转换成分布式执行的操作,以充分利用可用的计算资源(如 CPU 或 GPU)。一般你不需要显式指定使用 CPU 还是 GPU,TensorFlow 能自动检测。如果检测到 GPU,TensorFlow 会尽可能地利用找到的第一个 GPU 来执行操作。

  • 如果机器上有超过一个可用的 GPU,除第一个外的其它 GPU 默认是不参与计算的。为了让 TensorFlow 使用这些 GPU,你必须将 op 明确指派给它们执行。with…Device 语句用来指派特定的 CPU 或 GPU 执行操作:

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,以此类推。

交互式使用

  • 为了便于使用诸如 IPython 之类的 Python 交互环境,可以使用 InteractiveSession 代替 Session 类,使用 Tensor.eval() 和 Operation.run() 方法代替 Session.run(),这样可以避免使用一个变量来持有会话。
# 进入一个交互式TensorFlow会话。
import tensorflow as tf
sess = tf.InteractiveSession()

x = tf.Variable([1.0, 2.0])
a = tf.constant([3.0, 3.0])

# 使用初始化器initialzer op的run()方法初始化'x'
x.initializer.run()

# 增加一个减法sub op,从'x'减去'a',运行减法op,输出结果。
sub = tf.subtract(x, a) # 源代码中的sub已经过时,换成了subtract,需要改正过来。
print (sub.eval())

# ==>[-2., -1.]

Tensor

  • TensorFlow 程序使用 tensor 数据结构来代表所有的数据,计算图中,操作间传递的数据都是 tensor。
  • 可以把 tensor 看作是一个 n 维的数组或列表,一个 tensor 包含一个静态类型 rank,和 一个 shape。

变量

  • 变量维护图执行过程中的状态信息。
  • 下面的例子演示了如何使用变量实现一个简单的计数器。
import tensorflow as tf
# 创建一个变量,初始化为标量0。
state = tf.Variable(0, name = "counter")

# 创建一个op,其作用是使state增加1

one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)

# 启动图后,变量必须先经过'初始化'(init)op初始化。
# 首先必须增加一个'初始化'op到图中。
init_op = tf.global_variables_initializer()

# 启动图,运行op
with tf.Session() as sess:
    # 运行'init'op
    sess.run(init_op)
    # 打印'state'的初始值
    print(sess.run(state))
    # 运行op,更新'state',并打印'state'
    for _ in range(3):
        sess.run(update)
        print(sess.run(state))

>>>
0
1
2
3 
  • 代码中 assign() 操作是图所描绘的表达式的一部分,正如 add() 操作一样。所以在调用 run() 执行表达式之前,它并不会真正执行赋值操作。
  • 通常会将一个统计模型中的参数表示为一组变量。例如,你可以将一个神经网络的权重作为某个变量存储在一个 tensor 中,在训练过程中通过重复运行训练图,更新这个 tensor。

Fetch

  • 为了取回操作的输出内容,可以在使用 Session 对象的 run() 调用 执行图时,传入一些 tensor,这些 tensor 会帮助你取回结果。
  • 我们既可以取回单个节点 state, 也可以取回多个 tensor:
import tensorflow as tf
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2, input3)
mul = tf.multiply(input1, intermed) # mul已经过时,必须改为multiply

with tf.Session() as sess:  # 源代码缺少as sess,补回去即可
    result = sess.run([mul, intermed])
    print(result)

# 输出:
# [21.0, 7.0]

Feed

  • TensorFlow 还提供了 feed 机制,该机制可以临时替代图中的任意操作中的 tensor,还可以对图中任何操作提交补丁,直接插入一个 tensor。
  • feed 使用一个 tensor 值临时替换一个操作的输出结果。
  • 可以提供 feed 数据作为 run() 调用的参数。
  • 最常见的用例是将某些特殊的操作指定为 “feed” 操作,标记的方法是使用 tf.placeholder() 为这些操作创建占位符。
import tensorflow as tf
input1 = tf.placeholder(tf.float32)  # 源代码的types要直接去掉
input2 = tf.placeholder(tf.float32)  # 源代码的types要直接去掉
output = tf.multiply(input1, input2)  # 源代码的mul改为multiply

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

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

猜你喜欢

转载自blog.csdn.net/faker1895/article/details/82217323