TensorFlow基础(1)-中使用多个 Graph

2023-11-11

代码中有时候会遇到
with tf.Graph().as_default():
其实这个可以有也可以没有,可能是可以让自己的思路更加清楚吧,知道这里开始新建图了。

tensorflow官方教程

翻译

简介

当我们训练一个模型时,通常的做法是用一个 Graph 训练模型,然后用另一个 Graph 来评估模型的训练情况,因为在许多情况下,训练和测试的前向推导过程是不一样的,因为训练的时候通常包括了dropout和 BN 操作,而测试的时候则不需要或使用不一样的参数。但是这样有一个使用起来很不方便的地方,那就是训练和测试各自需要一个显卡,对于资源不是那么充裕的使用者就很不方便了,是否可以在一个进程内运行两个不同的计算图呢?

创建新计算图的优势

通常情况下,使用 TensorFlow 提供的默认计算图 Graph 就已经能够完成所有的工作了,但是,它也提供了方法来操作默认的计算图 Graph,用以适应更复杂的情况,比如说一个 Graph 定义了它内部所有 OP 的命名空间,所有内部 OP 都会自动命名为不重复的情况,但是还是会使得 OP 的名称比较复杂,那么如果显式的创建一个 Graph 就会给你为 OP 命名带来更多的控制权。

另外,默认的计算图 Graph 会存储所有的 OP 和 tensor 的信息,但是如果你创建的计算图是多个没有关联的子计算图,那么还不如创建多个独立的计算图,这样会使得原来的不相干的子图之间的声明被系统当做垃圾回收。

使用方法(有点问题)

可以先使用 tf.Graph 建立一个新的计算图,然后使用 tf.Graph.as_default 来创建一个上下文管理器来指定该计算图内部的结构;可以看如下代码:

g_1 = tf.Graph()
with g_1.as_default():
  # Operations created in this scope will be added to `g_1`.
  c = tf.constant("Node in g_1")

  # Sessions created in this scope will run operations from `g_1`.
  sess_1 = tf.Session()

g_2 = tf.Graph()
with g_2.as_default():
  # Operations created in this scope will be added to `g_2`.
  d = tf.constant("Node in g_2")

# Alternatively, you can pass a graph when constructing a `tf.Session`:
# `sess_2` will run operations from `g_2`.
sess_2 = tf.Session(graph=g_2)

assert c.graph is g_1
assert sess_1.graph is g_1

assert d.graph is g_2
assert sess_2.graph is g_2

这段代码表明了两种使用不同的 session 来运行不同的计算图的方式,一种是直接在该计算图g_1 Graph 内部调用 session ,一种是在该计算图的外部将 g_2 传入 session。

如果要查看当前使用的是哪个计算图,可以使用如下方法:

# Print all of the operations in the default graph.
g = tf.get_default_graph()
print(g.get_operations()) 

这段代码运行出来,在这记录一下。

使用方法

参考

我觉得参考的代码看起来很舒服,简单的变成的py3,代码很清晰,比官网好多了。

    # -*- coding: utf-8 -*-)  
    import tensorflow as tf  
      
    # 在系统默认计算图上创建张量和操作  
    a=tf.constant([1.0,2.0])  
    b=tf.constant([2.0,1.0])  
    result = a+b  
      
    # 定义两个计算图  
    g1=tf.Graph()  
    g2=tf.Graph()  
      
    # 在计算图g1中定义张量和操作  
    with g1.as_default():  
        a = tf.constant([1.0, 1.0])  
        b = tf.constant([1.0, 1.0])  
        result1 = a + b  
      
    with g2.as_default():  
        a = tf.constant([2.0, 2.0])  
        b = tf.constant([2.0, 2.0])  
        result2 = a + b  
      
      
    # 在g1计算图上创建会话  
    with tf.Session(graph=g1) as sess:  
        out = sess.run(result1)  
        print('with graph g1, result: {0}'.format(out))  
      
    with tf.Session(graph=g2) as sess:  
        out = sess.run(result2)  
        print('with graph g2, result: {0}'.format(out)) 
      
    # 在默认计算图上创建会话  
    with tf.Session(graph=tf.get_default_graph()) as sess:  
        out = sess.run(result)  
        print( 'with graph default, result: {0}'.format(out))  
      
    print(g1.version)  # 返回计算图中操作的个数  

结果

-

with graph g1, result: [2. 2.]
with graph g2, result: [4. 4.]
with graph default, result: [3. 3.]
3

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TensorFlow基础(1)-中使用多个 Graph 的相关文章

随机推荐

  • C语言之结构体内存的计算

    结构体的内存 一 提出疑问 结构体占用的是一片连续的内存空间 大小是由成员变量的类型决定的 但并不是计算所有成员变量的类型大小之和那么简单 先举一个实例 struct student int age 4个字节 int telephone 4
  • win系统使用frp端口映射实现内网穿透,配置“任务计划程序”提高稳定性

    Github下载最新版frp https github com fatedier frp releases download v0 48 0 frp 0 48 0 windows amd64 zip 解压把frpc exe和frpc ini
  • 【2】Python爬虫:分析AJAX传递的JSON获取数据-初步分析动态网页(1)

    前言 这是本人写的第二篇文章 希望能够帮助到一些和我一样的python爬虫初学者 在第一篇文章中 我总结了最近学到的利用requests和bs4第三方库共同作用 基本可以应对python获取静态网页数据的相关问题 但是如果现实中的网页往往比
  • JVM 四. 对象布局

    目录 一 对象实例化相关 创建对象的步骤 二 对象的内存布局 三 对象的访问定位 一 对象实例化相关 有哪些方式可以创建一个对象 new 方式创建一个对象 由new方式创建对象又延伸出 Builder建造者方式 Factory工厂方 等静态
  • 链表排序——选择排序法(纯C语言版)

    链表选择排序 链表的排序 功能 选择排序 由小到大 返回 指向链表表头的指针 选择排序的基本思想就是反复从还未排好序的那些节点中 选出键值 就是用它排序的字段 我们取学号num为键值 最小的节点 依次重新组合成一个链表 我认为写链表这类程序
  • 表弟高中毕业,半路学Python爬虫,现在月薪20—30k,嫉妒使人面目全非

    python近几年越来越火爆 爬虫工程师也很火 市场需求挺大 工资还算可观 很多不是计算机专业出身的人被薪资吸引 也开始转战python爬虫 那么半路学Python爬虫 学到什么程度可以面试爬虫工程师呢 首先要明确一点 python只不过是
  • Git第十四讲 Git标签管理

    Git标签是用于标记项目中的特定版本的重要工具 它们通常用于标识发布版本或里程碑 本文将介绍如何在Git中创建 查看和管理标签 创建标签 要在Git中创建一个标签 可以使用git tag命令 有两种类型的标签 轻量标签和附注标签 轻量标签
  • ML/DL-复习笔记【十】- 分组卷积和深度可分离卷积的区别

    本节为ML DL 复习笔记 十 分组卷积和深度可分离卷积的区别 主要内容包括 分组卷积与深度可分离卷积的参数量分析 最早出现分组卷积是AlexNet 由于单块GPU显存的限制 需要将网络部署在两张显卡上 分别进行训练最后再融合 Alex认为
  • 鸿蒙出来后H5足以取代原生app

    本地模式的H5渲染效果 其实已经在性能上无限接近于原生 也就是说当你使用file 而非http 访问H5页面的时候 打开速度也是非常快的 而且现在安卓和ios里面 提供了js访问原生代码的能力 目前有很多H5开发框架 集成了访问原生的能力
  • 在线标签云词云

    易词云 https www yciyun com 优点 可显示中文词条 可下载 缺点 字体大小控制不精准 下载高清图像要收费 wordart https wordart com 优点 免费 功能强大 缺点 不可以显示中文 可能需要添加中文字
  • 凌晨睡不着,想起了童年,写首诗吧,就叫《童年》

    雪夜里轻快又谨慎的踩雪声 印出稚嫩的脚印 一个胆大又怯懦的孩童 把手电筒插在帽兜里当做矿灯照明 微声哼着只有自己能听到的歌 沧桑的锁有节奏地拍打着大门 发出心里人的归家之念 炕上坐着的妇女 闻声而来 夏日晌午的小孩 在庭院里逗着毛虫 趁着无
  • SOTA模型训练笔记(完善中)

    文章目录 记录感知SOTA模型训练的过程 1 语义分割 1 PolarNet 2 Cylinder3D 2 视觉人体姿态识别 1 ViTPose 3 点云目标检测 1 centerpoint 记录感知SOTA模型训练的过程 1 语义分割 1
  • windows 使用docker安装elasticsearch报错

  • 使用ensp搭建简单校园网拓扑

    使用ensp搭建简单校园网拓扑 一 校园网拓扑 1 每台电脑代表一个vlan 2 二层交换机向下的每个端口需要做access 向上的每个端口需要做trunk 3 三层交换机向下的每个端口需要做trunk 而且需要为每个vlan接口配置ip地
  • Intellij IDEA2017.3.5安装

    1 下载安装包及 链接 https pan baidu com s 16az6tmQub bOn2CFOXLa2g 提取码 7689 复制这段内容后打开百度网盘手机App 操作更方便哦 2 将下载的JetbrainsCrack 2 7 re
  • js中(...)用法

    1 深拷贝一个对象 如上图所示 obj和tmp是完全两个独立的对象 互不影响 2 数组复制 3 函数形参中的使用 这里的 args 是对test函数中多余的参数进行收集 并转换成数组的形式进入函数体中 4 一种特殊情况 当数组里面套对象的时
  • sql 时间函数(全)

    Cite http www jb51 net article 20832 htm 1 当前系统日期 时间 select getdate 2 dateadd 在向指定日期加上一段时间的基础上 返回新的 datetime 值 例如 向日期加上2
  • C++结构体对齐问题

    规则1 结构体成员的内部偏移量 内部地址 要被这个成员的数据类型大小整除 规则2 整个结构体的大小 必须是最大成员的size整数倍 否则就需要在末尾补充空白字节 规则3 对于结构体中的结构体 按照结构体展开之后的内存对齐来处理 规则4 人为
  • 余老师带你学习大数据框架全栈第十三章Hudi第一节核心技术

    1 前言 1 1为什么产生数据湖 数据量比较大 越来越不满足处理结构化的数据 比如说数仓 数仓就是处理结构化数据 什么是结构化数据 就是数据成数据库来的 传统型的数据库有 MySQL数据库 Oracle SQLserver 从这些库里面过来
  • TensorFlow基础(1)-中使用多个 Graph

    代码中有时候会遇到 with tf Graph as default 其实这个可以有也可以没有 可能是可以让自己的思路更加清楚吧 知道这里开始新建图了 tensorflow官方教程 翻译 简介 当我们训练一个模型时 通常的做法是用一个 Gr