↑ 点击上方【计算机视觉联盟】关注我们

今天开始,小编会更新TensorFlow系列文章,包括TensorFlow的使用和TensorFlow实践的项目等。

本篇主要介绍TensorFlow的计算模型(计算图)数据模型(张量)运行模型(会话)。通过这三个角度对TensorFlow的介绍,读者可以对TensorFlow的工作原理有一个大致的了解。

§§

1、TensorFlow计算模型一一计算图

(1)计算图的概念

TensorFlow的名字中己经说明了它最重要的两个概念一一Tensor和Flow。Tensor就是张量,张量可以被简单地理解为多维数组。Flow则体现了它的计算模型。Flow翻译成中文就是“流”,它直观地表达了张量之间通过计算相互转化的过程。TensorFlow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。

如下图所示,每一个节点都是一个运算,每一条边代表了计算之间的依赖关系。如果一个运算的输入依赖于另一个运算的输出,那么这阿玲哥运算有依赖关系。下图中,a和b两个常量不依赖任何其他计算,add计算则依赖读取两个常量的取值。所以在下图中就得到一条从a到add的边和从b到add的边。没有任何计算依赖add节点,所以add节点没有指向其他节点的边。TensorFlow的程序都可以通过类似下图所示的计算图形式来表示。

TensorBoard可视化向量相加的计算图

(2) 计算图的使用

TensorFlow 程序一般可以分为两个阶段。在第一个阶段需要定义计算图中所有的计算;第二个阶段为执行计算。

下边给出计算图中的定义阶段:

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

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

在这个过程中,TensorFlow 会自动将定义的计算转化为计算图上的节点 。在TensorFlow程序中,系统会自动维护一个默认的计算图,通过 tf.get_default_graph 函数可以获取当前默认的计算图。

以下代码示意了如何获取默认计算图以及如何查看一个运算所属的计算图 :

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

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

 1import tensorflow as tf2gl = tf.Graph()3with gl.as_default () :4    # 在计算图g1中定义变量v,并初始化为05    v = tf.get_variable(” v ”, initializer=tf.zeros_initializer(shape=[l)))67g2 = tf.Graph()8with g2.as_default () :9    # 在计算图g2中定义变量v,并初始化为1
10    v = tf.get_variable(” v ”, initializer=tf.ones_initializer(shape=[l)))
11
12# 在计算图g1中读取变量“v”的值
13with tf.Session(graph = g1) as sess:
14    tf.global_variables_initializer().run()
15    with tf.variable_scope("", reuse = True):
16        # 在计算图g1中,变量“v”的取值应该为0,所以下面这行输出为[0.]
17        print(sess.run(tf.get_variable("v")))
18
19# 在计算图g2中读取变量“v”的值
20with tf.Session(graph = g2) as sess:
21    tf.global_variables_initializer().run()
22    with tf.variable_scope("", reuse = True):
23        # 在计算图g2中,变量“v”的取值应该为1,所以下面这行输出为[1.]
24        print(sess.run(tf.get_variable("v")))

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

◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆

2、TensorFlow数据模型——张量

(1)张量的概念

在 TensorFlow程序中,所有的数据都通过张量的形式来表示,从功能的角度上看,张量可以被简单理解为多维数组。张量中并没有存储真正的数字,而是存储张量的结构。一个张量中主要保存了三个属性: 名字(name)、维度(shape)和类型(type)。

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

(2)张量的使用

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

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

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

◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆

3、TensorFlow运行模型——会话

TensorFlow中的会话(session)来执行定义好的运算。会话拥有并管理 TensorFlow 程序运行时的所有资源。所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄漏的问题。

TensorFlow中使用会话模式一般有两种:

(1)第一种模式需要明确调用会话生成函数和关闭会话函数,代码流程如下:

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

(2)第二种模式是通过Python的上下文管理器来使用会话,代码流程如下:

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

通过Python上下文管理器的机制,只要将所有的计算放在 “ with”的内部就可以 。当上下文管理器退出时候会自动释放所有资源。

◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆

知道TensorFlow工作的原理之后,我们就可以用TensorFlow去写我们的程序了!!

后续会更新使用TensorFlow实践项目的例子,敬请期待呦!

往期回顾

亲身经历2019年校招8个大厂心得体会,纯干货分享(大疆、百度...)

2018年29篇必读机器学习论文总结,BERT, SeqGAN等上榜

机器学习经典算法决策树原理详解(简单易懂)

斯坦福李飞飞高徒Johnson博士论文: 组成式计算机视觉智能(附195页PDF)

带你详细了解机器视觉竞赛—ILSVRC竞赛

2018年度最强的30个机器学习项目!

何恺明等最新突破:视频识别快慢结合,取得人体动作AVA数据集最佳水平

【TensorFlow系列一】TensorFlow工作原理相关推荐

  1. Git使用 从入门到入土 收藏吃灰系列(四) Git工作原理

    文章目录 一.前言 一.Git基本理论(核心) 1.1工作区 1.2工作流程 一.前言 参考安装Git 详细安装教程 参考视频B站 Git最新教程通俗易懂,这个有点长,感觉讲的精华不多 参考视频『Gi ...

  2. Spark系列(八)Worker工作原理

    工作原理图 源代码分析 包名:org.apache.spark.deploy.worker 启动driver入口点:registerWithMaster方法中的case LaunchDriver 1  ...

  3. iommu 工作原理解析之dma remapping

    深入了解iommu系列二:iommu 工作原理解析之dma remapping: https://zhuanlan.zhihu.com/p/479963917

  4. Part1:使用 TensorFlow 和 Keras 的 NeRF计算机图形学和深度学习——计算机图形学世界中相机的工作原理

    Part1:使用 TensorFlow 和 Keras 的 NeRF计算机图形学和深度学习 1. 效果图 2. 原理 2.0 前向成像模型 2.1 世界坐标系 2.2 相机坐标系 2.3 坐标变换 2 ...

  5. 深入理解 SAP Fiori Elements 工作原理系列之二:如何给 SAP Fiori Elements 应用添加自定义按钮

    这是 Jerry 2021 年的第 33 篇文章,也是汪子熙公众号总共第 309 篇原创文章. Jerry 的日常工作内容从 2020 年 8 月转到 Angular 前端开发之后,算是领略到了这个流 ...

  6. 大白话5分钟带你走进人工智能-神经网络之tensorflow的前世今生和DAG原理图解

    神经网络是一门重要的机器学习技术.它是目前最为火热的研究方向--深度学习的基础.学习神经网络不仅可以让你掌握一门强大的机器学习方法,同时也可以更好地帮助你理解深度学习技术.而 Tensorflow 是 ...

  7. TensorFlow 系列案例(3): 使用TensorFlow DNN分类器对数据进行分类

    TensorFlow 卷积神经网络系列案例(1):猫狗识别 https://blog.csdn.net/duan_zhihua/article/details/81156693 TensorFlow ...

  8. 公布旗下(飞秋)系列软件工作原理

    即时通讯11版,(飞秋)发表<局域网通信>,公布旗下(飞秋)系列软件工作原理,呼吁软件同行透明化.很快QQ的产品团队做出了反应,对外声明"关于某公司诬蔑腾讯QQ'窥视用户隐私'的 ...

  9. 调试器工作原理系列一: 基础篇

    调试器工作原理系列一: 基础篇 本文是一系列探究调试器工作原理的文章的第一篇.我还不确定这个系列需要包括多少篇文章以及它们所涵盖的主题,但我打算从基础知识开始说起. 关于本文 我打算在这篇文章中介绍关 ...

最新文章

  1. 用神经网络做分子动力模拟 二氟甲烷,二氯甲烷,二溴甲烷并计算键值
  2. stm32--对固件库的认识2
  3. kali安装vmtools不能拖拽(复制粘贴)文件解决方法
  4. 如何编译 dotnet/aspnetcore 源代码
  5. electron 打包后 __static_electron开发客户端注意事项(兼开源个人知识管理工具“想学吗”)...
  6. 【Git】Git解决文件本地更改的合并覆盖错误
  7. 小米11 Pro系列细节再曝光:大杯大升级!
  8. 排球计分程序功能说明书
  9. spring-boot+spring-session集成
  10. 项目常用工具类整理(二)--ckeditor的引用
  11. 西南交大量子计算机,上海交大“致远学者”本科生突破光量子计算机探测瓶颈问题...
  12. Xcode因为证书问题经常报的那些错
  13. centos 7的systemctl
  14. psd缩略图上传控件
  15. sfp寄存器_查看光模块信息 - E600 V200R011C10 配置指南-设备管理 - 华为
  16. MAC使用Charles,代理后,部分网页无法打开解决方法
  17. 母亲节与父亲节之我见
  18. 【AE】2 ICommand和ITool
  19. 万字长文深度剖析面向对象的javascript
  20. 破解TA朋友圈“仅三天可见”

热门文章

  1. springboot 日志_Springboot与日志
  2. python 数据分析 实际案例_python在实际工作中运用的案例
  3. python中codecs_Python:如何使用codecs模块将unicode数据保存成gbk格式
  4. 2014年高级计算机操作员工种代码36-323不可积分入户深圳吗,2014年深圳积分入户工种加分考证...
  5. css3 选择器_10-CSS3选择器详解
  6. java 拟合曲线_如何通过指数曲线拟合数据
  7. 润乾单查日期特别慢_SQL编写不合理导致历史日志查询特别慢
  8. spark代码连接hive_spark SQL学习(spark连接hive)
  9. golang基础之初识
  10. SpringBoot入门(四)——自动配置