TensorFlow2

来源:互联网 发布:网络活动策划书籍 编辑:程序博客网 时间:2024/05/16 02:53

TensorFlow 基本使用

使用TensorFlow,你必须明白TensorFlow

    • 使用图(graph)来表示任务
    • 被称之为会话(Session)的上下文(context)中执行图
    • 使用tensor表示数据
    • 通过变量(Variable)维护状态
    • 使用feedfetch可以为任意操作(arbitrary operation)赋值或者从其中获取数据

    综述

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

    一个TensorFlow图描述了计算的过程,为了进行计算,图必须在会话里被启动,会话将图的op分发到诸如CPU或GPU之类的设备上,同时提供执行op的方法,这些方法执行后,将产生的tensor返回。在python语言中,返回的tensornumpy ndarry对象;在C/C++语言中,返回的是tensortensorflow::Tensor实例。

    计算图

    Tensorflow程序通常被组织成一个构建阶段和一个执行阶段,在构建阶段,op的执行步骤被描述成为一个图,在执行阶段,使用会话执行图中的op

    例如,通常在构建阶段创建一个图来表示和训练神经网络,然后在执行阶段反复执行图中的训练op

    Tensorflow支持C/C++,python编程语言。目前,TensorFlow的python库更易使用,它提供了大量的辅助函数来简化构建图的工作,这些函数尚未被C/C++库支持。

    三种语言的会话库(session libraries)是一致的。

    构建图

    构件图的第一步是创建源op (source op)。源op不需要任何输入。源op的输出被传递给其它op做运算。

    python库中,op构造器的返回值代表被构造出的op输出,这些返回值可以传递给其它op作为输入。

    TensorFlow Python库中有一个默认图(default graph)op构造器可以为其增加节点。这个默认图对许多程序来说已经足够用了,可以阅读Graph类文档,来了解如何管理多个视图。

    import tensorflow as tf# 创建一个常量op, 产生一个1x2矩阵,这个op被作为一个节点# 加到默认视图中# 构造器的返回值代表该常量op的返回值matrix1 = tr.constant([[3., 3.]])# 创建另一个常量op, 产生一个2x1的矩阵matrix2 = tr.constant([[2.], [2.]])# 创建一个矩阵乘法matmul op,把matrix1和matrix2作为输入:product = tf.matmul(matrix1, matrix2)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    默认图现在有三个节点,两个constant() opmatmul() op。为了真正进行矩阵乘法的结果,你必须在会话里启动这个图。

    在一个会话中启动图

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

    欲了解完整的会话API,请阅读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()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    Session对象在使用完成后需要关闭以释放资源,除了显式调用close外,也可以使用with代码来自动完成关闭动作:

    with tf.Session() as sess:  result = sess.run([product])  print result
    • 1
    • 2
    • 3

    在实现上,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)
    • 1
    • 2
    • 3
    • 4
    • 5

    设备用字符串进行标识,目前支持的设备包括:

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

    交互式使用

    文档中的python示例使用一个会话Session来启动图,并调用Session.run()方法执行操作。

    为了便于使用诸如IPython之类的python交互环境,可以使用InteractiveSession代替Session类,使用Tensor.eval()Operation.run()方法代替Session.run()。这样可以避免使用一个变量来持有会话:

    # 进入一个交互式Tensorflow会话import tensorflow as tfsess = tf.InteractiveSession()x = tf.Variable([1.0, 2.0])a = tf.constant([3.0, 3.0]);# 使用初始化器initializer op的run()方法初始化xx.initializer.run()# 增加一个减法sub op,从x减去a。运行减法op,输出结果sud = tf.sub(x, a)print sub.eval()# ==>[-2. -1.]
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    Tensor

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

    Tensorflow系统中,张量的维数被描述为阶。但是张量的阶和矩阵的阶并不是同一个概念。张量的阶是张量维数的一个数量描述,下面的张量(使用python中list定义的)就是2阶:

    t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    • 1

    你可以认为一个二阶张量就是我们平常所说的矩阵,一阶张量可以认为是一个向量。对于一个二阶张量,你可以使用语句t[i, j]来访问其中的任何元素。而对于三阶张量你可以通过t[i, j, k]来访问任何元素:

    阶数学实例python例子0纯量(只有大小)s=4831向量(大小和方向)v=[1.1, 2.2, 3.3]2矩阵(数据表)m=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]33阶张量t=[[[2], [4], [6]], [[8], [9], [10]], [[11], [12], [13]]]nn

    形状

    Tensorflow文档中使用了三种记号来方便地描述张量的维度:阶,形状以及维数。以下展示了它们之间的关系:

    阶形状维数实例0[]0-D一个0维张量,一个纯量1[D0]1-D一个1维张量的形式[5]2[D0, D1]2-D一个2维张量的形式[3, 4]3[D0, D1, D2]3-D一个3维张量的形式[1, 4, 3]n[D0, D1, ... Dn]n-D一个n维张量的形式[D0, D1, ..., Dn]

    数据类型

    除了维度,tensor有一个数据类型属性。你可以为一个张量指定下列数据类型中的任意一个类型:

    数据类型python类型描述DT_FLOATtf.float3232位浮点数DT_DOUBLEtf.float6464位浮点数DT_INT64tf.int6464位有符号整型DT_INT32tf.int3232位有符号整型DF_INT16tf.int1616位有符号整型DT_INT8tf.int88位有符号整型DT_UINT8tf.uint88位无符号整型DT_STRINGtf.string可变长度的字节数组,每一个张量元素都是一个字节数组DT_BOOLtf.bool布尔型DT_COMPLEX64tf.complex64由32位浮点数组成的负数:实数和虚数DT_QINT32tf.qint32用于量化Ops的32位有符号整型DT_QINT8tf.qint8用于量化Ops的8位有符号整型DT_QUINT8tf.quint8用于量化Ops的8位无符号整型

    变量

    在Variables 中查看更多细节。变量维护图执行过程中的状态信息。下面的例子演示了如何使用变量实现一个简单的计数器:

    # 创建一个变量,初始为标量0state = tf.Variable(0, name="counter")# 创建一个op,其作用是使`state`增加1one = tf.constant(1)new_value = tf.add(state, one)update = tf.assign(state, new_value)# 启动图后,变量必须先经过init op初始化# 首先先增加一个初始化op到图中init_op = tf.initialize_all_variables()# 启动图with tf.Session() as sess:  # 运行init op  sess.run(init_op)  # 打印 state 的初始值  print sess.run(state)  # 运行op, 更新state 并打印  for _ in range(3):    sess.run(update)    print sess.run(state)# 输出:# 0# 1# 2# 3
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    代码中assign()操作是图所描述的表达式的一部分,正如add()操作一样,所以在调用run()执行表达式之前,它并不会真正执行赋值操作。

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

    Fetch

    为了取回操作的输出内容,可以在使用Session对象的run()调用执行图时,传入一些tensor,这些tensor会帮助你取回结果。在之前的例子里,我们只取回了单个节点state,但是你也可以取回多个tensor:

    input1 = tf.constant(3.0)input2 = tf.constant(4.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# print# [27.0, 9.0]
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    需要获得更多个tensor值,在op的依次运行中获得(而不是逐个去获得tenter)。

    Feed

    上述示例在计算图中引入tensor,以常量或变量的形式存储。Tensorflow还提供了feed机制,该机制可以临时替代图中的任意操作中的tensor可以对图中任何操作提交补丁,直接插入一个tensor

    feed使用一个tensor值临时替换一个操作的输出结果,你可以提供feed数据作为run()调用的参数。feed只在调用它的方法内有效,方法结束,feed就会消失。最常见的用例是将某些特殊的操作指定为feed操作,标记的方法是使用tf.placeholder()为这些操作创建占位符。

    input1 = tf.placeholder(tf.types.float32)input2 = tf.placeholder(tf.types.float32)output = tf.mul(input1, input2)with tf.Session() as see:  print sess.run([output], feed_dict={input:[7.], input2:[2.]})# print# [array([ 14.], dtype=float32)]
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    转自:极客学院:Tensorflow基本使用