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. 十二、Spring之IOC容器初始化

    Spring之IOC容器初始化 前言 在前面我们分析了最底层的IOC容器BeanFactory,接着简单分析了高级形态的容器ApplicationContext,在ApplicationContext ...

  2. Element-ui 下拉列表 全选 多选时 select全选 新增一个选择所有的选项

    项目里经常会用到,在一个多选下拉框里新增一个选择所有的选项,例如: <!DOCTYPE html> <html lang="en"> <head> ...

  3. 使用Node.js时如何引入jQuery

    使用Node.js时如何引入jQuery 首先安装jQuery依赖 npm install jquery 然后安装jsdom npm install jsdom 引入jQuery 新版正确的依赖方式 ...

  4. java jdb

    https://stackoverflow.com/questions/8155253/how-do-i-compile-in-debug-mode-netbeans-java-maven <p ...

  5. 移动端BUG

    1.解决 Android 系统 设置line-height和height相同,文字却偏上显示(pc端和ios都显示ok) 行高设置为 normal 则可以解决. 然后高度通过padding填充 lin ...

  6. sentry 9.1.1docker版onepremise过程记录

    sentry安装:https://github.com/getsentry/onpremise正确使用此文档安装步骤,安装版本9.1.1-onbuild,这个需要自改Dockerfile. 备注:构建 ...

  7. K8S集群集成harbor(1.9.3)服务并配置HTTPS

    一.简介 简介请参考:https://www.cnblogs.com/panwenbin-logs/p/10218099.html 二.安装Harbor主机环境及安装要求 主机环境: OS: Cent ...

  8. F#周报2019年第24期

    新闻 ML.NET 1.1发布与模型构建器升级 .NET Core 3.0预览版6发布 尝试新的System.Text.Json API F#调用Infer.NET 匿名记录类型文档 了解FableC ...

  9. 解决 Windows Server 2008 R2 上 Windows Update 无法失败,提示 8024402F

    1.同步服务器时间 2.打开 services.msc,停止 Windows Update Service 3.手动下载 KB3138615 补丁:https://support.microsoft. ...

  10. jmeter入门操作 = 接口

    1.没安装工具的朋友,不熟悉菜单插件使用的朋友,请先看:https://www.cnblogs.com/beile/p/11007754.html 2.开始调用http请求 测试地址:http://h ...