初步介绍

Google 于2011年推出人工深度学习系统——DistBelief。通过DistBelief,Google能够扫描数据中心数以千计的核心,并建立更大的神经网络。Google 的这个系统将Google 应用中的语音识别率提高了25%,以及在Google Photos中建立了图片搜索,并驱动了Google的图片字幕匹配实验。但它很难被设置,没有开源。

2015年11月,第二代分布式机器学习系统Tensorflow在github上开源!

2016年4月,发布了分布式版本!

2017年1月,发布了1.0预览版。API接口趋于稳定。同年3月发布了可用于工业级场景的1.0正式版!

Tensorflow优点:

1.既是一个实行机器学习算法的接口,同时也是执行机器学习算法的框架

2.Tensorflow 前端支持python,C++,GO,java等多种开发语言

3.Tensorflow 后端使用C++,CUDA等写成

4.Tensorflow可以在众多异构系统平台上移植:Android,iphone,TV,普通的CPU服务器以及大规模GPU集群等

5.Tensorflow 除了可以执行深度学习算法,还可以用来实现很多其他算法:线性回归,随机森林,支持向量机

6.Tensorflow可以建立大规模深度学习模型的应用场景:语音识别,自然语言处理,机器视觉,机器人控制,信息抽取,医药研发等等。

Tensorflow 基础架构

前端负责构造计算图,后端负责执行计算图。就像是前端是建筑专业,后端是土木专业。

Tensorflow 核心概念

1.计算图

2.操作

3.变量

4会话

一、计算图

计算图又被称为有向图,数据流图。数据流图用结点(nodes)和线(edges)的有向图来描述数学计算,结点一般用来表示施加的数学操作,但也可以表示数据输入的起点或者输出终点,线表示结点之间输入/输出的关系,这些数据“线”可以运输size可动态调整的多维数据数组,即张量(tensor)。

(注:有一类特殊边中没有数据流动,这种边被称为依赖控制,作用是控制结点的执行顺序,它可以让起始节点执行完毕再去执行目标节点,用户可以使用这样的边进行灵活控制,比如限制内存使用的最高峰值)

例:

二、操作

一个运算操作代表了一种类型的抽象运算,比如矩阵乘法或向量加法

一个运算操作可以有自己的属性,但是所有属性都必须被预先设置,或者能够在创建计算图时根据上下文推断出来

通过设置运算操作的属性可以用来支持不同的tensor元素类型,比如让向量加法支持浮点数或者整数

运算核(kernel)是一个运算操作在某个具体的硬件(cpu或gpu)的实现

在Tensorflow中可以通过注册机制加入新的运算操作或者为已有的运算操作添加新的计算核

三、变量

当训练模型时,用变量来存储和更新参数。变量包含张量(tensor)存放在内存的缓存区。建模时,他们需要明确的初始化,模型训练后他们必须要被存储到磁盘。这些变量的值可在之后模型训练和分析时被加载。

创建:当创建一个变量时,你将一个张量作为初始值传入构造函数variable()。Tensorflow提供了一系列操作符来初始化张量,初始值是常量或者随机值

注意,所有这些操作符都是需要你指定张量的shape。那个形状自动成为变量的shape。变量的shape通常是固定的,但Tensorflow提供了高级的机制来重新调整其行列数。

调用tf.Variable()添加一些操作(Op,operation)到graph:

1.一个variable 操作存放变量的值

2.一个初始化op将变量设置为初始值。这事实上是一个tf.assign操作

3.初始值的操作,例如示例中对biases变量的zeros操作也被加入了graph

tf.Variable的返回值是Python的tf.Variable类的一个实例

变量的初始化

一次性全部初始化

变量的初始化必须在模型的其他操作运行之前先明确地完成。最简单的方法是添加一个给所有变量初始化的操作,并在使用模型之前首先运行那个操作。

使用tf.initialize_all_variables()台南佳一个操作对变量做初始化。记得在完全构建好模型并加载之后再运行那个操作。

自定义初始化

tf.initialize_all_variables()函数便捷地添加一个op来初始化模型地所有变量。你也可以给它出入一组变量进行初始化。

由另一个变量初始化

你有时候会需要用另一个变量地初始化值给当前变量初始化。由于tf.initialize_all_variables()是并行地初始化所有变量,所以再有这种需求地情况下需要小心。

用其他变量地值初始化一个新的变量时,使用其他变量的initialized_value()属性。你可以直接把已初始化的值作为新变量的初始值,或者把它当作tensor计算得到一个值赋予新变量

四、会话

完成全部的构建准备、生成全部所需的操作之后,我们就可以建立一个tf.Session,用于运行图标

sess=tf.Session()

另外,也可以利用with代码生成Session,限制作用域:

with tf.Session() as sess:

Session函数没有传入参数,表明该代码将会依附于(如果还没有创建会话,则会创建新的会话)默认的本地会话。

生成会话之后,所有tf.Variable实例都会立即通过调用各自初始化操作中的sess.run()函数进行初始化

Tensorflow 实现原理

TensorFlow有一个重要组件client,也就是客户端,它通过Session的接口与master以及多个worker相连接。每一个worker可以与多个硬件设备连接,比如cpu和GPU,并负责管理这些硬件。Master则负责指导所有的worker按照流程执行计算图。

Tensorflow有单机模式和分布式模式。单机模式下,client,master,worker全部在同一台计算机上的同一个进程中。分布式模式允许client,master,worker在不同机器的不同进程中,同时由集群调度系统统一管理各项任务

TensorFlow中每一个worker可以管理多个设备,每一个设备的name包含硬件类别、编号、任务号(单机版本没有)。

TensorFlow为CPU和GPU提供管理设备的对象接口,每一个对象负责分配、释放设备内存,以及执行节点的运算核。TensorFlow中的Tensor是多维数组,数据类型支持8位至64位的int,以及IEEE标准的float.double.complex.string。

在只有一个硬件设备的情况下,计算图会按照依赖关系被顺序执行。当一个节点的所有上游依赖全部执行完毕(依赖数==0),这个节点就会被加入就绪队列(ready queen)以等待执行。同时这个节点的下游节点的依赖数自动减1。

当多个设备的时候,情况就变得复杂了。主要有两大难点:

(1)每一个节点该让什么设备执行?

TensorFlow设计了一套为节点分配设备的策略。这个策略首先需要计算一个代价模型。代价模型首先估算每一个节点的输入,输出Tensor的大小,以及所需要的计算时间。代价模型一部分由人工经验指定的启发式规则得到,另一部分则是对一小部分数据进行实际运算测量得到。

接下来,分配策略会模拟执行整个计算图,从起点开始,按照拓扑序执行。并在执行一个节点时,会把每一个能执行这个节点的设备都测试一遍,测试内容包括计算时间的估算以及数据传递所需要的通信时间。最后选择一个综合时间最短的设备计算相应的节点。这是一个简单的贪婪策略。

除了运算时间,内存的最高使用峰值也会被考虑进来。

Tensor flow的节点分配策略仍在不断优化改进。未来,可能会用一个强化学习的神经网络来辅助节点分配。同时,用户可以自定义某些分配限制条件。
(2)如何管理节点间的数据通信?

当给节点分配设备的方案被确定,整个计算图就会被划分为许多子图了,使用同一个设备并且相邻的节点会被划分到同一个子图。然后计算图中从x到y的边,会被取代为一个发送端的发送节点(send node),一个接收端的接受节点(receive node),以及从发送节点到接受节点的边。

把数据通信的问题转换为发送节点和接受节点的实现问题,用户不需要为不同的硬件环境实现通信方法。

两个子图之间可能会有多个接受节点,如果这些接受节点接受的都是同一个tensor,那么所有这些接受节点会被自动合并为一个,避免了数据的反复传递和设备内存占用。

发送节点和接受节点的设计简化了底层的通信模式,用户无需设计节点之间的通信流程,可以让同一套代码自动扩展到不同的硬件环境并处理复杂的通信流程。

从单机单设备的版本改造为单机多设备的版本也比较容易。下面的代码只添加了一行,就实现了从一块GPU到多块GPU训练的改造


参考文献:

http://www.studyai.com/article/a187469c758d4a2884c0fa733fdfe899

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

  1. TensorFlow 初级教程(三)

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

  2. Tensorflow 初级教程(二)

    一.Tensorflow 扩展功能 1.自动求导 2.子图的执行 3.计算图控制流 4.队列/容器 Tensorflow 自动求导 当计算tensor C关于tensor W的梯度时,会先寻找从W到C ...

  3. Python图像处理库:Pillow 初级教程

    Python图像处理库:Pillow 初级教程 2014-09-14 翻译 http://pillow.readthedocs.org/en/latest/handbook/tutorial.html ...

  4. shellKali Linux Web 渗透测试— 初级教程(第三课)

    shellKali Linux Web 渗透测试— 初级教程(第三课) 文/玄魂 目录 shellKali Linux Web 渗透测试—初级教程(第三课) 课程目录 通过google hack寻找测 ...

  5. Mac OS X Terminal 101:终端使用初级教程

    Mac OS X Terminal 101:终端使用初级教程 发表于 2012 年 7 月 29 日 由 Renfei Song | 文章目录 1 为什么要使用命令行/如何开启命令行? 2 初识Com ...

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

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

  7. [初级教程]用SecureCRT+Xming轻松远程实现Linux的X DISPLAY

    [初级教程]用SecureCRT+Xming轻松远程实现Linux的X DISPLAY 发布者:sqqdugdu 时间:10-06 阅读数:2117 测试环境:RHEL 6.1,SecureCRT 5 ...

  8. Window服务初级教程以及log4net配置文件初始化

    Window服务初级教程:http://www.jb51.net/article/48987.htm 另外,配置log4net这个日志功能的时候需要初始化,不然会报没有初始化的错误,而且初始化的节点应 ...

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

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

随机推荐

  1. 基于WPF系统框架设计(2)-Fluent Ribbon之HelloWorld

    Fluent/Ribbon是微软在其最新桌面操作系统Windows 7中使用的图形用户界面. Windows平台的进化,伴随着系统图形界面的重新设计.从Windows XP到Windows Vista ...

  2. JAVA学习第四十八课 — IO流(二):文件的复制 & 缓冲区1

    一.复制文本文件 将G盘的文本文件拷贝到D盘上 也就是 读取G盘中文本文件的数据.写入D盘中->连读带写 而剪切呢.就是连读带写后,删除原盘的文件 <span style="fo ...

  3. eclipse / ADT(Android Develop Tool) 一些方便的初始设置

      1.设置编辑窗口的背景色eclipse的主编辑窗口的背景色,默认为白色,个人感觉太亮,推荐保护视力的“墨绿色”,当然也可以根据个人喜好更改,如下图 2.主编辑窗口的字体字号等,也可以根据自己的爱好 ...

  4. [redis]redis概述

    Redis是一个开源.支持网络.基于内存.可持久化的日志型.key-value键值对数据库.使用ANSI C编写.并提供多种语言的API. 它是远程字典server(remote dictionary ...

  5. CentOS修改IP地址及关闭/打开防火墙

    1.CentOS修改IP地址: # ifconfig eth0 192.168.1.80 这样就把IP地址修改为192.168.1.80(如果发现上不了网 了,那么你可能需要把网关和DNS也改一下,后 ...

  6. C# 接口中的索引器

    索引器可在 接口(C# 参考) 上声明.接口索引器的访问器与类索引器的访问器具有以下方面的不同: 接口访问器不使用修饰符. 接口访问器没有体. 因此,访问器的用途是指示索引器是读写.只读还是只写.以下 ...

  7. 开发中可能会用到的几个小tip----QT, pycharm, android, 等

    QT: 如果是在windows下开发的话,添加外部库,外部包含头文件路径的时候,要注意用相对路径,或者在项目上右键添加外部库的路径或者头文件路径,否则,会卡在这里开始怀疑人生... 如果是在linux ...

  8. File 的基本操作

    package xinhuiji_day07; import java.io.File;import java.io.IOException; public class FileTest { /**  ...

  9. Socket编程之Tomcat模拟_采坑汇总

    用java.net.Socket来模拟实现Tomcat,碰到了一些坑,大部分是没有想到的,记录下来自查. 直接上代码, public class TomcatDemo { private static ...

  10. 【数据挖掘】分类之decision tree(转载)

    [数据挖掘]分类之decision tree. 1. ID3 算法 ID3 算法是一种典型的决策树(decision tree)算法,C4.5, CART都是在其基础上发展而来.决策树的叶子节点表示类 ...