深度学习之TensorFlow——基本使用

一、目前主流的深度学习框架Caffe, TensorFlow, MXNet, Torch, Theano比较

|------------|-------------------------------------------------------------|--------|---------|--------|----------|------------------------------------------------------|----------|
| 库名称 | 开发语言 | 速度 | 灵活性 | 文档 | 适合模型 | 平台 | 上手难易 |
| Caffe | c++/cuda | 快 | 一般 | 全面 | CNN | 所有系统 | 中等 |
| TensorFlow | c++/cuda/Python | 中等 | 好 | 中等 | CNN/RNN | Linux, OSX | 难 |
| MXNet | c++/cuda | 快 | 好 | 全面 | CNN | 所有系统 | 中等 |
| Torch | c/lua/cuda | 快 | 好 | 全面 | CNN/RNN | linux, OSX | 中等 |
| Theano | python/c++/cuda | 中等 | 好 | 中等 | CNN/RNN | Linux, OSX | 易 |

二、TensorFlow的编程思想

TensorFlow 使用graph来表示计算任务. 图中的节点被称之为 op (operation 的缩写). 一个 op获得 0 个或多个 Tensor(类型化多维数组) , 执行计算, 产生 0 个或多个 Tensor .

一个tensorflow的图描述了计算的过程,图必须在session里被启动,session将图的op分发到cpu或gpu之类的设备上,同时提供执行op的方法,被执行后将产生的tensor返回。python语言中,返回的tensor是numpy对象;c/c++语言中,返回的是tensorflow::Tensor实例。

计算图的两个阶段:构建阶段和执行阶段。

构建阶段,op执行步骤被描述成一个图(创建一个图表示和训练神经网络)。执行阶段使用session执行图中的op(反复执行图中的训练op)。

(1)构建图

第一步是创建源op(source op),不需要任何输入,源op的输出被传递给其他op做运算(python库中,op构造器的返回值代表构造出的op的输出),tensorflow python库中有一个默认图,op构造器可以为其增加节点,这个默认图对许多程序来货已经够用了。

|----------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import tensorflow as tf # 创建一个常量 op, 产生一个 1x2 矩阵. 这个 op 被作为一个节点 # 加到默认图中. # # 构造器的返回值代表该常量 op 的返回值. matrix1 ``= tf.constant([[``3.``, ``3.``]]) # 创建另外一个常量 op, 产生一个 2x1 矩阵. matrix2 ``= tf.constant([[``2.``],[``2.``]]) # 创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入. # 返回值 'product' 代表矩阵乘法的结果. product ``= tf.matmul(matrix1, matrix2) #只是构造,如果要真正进行矩阵相乘,必须在session里启动这个图。 |

函数说明:

1.tf.constant(value,dtype=None,shape=None,name='Const')

创建一个常量tensor,按照给出value来赋值,可以用shape来指定其形状。value可以是一个数,也可以是一个list。如果是一个数,那么这个常量中所有值都按该数来赋值。如果是list,那么len(value)一定要小于等于shape展开后的长度。赋值时,先将value中的值逐个存入。不够的部分,则全部存入value的最后一个值。例如:

|----------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | a ``= tf.constant(``2``,shape``=``[``2``]) b ``= tf.constant(``2``,shape``=``[``2``,``2``]) c ``= tf.constant([``1``,``2``,``3``],shape``=``[``6``]) d ``= tf.constant([``1``,``2``,``3``],shape``=``[``3``,``2``]) sess ``= tf.InteractiveSession() print``(sess.run(a)) #[2 2] print``(sess.run(b)) #[[2 2] # [2 2]] print``(sess.run(c)) #[1 2 3 3 3 3] print``(sess.run(d)) #[[1 2] # [3 3] # [3 3]] |

2. tf.matmul()用来做矩阵乘法。若a为l*m的矩阵,b为m*n的矩阵,那么通过tf.matmul(a,b) 结果就会得到一个l*n的矩阵。

不过这个函数还提供了很多额外的功能。我们来看下函数的定义:

matmul(a, b,

transpose_a=False, transpose_b=False,

a_is_sparse=False, b_is_sparse=False,

name=None):

可以看到还提供了transpose和is_sparse的选项。如果对应的transpose项为True,例如transpose_a=True,那么a在参与运算之前就会先转置一下。而如果a_is_sparse=True,那么a会被当做稀疏矩阵来参与运算。

(2)在一个会话session中启动图

第一步是创建一个session对象。

|-------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # 启动默认图. 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 如果机器上有超过一个可用的 GPU, 除第一个外的其它 GPU 默认是不参与计算的. 为了让 TensorFlow 使用这些 GPU, 你必须将 op 明确指派给它们执行. with...Device 语句用来指派特定的 CPU 或 GPU 执行操作: with tf.Session() as sess: ``with tf.device(``"/gpu:1"``): ``#表示机器第二个GPU ``matrix1 ``= tf.constant([[``3.``, ``3.``]]) ``matrix2 ``= tf.constant([[``2.``],[``2.``]]) ``product ``= tf.matmul(matrix1, matrix2) ``... |

(3) 交互式使用

文档中的 Python 示例使用一个会话 Session 来启动图, 并调用 Session.run() 方法执行操作. 为了便于使用诸如 IPython 之类的 Python 交互环境, 可以使用 InteractiveSession 代替 Session 类, 使用 Tensor.eval() 和 Operation.run() 方法代替 Session.run(). 这样可以避免使用一个变量来持有会话.

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

函数说明:

1. tf.Session()与tf.InteractiveSession()的区别?

tf.InteractiveSession()加载它自身作为默认构建的session,tensor.eval()和operation.run()取决于默认的session. 换句话说:InteractiveSession 输入的代码少,原因就是它允许变量不需要使用session就可以产生结构(运行在没有指定会话对象的情况下运行变量)。

2. tf.Variable()

一个变量通过调用run()方法来维持图的状态,我们通过构造variable类的实例来添加一个变量到图中。Variable()构造器需要一个初始值,可以是任意类型和shape 的Tensor。构造完成之后,变量的type和shape 是固定的。可以使用assign 方法来修改变量的值。

eg:update = tf.assign(state,new_value) #意思是state=new_value,而这个操作行为被赋给了update

如果你想修改变量的shape,你必须使用assign 操作,并且 validate_shpe=False。

属性:

device:这个变量的device

dtype:变量的元素类型

graph:存放变量的图

initial_value:这个变量的初始值

initializer :这个变量的初始化器

name:这个变脸的名字

**op:**The Operation of this variable.

|----------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # 创建一个变量, 初始化为标量 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.initialize_all_variables() # 启动图, 运行 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.

3. tf.Tensor.eval(feed_dict=None, session=None):

作用: 在一个Seesion里面"评估"tensor的值(其实就是计算),首先执行之前的所有必要的操作来产生这个计算这个tensor需要的输入,然后通过这些输入产生这个tensor。在激发tensor.eval()这个函数之前,tensor的图必须已经投入到session里面,或者一个默认的session是有效的,或者显式指定session.

参数:

feed_dict:一个字典,用来表示tensor被feed的值(联系placeholder一起看)

session:(可选) 用来计算(evaluate)这个tensor的session.要是没有指定的话,那么就会使用默认的session。

返回:表示"计算"结果值的numpy ndarray

4. Tensor

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

5. Fetch

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

|----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 | 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)] |

6. Feed

TensorFlow 还提供了 feed 机制, 该机制可以临时替代图中的任意操作中的 tensor 可以对图中任何操作提交补丁, 直接插入一个 tensor.feed使用一个tensor值临时替换一个操作的输出结果. 你可以提供 feed 数据作为 run() 调用的参数. feed 只在调用它的方法内有效, 方法结束, feed 就会消失. 最常见的用例是将某些特殊的操作指定为 "feed" 操作, 标记的方法是使用 tf.placeholder() 为这些操作创建占位符.

|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 | 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)] |

相关推荐
FIN666832 分钟前
2024CSCO 芦康沙妥珠单抗创造晚期TNBC二线治疗新高度
大数据·人工智能
jiamiyanjie37 分钟前
Pencils Protocol 成市场新宠,生态通证$DAPP价值几何
人工智能·区块链
百度安全1 小时前
2024网安周 | 百度安全深度参与,探索人工智能与数字安全的融合发展之路
人工智能·安全·百度
奕直张不大1 小时前
NLP基础
人工智能·自然语言处理
多吃轻食1 小时前
人工智能与自然语言处理发展史
人工智能·深度学习·神经网络·ai·自然语言处理
Hiweir ·1 小时前
20_BERT微调训练
人工智能·pytorch·深度学习·bert
萱仔学习自我记录1 小时前
NLP任务一些常用的数据集集锦
人工智能·自然语言处理
dingzd951 小时前
从Web2到Web3:探索下一代互联网的无限可能性
人工智能·web3·去中心化·区块链·智能合约
surfirst1 小时前
如何使用 ChatGPT 生成万字长文?
人工智能·chatgpt
AcademicIdeas学境思源1 小时前
逆向推理+ChatGPT,让论文更具说服力
人工智能·深度学习