Tensorflow是广泛使用的实现机器学习以及其它涉及大量数学运算的算法库之一。Tensorflow由Google开发,是GitHub上最受欢迎的机器学习库之一。Google几乎在所有应用程序中都使用Tensorflow来实现机器学习。 例如,如果您使用到了Google照片或Google语音搜索,那么您就间接使用了Tensorflow模型。它们在大型Google硬件集群上工作,在感知任务方面功能强大。

本文的主要目的是为TensorFlow提供一个对初学者友好的介绍,我假设您已经知道一些python知识。 TensorFlow的核心组件是通过边遍历所有节点的计算图和张量。我们来逐个简单介绍一下。

张量(Tensor)

在数学上,张量是N维向量,这意味着张量可以用来表示N维数据集。上面的图有点复杂,难以理解。我们看看它的简化版本:

上图显示了一些简化的张量。随着维度的不断增加,数据表示将变得越来越复杂。例如,一个3x3的张量,我可以简单地称它为3行和列的矩阵。如果我选择另一个形式的张量(1000x3x3),我可以称之为一个向量或一组1000个3x3的矩阵。在这里我们将(1000x3x3)称为张量的形状或尺寸。张量可以是常数也可以是变量。

计算图(流, flow)

现在我们理解了Tensor的含义,是时候了解流(Flow)了。流是指一个计算图或简单的一个图,图不能形成环路,图中的每个节点代表一个操作,如加法、减法等。每个操作都会导致新的张量形成。

上图展示了一个简单的计算图,所对应的表达式为:

e = (a+b)x(b+1)
  • 1

计算图具有以下属性:

  • 叶子顶点或起始顶点始终是张量。意即,操作永远不会发生在图的开头,由此我们可以推断图中的每个操作都应该接受一个张量并产生一个新的张量。同样,张量不能作为非叶子节点出现,这意味着它们应始终作为输入提供给操作/节点。

  • 计算图总是以层次顺序表达复杂的操作。通过将a + b表示为c,将b + 1表示为d,可以分层次组织上述表达式。 因此,我们可以将e写为:

e = (c)x(d) 这里 c = a+b 且 d = b+1.
  • 1
  • 以反序遍历图形而形成子表达式,这些子表达式组合起来形成最终表达式。

  • 当我们正向遍历时,遇到的顶点总是成为下一个顶点的依赖关系,例如没有a和b就无法获得c,同样的,如果不解决c和d则无法获得e。

  • 同级节点的操作彼此独立,这是计算图的重要属性之一。当我们按照图中所示的方式构造一个图时,很自然的是,在同一级中的节点,例如c和d,彼此独立,这意味着没有必要在计算d之前计算c。 因此它们可以并行执行。

计算图的并行

上面提到的最后一个属性当然是最重要的属性之一。它清楚地表明,同级的节点是独立的,这意味着在c被计算之前不需空闲,可以在计算c的同时并行计算d。Tensorflow充分利用了这个属性。

分布执行

Tensorflow允许用户使用并行计算设备更快地执行操作。计算的节点或操作自动调度进行并行计算。这一切都发生在内部,例如在上图中,可以在CPU上调度操作c,在GPU上调度操作d。下图展示了两种分布式执行的过程:

第一种是单个系统分布式执行,其中单个Tensorflow会话(将在稍后解释)创建单个worker,并且该worker负责在各设备上调度任务。在第二种系统下,有多个worker,他们可以在同一台机器上或不同的机器上,每个worker都在自己的上下文中运行。在上图中,worker进程1运行在独立的机器上,并调度所有可用设备进行计算。

计算子图

子图是主图的一部分,其本身就是计算图。例如,在上面的图中,我们可以获得许多子图,其中之一如下所示

上面的图是主图的一部分,从属性2我们可以说子图总是表示一个子表达式,因为c是e的子表达式。 子图也满足最后一个属性。同一级别的子图也相互独立,可以并行执行。因此可以在一台设备上调度整个子图。

上图解释了子图的并行执行。这里有2个矩阵乘法运算,因为它们都处于同一级别,彼此独立,这符合最后一个属性。由于独立性的缘故,节点安排在不同的设备gpu_0和gpu_1上。

在worker之间交换数据

现在我们知道Tensorflow将其所有操作分配到由worker管理的不同设备上。更常见的是,worker之间交换张量形式的数据,例如在e =(c)*(d)的图表中,一旦计算出c,就需要将其进一步传递给e,因此Tensor在节点间前向流动。 该流动如图所示:

此处张量从设备A传递到设备B。这在分布式系统中引起了一些性能延迟。延迟取决于一个重要属性:张量大小。设备B处于空闲模式,直到它接收到设备A的输入。

压缩的必要性

很显然,在计算图中,张量在节点之间流动。在流到达可以处理的节点之前,减少流造成的延迟非常重要。一个方法是使用有损压缩减小尺寸。

张量的数据类型可以发挥重要作用,让我们来理解为什么。很明显机器学习中的操作中有更高的精度。例如,如果我们使用float32作为张量的数据类型,那么每个值都表示为32位浮点数,因此每个值占用32位的大小,这同样适用于64位。假设一个形状为(1000,440,440,3)的张量,其包含的值的数量为1000 * 440 * 440 * 3。如果数据类型是32位,那么占用的空间是这个巨大数字的32倍,从而增加了流的延迟。压缩技术可以用来减小尺寸。

有损压缩

有损压缩涉及压缩数据的大小,并不在意它的值,这意味着它的值可能会在压缩过程中被破坏或不准确。 但是,如果我们有一个像1.01010e-12这样的32位浮点数,那么对于最低有效数字的重要性就会降低。 更改或删除这些值不会在我们的计算中产生太大的差异。因此,Tensorflow会自动将32位浮点数转换为16位表示,忽略所有可忽略的数字。如果它是64位数,则会将其大小减少近一半。如果将64位数压缩到16位将几乎缩小75%。因此张量所占用的空间可以尽可能减少。

一旦张量到达节点,16位表示可以通过追加0回到它的原始形式。因此,32或64位表示将在到达节点进行处理后被还原。


到这里,我们就结束了Tensorflow介绍的第1部分,编程和构建简单的子图将在下一部分进行介绍。

写给初学者的Tensorflow介绍相关推荐

  1. tensorflow介绍(转)

    tensorflow介绍(转) https://github.com/wizardforcel/data-science-notebook/tree/master/tf/first_contact_w ...

  2. 写给初学者的Python与pip安装教程

    写给初学者的Python与pip安装教程 在Python编程中,安装包(package)是一个重要的环节.Python本身提供了pip这一安装和管理包的便捷工具,然而目前网上所能找到的有关pip的中文 ...

  3. Linux学习高手写给初学者的经验谈

    Linux学习高手写给初学者的经验谈 2008-04-01 15:02 现在好多的人开始接触电脑的时候,见到的应该是Windows98说实话,98 已经是一个很人性化,封装的很好的一个系统了一个对电脑 ...

  4. 初学者SQL语句介绍

    初学者SQL语句介绍 1.用 Select 子句检索记录     Select 子句是每一个检索数据的查询核心.它告诉数据库引擎返回什么字段.     Select 子句的常见形式是:     Sel ...

  5. TensorFlow介绍之TF数据流图

    TensorFlow介绍之TF数据流图 1. TF数据流图 1.1案例:TensorFlow实现一个加法运算 示例代码: def tensorflow_demo():""" ...

  6. 和cnn结合_写给小白的R-CNN介绍

    在上一篇写给小白的YOLO介绍中,我介绍了目标检测的任务类型和YOLO的基本方法. 实际上,R-CNN是比YOLO更早的方法,但是因为它对后面的许多目标检测方法都有指导意义,所以我们还是介绍一下. 下 ...

  7. Google人工智能平台TensorFlow介绍

    Google人工智能平台TensorFlow介绍 作者:雨水/家辉 日期:2016年6月19日 CSDN博客:http://blog.csdn.net/gobitan TensorFlow是什么 官方 ...

  8. [好学、好用、好玩的Photoshop.写给初学者的入门书].李金明等.扫描版

    [好学.好用.好玩的Photoshop.写给初学者的入门书].李金明等.扫描版 链接:https://pan.baidu.com/s/1hA73UYfKY3yMlye2tyac-w 提取码:vugu

  9. 写给初学者的深度学习教程之 MNIST 数字识别

    一般而言,MNIST 数据集测试就是机器学习和深度学习当中的"Hello World"工程,几乎是所有的教程都会把它放在最开始的地方.这是因为,这个简单的工程包含了大致的机器学习流程,通过练习这个工程 ...

最新文章

  1. 使用Docker搭建Elasticsearch集群环境
  2. 白话Elasticsearch63-生产集群部署之硬件配置、jvm以及集群规划建议
  3. mac 查看指定端口情况 并杀死该进程
  4. rust怎么拆除墙壁指令_人类跌落梦境:城堡怎么过 不少玩家卡在了第六关城堡地图这里...
  5. 如何让cloudflare缓存html,CloudFlareCDN页面规则缓存设置教程
  6. 方法的重写、重载及隐藏
  7. java中catalina.out_catalina.out 和 catalina.log 的区别和用途
  8. 一个maven错误:org/apache/maven/shared/filtering/MavenFilteringException
  9. OpenCV 文本显示 putText 和 getTextSize
  10. [UE4]Size Box
  11. 中国人口增长的数学模型(for数学建模)
  12. CCS软件的基础使用(以点灯为例)
  13. Percona XtraBackup User Manual
  14. Premiere 输出视频
  15. 计算机应用基础 福师在线作业一,福师《计算机应用基础》在线作业一
  16. 结对项目——进一步完善四则运算
  17. MySQL [1093] You can‘t specify target table ‘titles_test‘ for update in FROM clause
  18. LC振荡电路 频域计算
  19. 提高spark任务稳定性1 - Blacklist 机制
  20. CAD软件中如何标注曲线长度?

热门文章

  1. 知乎完成 2.7 亿美元 E 轮融资 加速建设全民知识内容平台(附周源全员邮件全文)...
  2. php定义常量 define vs const
  3. Swift 初见(A Swift Tour)
  4. SQL对象名无效怎么办法 华骨龙
  5. 远程linux的几个工具
  6. SCCM管理 - 更新部署
  7. 逻辑网络拓扑与物理网络拓扑—Vecloud微云
  8. 置顶 | 2021学习单/读书单(该来的总会来,过好当下,静待花开)
  9. JQuery-UI组件化开发
  10. 影响JavaScript应用可扩展性因素