TensorFlow核心概念和原理介绍

Easter79
• 阅读 691

关于 TensorFlow

TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。

节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等。

TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。

核心概念:数据流图

数据流图用“结点”(nodes)和“线”(edges)的有向图来描述数学计算。

“节点” 一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。

“线”表示“节点”之间的输入/输出关系。这些数据“线”可以输运“size可动态调整”的多维数据数组,即“张量”(tensor)。

张量从图中流过的直观图像是这个工具取名为“Tensorflow”的原因。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。

TensorFlow核心概念和原理介绍

更详细的介绍可以查看tensorflow中文社区:http://www.tensorfly.cn/

TensorFlow主要是由计算图、张量以及模型会话三个部分组成。

计算图

在编写程序时,我们都是一步一步计算的,每计算完一步就可以得到一个执行结果。

在TensorFlow中,首先需要构建一个计算图,然后按照计算图启动一个会话,在会话中完成变量赋值,计算,得到最终结果等操作。

因此,可以说TensorFlow是一个按照计算图设计的逻辑进行计算的编程系统。

TensorFlow的计算图可以分为两个部分:
(1)构造部分,包含计算流图;(2)执行部分,通过session执行图中的计算。

构造部分又分为两部分:
(1)创建源节点;(2)源节点输出传递给其他节点做运算。

TensorFlow默认图:TensorFlow python库中有一个默认图(default graph)。节点构造器(op构造器)可以增加节点。

张量

在TensorFlow中,张量是对运算结果的引用,运算结果多以数组的形式存储,与numpy中数组不同的是张量还包含三个重要属性名字、维度、类型。

张量的名字,是张量的唯一标识符,通过名字可以发现张量是如何计算出来的。比如“add:0”代表的是计算节点"add"的第一个输出结果。维度和类型与数组类似。

模型会话

用来执行构造好的计算图,同时会话拥有和管理程序运行时的所有资源。

当计算完成之后,需要通过关闭会话来帮助系统回收资源。

在TensorFlow中使用会话有两种方式。第一种需要明确调用会话生成函数和关闭会话函数

import tensorflow as tf 

# 创建session  
session = tf.Session() #获取运算结果 session.run() #关闭会话,释放资源 session.close() 

第二种可以使用with的方式

with tf.Session() as session:  
    session.run()  

两种方式不同的是,第二种限制了session的作用域,即session这个参数只适用于with语句下面,同时语句结束后自动释放资源,
而第一种方式session则作用于整个程序文件,需要用close来释放资源。

tensorflow分布式原理

tensorflow的实现分为了单机实现和分布式实现。

单机的模式下,计算图会按照程序间的依赖关系顺序执行。

在分布式实现中,需要实现的是对client,master,worker process,device管理。

client也就是客户端,他通过session的接口与master和worker相连。

master则负责管理所有woker的计算图执行。

worker由一个或多个计算设备device组成,如cpu,gpu等。

具体过程如下图:

TensorFlow核心概念和原理介绍

在分布式实现中,tensorflow有一套专门的节点分配策略。

策略是基于代价模型,代价模型会估算每个节点的输入,输出的tensor大小以及所需的计算时间,然后分配每个节点的计算设备。

扩展功能

在tensorflow中比较重要的拓展功能有,自动求导,子图执行,计算图控制流以及队列/容器

求导是机器学习中计算损失函数常用的运算,TensorFlow原生支持自动求导运算,它是通过计算图中的拓展节点实现。

子图执行是通过控制张量的流向实现。

计算图控制流:是指控制计算图的节点极其运行的设备管理,它提供了快速执行计算和满足设备施加的各种约束。比如限制内存总量为了执行它的图子集而在设备上所需的节点。

队列是一个有用的功能,它们允许图的不同部分异步执行,对数据进行入队和出队操作。

容器是用来存放变量,默认的容器是持久的,直到进程终止才会清空,同时容器中的变量也可以共享给其他计算图使用。

详细的细节可查看TensorFlow的介绍pdf

https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/45166.pdf

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
5个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k