Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算。TensorFlow的运行机制属于“定义”和“运行”相分离。模型的构建只是相当于定义了一个图结构(代表一个计算任务),图中有多个操作节点,每个节点可以有一个或多个tensor作为输入,也会输出1个或多个tensor,只有通过session启动一个会话,并通过feed机制把数据填充进去,数据以tensor的形式进行流动,整个计算任务才能被启动。

用with关键字在程序结束之后会自动关闭

对TensorFlow中图的理解

一个操作对象(Operation)是TensorFlow图中的一个节点, 可以接收0个或者多个输入Tensor, 并且可以输出0个或者多个Tensor,Operation对象是通过op构造函数(如tf.matmul())创建的。

具体参考:

https://www.jianshu.com/p/b547c163e202

https://blog.csdn.net/sinat_26745777/article/details/84350681

和图相关的常用函数

https://blog.csdn.net/lenbow/article/details/52181159

class tf.Graph  tensorflow中的计算以图数据流的方式表示,一个图包含一系列表示计算单元的操作对象以及在图中流动的数据单元以tensor对象表现

tf.Graph()    建立一个空图

tf.Graph.as_default()    一个将某图设置为默认图,并返回一个上下文管理器,如果不显式添加一个默认图,系统会自动设置一个全局的默认图。所设置的默认图,在模块范围内所定义的节点都将默认加入默认图中

tf.Graph.as_graph_def(from_version=None, add_shapes=False)    返回一个图的序列化的GraphDef表示,序列化的GraphDef可以导入至另一个图中(使用 import_graph_def())    #在把图进行pb封装时会用到

tf.reset_default_graph()  #重置默认图,加载图之间应该先重置默认图,因为不重置在封装多个图时可能会加载别人的图

tf.Graph.get_operation_by_name(name)   根据名称返回操作节点       tf.Graph.get_operation_by_name(name).output[0]  获得相应名称操作节点其输出tensor中为0的tensor

tf.Graph.get_tensor_by_name(name)  根据名称返回tensor数据

所以访问计算图中的V1节点,就只能使用tf.get_default_graph().get_tensor_by_name("v1:0")的方式。

很多人可能并不理解这个:0,这是一个operation的输出。也就是说变量节点的输出只有一个,所以用0表示引用计算图中这个变量节点的输出tensor。

tf.Graph.get_operations()   返回图中的操作节点列表

加载持久化模型的方式

结合:http://www.mamicode.com/info-detail-2424278.html

第一种:通过saver加载saver = tf.train.Saver()   saver.restore

通过这种方式加载需要注意

1)程序前面得有 Variable 供 save or restore 才不报错否则会提示没有可保存的变量

2)这种方式只是持久化模型中变量的值加载到当前代码计算图中的变量中去。属于当前代码计算图已经定义,因此还必须在加载之前创建模型,变量是当前代码计算图中变量集合的一个子集,必须是一种严格包含的关系。

第二种:通过import_meta_graph

这种方式完全不允许当前代码计算图已经定义的变量节点和要加载的持久化模型中的节点存在冲突,因为它不仅加载参数还会加载整个图结构。

第三种:使用pb文件的方式。

即使持久化模型中的变量节点和当前代码计算图中定义的变量节点发生冲突,也没有问题,没有任何关系。因为pb文件的方式加载进来的计算图,会全部加上import/前缀。也就是说,从命名空间上就隔开了这种冲突。所以,使用别人的模型,最好的方式就是用pb文件。因为不会有冲突的可能!

但是,有一个弊端就是,import命名空间下的变量不能参与到当前的训练

同时,你使用v1=tf.get_variable(name="v1",shape=[1])方式,会在当前代码的计算图中生成一个新的变量节点V1_1,并非加载的持久化模型中的变量节点V1。此时,就会出现函数功能失效。也就是,你希望调用get_variable函数使得:python的变量v1和计算图中的变量节点v1是绑定的,但是情况并非如此,绑定的是变量节点v1_1。

所以访问计算图中的V1节点,就只能使用tf.get_default_graph().get_tensor_by_name("v1:0")的方式。

封装成pb文件的好处:

1、它具有语言独立性,可独立运行,封闭的序列化格式,任何语言都可以解析它,它允许其他语言和深度学习框架读取、继续训练和迁移 TensorFlow 的模型。

2、实现了创建模型与使用模型的解耦。

3、保存为 PB 文件时候,模型的变量都会变成固定的,导致模型的大小会大大减小。

4、避免造成命名的冲突。

TensorFlow基础篇的更多相关文章

  1. tensorflow基础篇-1

    1.使用占位符和变量 import tensorflow as tf import numpy as np #-----创建变量并初始化----------- def first(): my_var= ...

  2. tensorflow基础篇-2

    #-*- coding:utf-8 -*- import tensorflow as tf sess=tf.Session() #整流水线单元relu print sess.run(tf.nn.rel ...

  3. 【原创 深度学习与TensorFlow 动手实践系列 - 3】第三课:卷积神经网络 - 基础篇

    [原创 深度学习与TensorFlow 动手实践系列 - 3]第三课:卷积神经网络 - 基础篇 提纲: 1. 链式反向梯度传到 2. 卷积神经网络 - 卷积层 3. 卷积神经网络 - 功能层 4. 实 ...

  4. [源码解析] TensorFlow 分布式 DistributedStrategy 之基础篇

    [源码解析] TensorFlow 分布式 DistributedStrategy 之基础篇 目录 [源码解析] TensorFlow 分布式 DistributedStrategy 之基础篇 1. ...

  5. C#多线程之基础篇3

    在上一篇C#多线程之基础篇2中,我们主要讲述了确定线程的状态.线程优先级.前台线程和后台线程以及向线程传递参数的知识,在这一篇中我们将讲述如何使用C#的lock关键字锁定线程.使用Monitor锁定线 ...

  6. 一步步学习javascript基础篇(0):开篇索引

    索引: 一步步学习javascript基础篇(1):基本概念 一步步学习javascript基础篇(2):作用域和作用域链 一步步学习javascript基础篇(3):Object.Function等 ...

  7. 2000条你应知的WPF小姿势 基础篇<15-21>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...

  8. ABP框架实践基础篇之开发UI层

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 说明 其实最开始写的,就是这个ABP框架实践基础篇.在写这篇博客之前,又回头复习了一下ABP框架的理论,如果你还没学习,请查看AB ...

  9. C#多线程之基础篇2

    在上一篇C#多线程之基础篇1中,我们主要讲述了如何创建线程.中止线程.线程等待以及终止线程的相关知识,在本篇中我们继续讲述有关线程的一些知识. 五.确定线程的状态 在这一节中,我们将讲述如何查看一个线 ...

随机推荐

  1. Ubuntu上的apt/apt-get等命令的实质意义和区别

    Ubuntu上的apt/apt-get等命令的实质意义和区别 一.前言 在使用apt和apt-get命令的时候我们常常会疑惑这两者有什么区别,因为大多数时间这两个命令能做很多相同的事情. 二.APT/ ...

  2. (二十五)golang--数组

    数组:存放多个同一类型的数据.在Go中,数组也是一种值类型数组的基本定义: 数组的内存布局: 数组的地址可以用&取出,且它的地址就是第一个元素的地址 数组不用被被初始化而默认是有值的: 数组中 ...

  3. JDBC数据库连接测试工具

    贴代码 import java.io.PrintStream; import java.sql.*; import java.util.Properties; public class ZJdbcPi ...

  4. List集合分组实现教程

    封装一个方法,用一个Map来实现,这里是根据bean类的seq字段进行拆分的,分成好几个list private LinkedHashMap<String,List<HandleInfo& ...

  5. 【杂文】CSP2019蒟蒻AFO(假)记

    [杂文]CSP2019蒟蒻AFO(假)记 [初赛前 N 天] 时间:2019-10-15 今晚 \(2012\) 的初赛题做到心态爆炸,选择考计算机基础知识一脸懵逼,填空和后面一道大模拟直接跳过,最后 ...

  6. CentOS7/Ubuntu18系统时间同步ntp(转载)

    转自  https://blog.csdn.net/u010226454/article/details/80896959 ---centos7.2上搭建ntp服务器,并实现时间同步 对于容器编排系统 ...

  7. Ajax异步后台加载Html绑定不上事件

    因项目需要,需要实时从后台动态加载html,开发过程中,遇到事件绑定不上,后来百度一番,大概意思:ajax是异步加载的,页面一开始绑定事件的时候,后台数据还没有传过来,就绑定事件,这个时候找不到这个d ...

  8. 【转载】Visual Studio2017如何打包发布Winform窗体程序

    在用C#语言编写好Winform窗体程序后,最后一步的操作是将设计好的Winform程序代码进行打包以及发布成安装包.在Visual Studio2017开发工具中,打包发布WinForm程序是比较简 ...

  9. Nexus6P 设置Debug模式

    一劳永逸,设置手机进入Debug模式实现完美Root 使用mkbootimg进行boot.ing编辑 将修改的系统官方Rom包中的boot.ing和mkbooting工具中的mkboot.mkboot ...

  10. python从入门到放弃之守护进程

    # ### 守护进程 默认情况下,主进程要等待所有子进程执行完毕之后,才会关闭程序,释放资源守护进程进行在主进程代码执行结束之后,就直接关闭;守护进程守护的是主进程 语法: 进程.daemon = T ...