一、Tensorflow 扩展功能

1.自动求导

2.子图的执行

3.计算图控制流

4.队列/容器

Tensorflow 自动求导

当计算tensor C关于tensor W的梯度时,会先寻找从W到C的正向路径,然后从C回溯到W,对这条回溯路径上的每一个节点增加一个对应的求解梯度的节点,根据链式法则计算总的梯度。这就是反向传播算法。这些新增的节点会计算梯度函数,比如[db,dW,dx]=tf.gradients(C,[b,w,x])

自动求导虽然对用户很方便,但伴随而来的是Tensorflow对计算的优化(比如节点分配设备的策略)变得很麻烦,尤其是内存使用问题。如上图在反向传播过程中,我们仍需要用到计算图开头的tensor如W,x这些数据,因此它们仍需占用内存。

Tensorflow 子图的执行

Tensorflow支持单独执行子图,用户可以选择计算图的任意子图,并沿着某些边输入数据,同时从另一些边获取输出结果。

Tensorflow用节点名加port的形式指定数据。例如,bar:0表示名为bar的节点的第一个输出。在调用Session的run方法执行子图时,用户可以选择一组输入数据的映射,比如name:port->tensor;同时,用户必须指定一组输出数据,比如name[:port],来选择执行哪些节点,如果port也被选择,那么这些port输出的数据将会作为Run函数调用的结果返回。

当你指定好一个输入输出的子图时,震哥哥计算图就会根据新指定的输入输出进行调整,输入数据的节点会连接一个feed_node,输出数据的节点会连接一个fetch_node。Tensorflow会根据输出数据自动推导出哪些节点需要被执行。

Tensorflow计算图控制流

大部分的机器学习算法需要大量的逻辑判断和反复迭代,所以计算图的执行控制方式显得非常重要。

Tensorflow提供Switch Merge两种operator,可以根据某个布尔值跳过某段子图,然后把两段子图的结果合并,实现if-else的功能。

Tensorflow还提供了Enter,Leave以及NextIteration来实现循环和迭代。在使用高阶语言如python,java的if-else,while.for循环设计计算图的执行流程时,这些控制流会被自动编译为上述那些operator。Loop的每一次循环,会有唯一的tag。它的执行结果会输出成frame,这样用户可以方便的查询结果日志。

Tensorflow的控制流支持分布式,每一轮循环中的节点可能不同机器的不同设备上。分布式控制流的实现方式也是通过对计算图进行重构改写,循环内的节点会被划分到不同的小的子图上。每个子图连接控制节点,实现自己的循环。循环完成后,循环终止信号会被发送到其他子图。

Tensorflow队列和容器

队列是Tensorflow任务调度的一个重要特性。这个特性可以让计算图的不同节点异步的执行。使用队列的目的是当一个batch的数据运算时,提前从磁盘读取下一个数据,减少磁盘I/O的阻塞时间。同时还可以异步的计算许多梯度,在组合成一个更复杂的整体梯度。

除了传统的先进先出(FIFO)队列。Tensorflow还实现了洗牌队列(shuffling quene),用来满足某些机器学习算法对随机性的要求,对损失函数优化以及模型收敛会有帮助。

容器是TensorFlow中一种特殊的管理长期变量的机制,例如Variable变量对象就存放在容器中。每一个进程会有一个默认的容器一直存在,直到进程结束。使用容器还能够在不同的计算图的不同session之间共享一些状态变量。

二、TensorFlow性能优化

1.运算操作调度

2.异步计算支持

3.第三方计算库

4三种并行计算模式

Tensorflow运算操作节点重组与调度

Tensorflow中有很多高度抽象的运算操作,这些运算操作可能由很多复杂的计算组合而成。当有多个高阶运算操作同时存在时,他们的前几层可能是完全一致的重复计算(输入与运算内容一致)。TensorFlow会自动识别这些重复计算,同时改写计算图,只执行一次重复的计算,然后把这些高阶运算的后续计算全部连接到这些共有的计算上,避免冗余计算。

同时,巧妙地安排运算地顺序也可以极大地改善数据传输与内存占用地问题。比如,适当调整顺序以错开某些大块数据同时在内存中地时间,对于显存容量比较小的GPU来说,至关重要。

TensorFlow也会精细的安排接受节点的执行时间,如果接受节点过早的接受数据,那么数据会过早的堆积在设备内存中,所以,Tensorflow设计了接受策略,在刚好需要数据时词汇接收数据

TensorFlow异步计算

TensorFlow提供异步计算支持。这样线程执行时就无需一直等待某个计算节点完成。有一些节点,比如receive,enqueue,dequeue就是异步的实现。这些节点不必因等待I/O而阻塞一个线程继续执行其他任务

TensorFlow第三方计算库

TensorFlow并行计算模式

(1)数据并行模式

(2)模型并行模式

(3)流水线并行模式

数据并行计算模式:

通过把一个mini-batch的数据放在不同设备上计算,实现梯度计算的并行化。例如把1000个样本的mini-batch拆分成10份,每份100个样本,进行并行计算。完成后,把这10份梯度数据合并得到最终梯度并更新到共享的参数服务器。这样的操作会产生许多完全一样的子图的副本,在client上可以用一个线程同步控制这些副本运算的循环。

数据并行模式可以用异步方式来实现,使用多个线程控制梯度计算,每一个线程计算完成后,异步地更新模型参数。同步的方式相当于用一个较大的mini-batch,优点是没有梯度干扰,缺点是容错性差。一台机器出问题,就需要重头再来。异步的方式优点是容错性好,但是因为梯度干扰的问题,每组的梯度利用率下降

TensorFlow模型并行模式

模型并行就是将计算图的不同部分放在不同的设备上运算,可以实现简单的模型并行,其目标在于减少每一轮训练迭代的时间,不同于数据并行同时进行多份数据的训练。模型并行需要模型自身有大量的互不依赖或者依赖程度不高的子图。在不同硬件环境上性能损耗不同。

TensorFlow流水线并行模式

和异步数据并行很像。只不过是在同一个硬件设备上实行并行。大致思路是将计算做成流水线,在一个设备上连续的并行执行,提高设备利用率。


参考文献:http://www.studyai.com/article/2caa27c6bcbe4add99faa4fdf4d02106

Tensorflow 初级教程(二)的更多相关文章

  1. Tensorflow 初级教程(一)

    初步介绍 Google 于2011年推出人工深度学习系统——DistBelief.通过DistBelief,Google能够扫描数据中心数以千计的核心,并建立更大的神经网络.Google 的这个系统将 ...

  2. TensorFlow 初级教程(三)

    TensorFlow基本操作 import os import tensorflow as tf os.environ[' # 使用TensorFlow输出Hello # 创建一个常量操作( Cons ...

  3. Laravel初级教程浅显易懂适合入门

    整理了一些Laravel初级教程,浅显易懂,特适合入门,留给刚学习laravel想快速上手有需要的朋友 最适合入门的laravel初级教程(一)序言 最适合入门的laravel初级教程(二)安装使用 ...

  4. Coding 初级教程(二)——上传已有项目

    Coding 初级教程(二)——上传已有项目 [摘要:方针读者 :已具有 Coding.net 的账号. 本文首要先容若何把项目上传到 Coding.net 上. 分两种环境,一种是项目已归入到 gi ...

  5. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级) 企业库加密应用程序模块提供了2种方 ...

  6. tensorflow学习笔记二:入门基础 好教程 可用

    http://www.cnblogs.com/denny402/p/5852083.html tensorflow学习笔记二:入门基础   TensorFlow用张量这种数据结构来表示所有的数据.用一 ...

  7. 《自学C语言》初级教程 - 目录

    我现在打算出一个C语言学习教程,目的是为了让初学者能够很容易和更深刻地理解C语言. 你可能有这样的疑问,网上不是有很多的初级教程吗,我需要这个吗?我的回答是:网上的C语言教程讲得不够全面,而且许多的初 ...

  8. Yeoman+Bower+gulp web前端自动化工作流程(初级教程)

    Yeoman包括了三个部分yo(脚手架工具).grunt/gulp(构建工具).bower(包管理器).听说gulp更容易上手,所以我就没用grunt而选的gulp 什么是开发流程? 在我看来一个完整 ...

  9. Tensorflow学习教程------过拟合

    Tensorflow学习教程------过拟合   回归:过拟合情况 / 分类过拟合 防止过拟合的方法有三种: 1 增加数据集 2 添加正则项 3 Dropout,意思就是训练的时候隐层神经元每次随机 ...

随机推荐

  1. JavaScript实现深拷贝(深复制) 面试题

    1.两种方法实现深拷贝(深复制) (1)方法一:兼容性好,请仔细看代码(网上大部分代码有Bug) (2)方法二:需要对象满足JSON数据格式.JOSN数据格式:http://www.cnblogs.c ...

  2. 仿IOS中下拉刷新的“雨滴”效果

    在IOS中,有非常赞的"水滴"下拉效果.非常久之前也想在Android上实现,可是苦于能力有限,一直未能付诸行动.这几天趁着空隙时间.写了一版初步实现,基本达到了"水滴& ...

  3. CentOS6.8 SVN服务器管理多项目

    一 需求 一般来说,公司有多个项目,在搭建好SVN服务器之后,就需要使用SVN来实现不在一个项目中的开发人员不能访问其它项目中的代码. 假设: 有3个项目:project1.project2.proj ...

  4. 通用对话弹窗CommonDialog

    代码地址如下:http://www.demodashi.com/demo/12592.html 通用对话弹窗CommonDialog Version 1.0 Created by chenchangj ...

  5. Ubuntu16.04 打开txt文件乱码

    最近遇到个小问题:Ubuntu16.04下打开txt出现乱码,倒腾下解决了这个问题,记录下来. Ubuntu16.04 默认已经安装gedit.直接双击被打开的文件默认用gedit打开,显然这种方式行 ...

  6. 工作总结 sql 中过滤条件 中的 (where中的) and

    总结: 在where 后面做过滤的时候 如果  有 字段1 必须满足某种值   字段2 要满足 某种或某值的时候  直接   and 字段1 = ‘a’   and    字段2 = ‘b’ or 字 ...

  7. PHP面试题及答案解析(3)—MySQL数据库

    1.mysql_num_rows()和mysql_affected_rows()的区别. mysql_num_rows()和mysql_affected_rows(),这两个函数都作用于 mysql_ ...

  8. 链表的艺术——Linux内核链表分析

    引言: 链表是数据结构中的重要成员之中的一个.因为其结构简单且动态插入.删除节点用时少的长处,链表在开发中的应用场景许多.仅次于数组(越简单应用越广). 可是.正如其长处一样,链表的缺点也是显而易见的 ...

  9. cache和buffer区别探讨

    一. 1.Buffer(缓冲区)是系统两端处理速度平衡(从长时间尺度上看)时使用的.它的引入是为了减小短期内突发I/O的影响,起到流量整形的作用.比如生产者——消费者问题,他们产生和消耗资源的速度大体 ...

  10. Windows2008RC2 IIS配置php执行环境

    1:下载一个php manager,安装.打开IIS管理器后,点击计算机,就能够看到右边PHPManager 静静地躺在那儿了.双击PHPManager    后我们就能够開始对PHP进行配置了. 2 ...