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. Java连载38-对象封装性格式、构造方法

    一.封装的步骤 (1)所有属性私有化,使用private关键字进行修饰,private表示私有的,修饰的所有数据只能在本类中进行访问. (2)对外提供简单的操作入口,也就是说以后外部程序要想访问age ...

  2. tomcat正常运行一段时间后,突然访问不了项目了

    前言 我将项目部署在tomcat服务器上,本来都是好好的,输入网站地址就能访问:但是第二天一早去就会发现网站访问提示404,文件无法找到:我就很懵了. 排查 1.我是用的是chrome浏览器,所以尝试 ...

  3. spring tomcat启动 请求处理

    onRefresh(); protected void onRefresh() { try { createEmbeddedServletContainer(); } } private void c ...

  4. sqlplus简单使用

    登录 C:\Users\inmeditation>sqlplus 请输入用户名: scott 输入口令: 查看当前行长 SQL> show linesize; linesize 80 查看 ...

  5. IDEA快速修复错误快捷键

    有的时候在IDEA中编写代码,会出现错误提示,比如需要处理异常 将光标移动到出错,也就是划红线的地方,行首会出现一个小灯泡,点击会出现图二,可以按照提示进行修复

  6. VMware+windbg时快照功能的使用

    VMware+windbg时快照功能的使用 一.快照功能的使用 我们在编写与调试驱动文件时经常会面临死机蓝屏情况,如果像平常一样重启,再重新配置环境,肯定会占用大量时间. Vmware虚拟机给我们提供 ...

  7. TEXT_CONVERT_XLS_TO_SAP 错误排查

    转自:https://blog.csdn.net/ityangjia/article/details/88827308 本文链接:https://blog.csdn.net/ityangjia/art ...

  8. CodeFirst开发方式创建数据库

    1).新建ADO.NET实体数据模型--->选择空CodeFirst模型 2).新建两个实体类(客户表和订单信息表) using System; using System.Collections ...

  9. IDEA创建父模块与子模块

    1.IDEA点击New Project 2.点击+: 3.在[project]包下新建一个模块Moudle,名叫(springcloud)//root模块 4.继续添加模块Initializr持续ne ...

  10. python基础编程——类和实例

    在了解类和实例之前,需要先了解什么是面向对象,什么又是面向过程.面向过程是以过程为中心实现一步步操作(相互调用,类似流水线思想):面向对象是以事物为中心,某个事物可以拥有自己的多个行为,而另一个事物也 ...