点上方蓝字计算机视觉联盟获取更多干货

在右上方 ··· 设为星标 ★,与你不见不散

正文一共:4110,预计阅读时间:11分钟

本篇文章主要介绍TensorFlow的基本概念,包含TensorFlow的计算模型、数据模型和运行模型。

◆ ◆ ◆  ◆ ◆

TensorFlow计算模型——计算图

计算图的概念

TensorFlow的名字中已经说明了最重要的两个概念——Tensor(张量)和Flow(流)TensorFlow是通过一个计算图的形式来表达计算的编程系统。TensorFlow中的每一个计算都是计算图上的一个节点,节点之间的边描述了计算之间的依赖关系。如果一个运算的输入依赖于另一个运算的输出,那么两个运算有依赖关系。

下图中,a和b两个常量不依赖任何其他计算,add计算则依赖读取两个常量的取值。所以在下图中就得到一条从a到add的边和从b到add的边。没有任何计算依赖add节点,所以add节点没有指向其他节点的边。TensorFlow的程序都可以通过类似下图所示的计算图形式来表示

计算图的使用

TensorFlow 程序一般可以分为两个阶段:

  1. 第一个阶段需要定义计算图中所有的计算;

  2. 第二个阶段为执行计算。

下边给出计算图中的定义阶段,只是定义每个变量,相当于一个定义说明:

import tensorflow as tf
a= tf.constant([l.O, 2 .0], name=”a”)
b = tf.constant([2.0, 3.0], name=”b ”)
result = a + b

说明:

  1. 在Python中一般会采用 impot tensorflow as tf”的形式来载入TensorFlow,这样可以使用“ tf”来代替“ tensorflow”作为模块名称,使得整个程序更加简洁。

  2. TensorFlow 会自动将定义的计算转化为计算图上的节点 。在TensorFlow程序中,系统会自动维护一个默认的计算图,通过 tf.get_default_graph 函数可以获取当前默认的计算图。以下代码示意了如何获取默认计算图以及如何查看一个运算所属的计算图 :

# 通过a.graph可以查看张所属的计算图。
#因为没有特意指定,所以这个计算图应该等于
# 当前默认的计算图。所以下面这个操作输出值为True。
print(a.graph is tf.get_default_graph())

除了使用默认的计算图,TensorFlow支持通过tf.Graph函数来生成新的计算图。不同计算图上的张量和运算都不会共享。以下代码示意了如何在不同计算图上定义和使用变量:

import tensorflow as tf
gl = tf.Graph()
with gl.as_default () :# 在计算图g1中定义变量v,并初始化为0v = tf.get_variable(” v ”, initializer=tf.zeros_initializer(shape=[l)))g2 = tf.Graph()
with g2.as_default () :# 在计算图g2中定义变量v,并初始化为1v = tf.get_variable(” v ”, initializer=tf.ones_initializer(shape=[l)))# 在计算图g1中读取变量“v”的值
with tf.Session(graph = g1) as sess:tf.global_variables_initializer().run()with tf.variable_scope("", reuse = True):# 在计算图g1中,变量“v”的取值应该为0,所以下面这行输出为[0.]print(sess.run(tf.get_variable("v")))    # 在计算图g2中读取变量“v”的值
with tf.Session(graph = g2) as sess:tf.global_variables_initializer().run()with tf.variable_scope("", reuse = True):# 在计算图g2中,变量“v”的取值应该为1,所以下面这行输出为[1.]print(sess.run(tf.get_variable("v")))

以上代码产生了两个计算图,每个计算图中定义了一个名字为“v”的变量。在计算图g1中,将 v 初始化为 0 ;在计算图 g2 中,将 v 初始化为1 。可以看到当运行不同计算图时,变量 v 的值也是不一样的。

tf.Graph.device指定运算设备

TensorFlow中的计算图不仅既可以隔离张量和计算,也可以额用来管理计算机制。如可以使用tf.Graph.device函数来指定运行计算的设备,这就为TensorFlow使用GPU提供了机制。如下程序即为将加法计算使用GPU实现:

g=tf.Graph()
#指定算运行的设备
with g.device('/gpu:0'):result = a + b

◆ ◆ ◆  ◆ ◆

TensorFlow数据模型——张量

张量的概念

在TensorFlow中,所有的数据都通过张量的形式表示。简单的理解,张量可以理解为

多维数组。张量中并不存储真正的数字,保存的是这些数字的计算过程。如下代码所示,得到的结果不是加法的结果,而是得到对结果的一个引用,计算过程:

import tensorflow as tf
# tf.constant是一个计算,这个计算结果作为一个张量,保存在变量a中
a = tf.constant([1.0, 2.0], name="a")
b = tf.constant([2.0, 3.0], name="b")
result = tf.add(a, b, name = "add")
print result
```
输出:
Tensor("add:0", shape = (2,), dtype = float 32)

一个张量中主要保存了三个属性:

  1. 名字(name):一个张量的唯一标识符,它同样也给出了这个张量是如何计算出来的。张量的命名可以通过“node: src_output”形式给出,其中noe为节点的名称,src_output表示当前张量来自节点的第几个输出。如上边的“add: 0”b表示result是计算节点“add”输出的第一结果(编号从0开始)

  2. 维度(shape):描述张量的维度信息

  3. 类型(type):每一个张量都会有唯一的类型。TensorFlow会对参与运算的所有张量进行类型检查,当类型不匹配时就会报错,如下所示:

import tensorflow as tf
a = tf.constant([1, 2], name = " a ")
b = tf.constant([2.0, 3.0], name = " b ")
result = a + b

上述代码由于a和b的类型不匹配,一个整形的,一个float型的所以会报如下的错误(大意为张量转换需要int32类型,实际却为float类型):

ValuesError:Tensor conversion requested dtype int32 for Tensor with dtype float32: 'Tensor("b:0", shape =(2,), dtype = float32)'

张量的使用

张量使用主要可以总结为两大类:

(1)第一类用途是对中间计算结果的引用 。 当一个计算包含很多中间结果时,使用张量可以大大提高代码的可读性。以下为使用张量和不使用张量记录中间结果来完成向量相加的功能的代码对比 :

import tensorflow as tf
# 使用张量,a、b为张量
a = tf.constant([1, 2], name = " a ")
b = tf.constant([2.0, 3.0], name = " b ")
result = a + b# 直接计算向量的和,这样可读性就差一些
result = tf.constant([1, 2], name = " a ")+tf.constant([2.0, 3.0], name = " b ")

上述代码中,a和b其实就是对常量生成这个预算结果的引用,可以提高代码的可读性。

(2)第二类情况是当计算图构造完成之后,张量可以用来获得计算结果,也就是得到真实的数字。

◆ ◆ ◆  ◆ ◆

TensorFlow运行模型——会话

会话的概念

会话主要用来执行定义好的运算,管理TensorFlow程序运行时的所有资源。所以,程序运算结束时,需要关闭会话来帮助系统回收资源,否则就会出现资源泄露问题。

会话的使用

TensorFlow使用会话的两种模式:

1、明确调用会话生成函数和关闭会话函数,代码流程如下:

# 创建一个会话
sess = tf.Session()
# 使用这个创建好的会话来得到关心的运算的结果。
# 比如调用上述sess.run(result)得到result张量的取值
sess.run(...)
# 关闭会话使得本次运行中使用到的资源可以被释放
sess.close()

使用这种模式,在计算完成之后,小调用Session.close函数来关闭会话使其释放资源。但是,有时因为程序异常退出,程序会出现Session.close函数并未执行的情况,从而导致资源泄漏的问题。(一般不选择此种模式)

2、Python上下文管理器使用会话,代码流程如下:

# 创建一个会话,并通过Python中的上下文管理器来管理这个会话
with tf.Session() as sess:# 使用创建好的会话来计算关心的结果sess.run(...)# 不需要再调用“Session.close()”函数来关闭会话# 当上下文退出时会话关闭和资源释放也自动完成

使用Python上下文管理器,只需要将计算放在“with”的内部就可以,不需要手动进行关闭函数的运算,管理器退出时会自动释放资源,同时也能解决程序异常退出资源泄露的问题。

END

加群交流

欢迎加入CV联盟群获取CV和ML等领域前沿资讯

扫描添加CV联盟微信拉你进群,备注:CV联盟

热文荐读

推荐来自清华、中科院超级学霸的优质公众号!

深度学习在计算机视觉领域的应用一览!超全总结!

Google学术发布2019年最有影响力的7篇论文!

手把手教你安装配置最新2019Pycharm!

点个在看支持一下吧

TensorFlow零基础入门指南——计算模型、数据模型、运行模型!相关推荐

  1. 初级软件测试工程师零基础入门指南

    初级软件测试工程师零基础入门指南 唐井军 编著 2012年10月 1.基本概念 1.1软件 软件就是可以在计算机上运行的计算机程序,如操作系统Windows.办公软件Office.聊天QQ.手机游戏等 ...

  2. Pr零基础入门指南笔记一——项目、序列、预设

    1.学习地址 [干货]PR零基础入门指南第二集:新建项目和序列以及预设,基础但非常重要,PR萌新必学!_哔哩哔哩_bilibili 2.视频剪辑 3.项目 项目管理文件夹  主项目文件夹 日期+项目名 ...

  3. Pr零基础入门指南笔记三-------------视频效果与转场

    目录 精剪第一步--视频效果与转场 1.三大面板 2.位置 3.效果库 4.常用视频效果 [干货]PR零基础入门指南第四集:PR常用的效果和转场,视频防抖.宽银幕效果.设置默认效果等_哔哩哔哩_bil ...

  4. 零基础入门量子计算:从一个神奇的概念进入量子世界

    导读:量子比特是量子计算的基本单位,量子比特可以用电子的自旋或光子的偏振来表示.本文将从量子特有的自旋概念开始,带你进入神奇的量子世界.限于篇幅,本文将略过光子的偏振相关内容,如果你对这部分内容感兴趣 ...

  5. Python零基础入门指南

    目前来说Python是一门非常火爆的编程语言.Python在人工智能.机器学习.大数据.数据分析.网络爬虫等领域有了比较高的地位,可以说前景是非常好的.在编程领域也是非常适合作为兴趣培养的一门语言,相 ...

  6. tensorflow零基础入门学习

    开发环境:tensorflow-gpu-2.20.pycharm实现 目录 入门知识 张量(Tensor) 数据类型 (1) 整型和浮点型 (2) 布尔型 (3) 字符串 创建数据 创建Tensor ...

  7. 软件测试工程师零基础入门指南

    前言: 有一些朋友会问到软件测试入行难不难,该怎么做,觉得自己就像一个无头苍蝇一样完全找不到方向.跟好几个朋友聊了不少,那么今天就具体整理总结一下,关于学习.入门直到完全融入这个岗位的一些看法,话不多 ...

  8. TensorFlow零基础入门教程(一)

    1.计算图 首先解释什么是计算图,了解TensorFlow的计算模型. 和我们常见的程序计算框架不同,并不是赋值,或者计算后,TensorFlow立马完成这些操作,而是将这些操作,赋予在一个图中,这个 ...

  9. UI设计师零基础入门指南(附2019最新UI设计学习线路图)

    对于UI设计新手而言,想要快速入门,就需要弄明白UI设计是什么?需要学习哪些内容?然后根据自己的学习目制定明确的学习计划和学习路线,按照科学系统的方法,由浅入深,循序渐进的进行能力提升,唯有如此才能快 ...

最新文章

  1. 人脸对齐端到端Super-FAN
  2. python非阻塞输入_python_非阻塞套接字及I/O流
  3. Hugging Face官方课程来了!Transformers库维护者之一授课,完全免费
  4. 手机号验证_谷歌修改密码时遇到手机号验证的解决办法
  5. 基于可靠消息方案的分布式事务:Lottor介绍
  6. csr8670 修改key_CSR8670 DFU user guide
  7. Redis遇到的那些坑
  8. Google AJAX 搜索 API
  9. react native loading动画_TypeScript for React (Native) 进阶
  10. 外网访问内网Tornado
  11. 强烈推荐asp.net数据访问的官方指南系列 (Data Access Tutorials)
  12. AutoCAD-选项配置(OP)
  13. 简单循迹小车实验心得_简单循迹小车的制作
  14. Java加密:四、非对称加密算法
  15. 台式计算机开机慢,台式电脑开机很慢的解决办法
  16. Unicode双向算法详解(bidi算法)(一)
  17. 易语言超级算法转php,易语言 PHP RC4算法同步应用源码
  18. [2015 Springer] Local Image Descriptor: Modern Approaches——2 Classical Local Descriptors
  19. input框不可编辑的三种方法
  20. 基于JavaWeb实现的师生交流系统平台

热门文章

  1. 怎么判断噎到没噎到_嚼半天吐出来,稍硬的食物都不吃,1岁的孩子咀嚼能力差怎么办?...
  2. 上银伺服驱动器说明书_威海伺服驱动器维修,诚信互利
  3. client netty 主动发数据_Netty服务器无限循环给客户端发送数据
  4. mysql 缓冲区_mysql 线程级别的缓冲区
  5. Java自动生成增量补丁自动部署_java-Hibernate正在为表生成自动增量交替ID
  6. python 3.8 新特性_Python 3.8六大新功能
  7. 快递取件码生成软件_一种自动生成取件码的快递柜及其使用方法与流程
  8. 内置函数enumerate()使用
  9. COJ 1700:联通与次联通
  10. WINCE快捷方式详解