Tensorflow笔记1:Graph

2023-05-16

参考内容都出自于官方API教程tf.Graph

一、Graph类调用

  这里使用的是1.15版本,TF官方为了能够在2.0+版本中保持兼容,因此调用时使用了tf.compat.v1.Graph。若安装的就是1.15版本,直接tf.Graph即可。
  定义:一个Graph是一系列tf.Operation(表示计算单元)和tf.Tensor(表示operations之间的数据流单元)的组合。
  在构建图时,系统已经默认有default Graph被注册,可以直接向默认图中添加操作。这个默认的图通过**tf.get_default_graph()**来获取。下例在默认图中创建了一个操作,并且查看是否成功添加进了图:

a = tf.constant(4.0)
print(a.graph)
print(tf.get_default_graph())
# <tensorflow.python.framework.ops.Graph object at 0x7f47bc159490>
# <tensorflow.python.framework.ops.Graph object at 0x7f47bc159490>

  也可以使用**tf.Graph()**新建图,并且设置为默认、添加操作。一般使用Context Manger来进行管理,使代码在局部生效。一旦脱离with区域,自定义默认图失效:

g = tf.Graph()
with g.as_default():
     b = tf.constant(30.0)
     print(b.graph)
     print(g)
     print(tf.get_default_graph())
     # <tensorflow.python.framework.ops.Graph object at 0x7f47b8a41a10>
     # <tensorflow.python.framework.ops.Graph object at 0x7f47b8a41a10>
     # <tensorflow.python.framework.ops.Graph object at 0x7f47b8a41a10>
tf.get_default_graph()
# <tensorflow.python.framework.ops.Graph object at 0x7f47bc159490>

二、方法

  并没有全列出来,见一个记录一个:

1.as_default()

  在上面已经阐述过,返回的是一个context manager,使得当前图为default graph。
如果不自定义图,则所有的Op都会被放置于系统默认图中。
一般使用with形式来进行调用,可以进行嵌套。使用方法如下:

# 1. Using Graph.as_default():
g = tf.Graph()			# 先创建
with g.as_default():	# 后设定默认
	c = tf.constant(5.0)
	assert c.graph is g

# 2. Constructing and making default:
with tf.Graph().as_default() as g:	# 创建同时设置默认,with结束后图依然存在
	c = tf.constant(5.0)
	assert c.graph is g

2.device()

  调用方法为device(device_name_or_function),其中的device_name_or_function一共有三种状况:

  • 设备的name string:所有在context中构建的Op都会被放置于制定设备中。
  • 若是一个function:每一次Op被创建时都会被调用。
  • 如果是None:Context中所有的设定都将被忽略。
# def a Graph (这个是在tf 1.2版本中完成的,设备写法为"/gpu:0")
g = tf.Graph()
with g.as_default():
    with g.device('/gpu:0'):
        e = tf.constant(2.0, name='a_g')
        print(e) # Tensor("a_g:0", shape=(), dtype=float32, device=/device:GPU:0)
    f = tf.constant(3.0)
    print(f) # Tensor("Const:0", shape=(), dtype=float32)
# tf 1.15版本,设备写法为"/device:GPU:0"
with g.device('/device:GPU:0'):
	# 创建的Op都将会被放置于GPU:0
	with g.device(None):
	    # 创建的Op都不会制定设备
	    
# 定义一个函数用于为Op指派设备
def matmul_on_gpu(n):
  if n.type == "MatMul":
    return "/device:GPU:0"
  else:
    return "/cpu:0"
    
# 按照函数的指派规则进行设备指定
with g.device(matmul_on_gpu):
  # "MatMul" constructed in this context will be placed on GPU 0; all other operations will be placed on CPU 0.

3.finalize()

  一旦一个Graph调用了此方法,此图被锁定,不能够添加新的Op。一般用于多线程中放置Op的添加。Graph具有finalized的property,用于查询Graph是否被锁定:

print g.finalized   # False 查看Graph的性质,未锁定
with g.as_default():
    n = tf.constant(1.0)    # Success 正常添加Op
g.finalize()    # Lock the Graph 调用方法锁定
print g.finalized   # True 查看Graph的性质,已锁定
with g.as_default():
    k = tf.constant(1.0)	# 继续添加Op,显示失败
    # RuntimeError: Graph is finalized and cannot be modified.

4.name_scope()

  调用方法:name_scope(name=string),返回一个context manager,能够对Op进行级联式/层级化命名。一旦一段中有with name_scope,则这段中所有名称的前面都会加入prefix。

  • 重复问题:如果和已有的scope重名,自动调用self.unique_name(name)创建一个新独特命名,策略为添加下标"_1"、"_2"…
with tf.Graph().as_default() as g:
	# 默认进入一级命名空间:如果指定的名称重复,TF自动指定下标
	# 说明:一个很有意思的现象,用tf.cst重复定义两次python变量,计算图内部会按照tf.cst被调用的次数直接新建图,与变量名称无关。因为Graph是Graph,python变量仅仅只是指针。
    c = tf.constant(5.0, name="c")
    assert c.op.name == "c"
    c_1 = tf.constant(6.0, name="c")
    assert c_1.op.name == "c_1"
    c_2 = tf.constant(7.0, name="c")
    assert c_2.op.name == "c_2"

	# 进入二级命名空间,别名为scope
    with g.name_scope("nested") as scope:
        nested_c = tf.constant(10.0, name="c")
        assert nested_c.op.name == "nested/c"	# 此空间下定义的op自动添加命名

        # Creates a nested scope called "inner". 三级命名空间
        with g.name_scope("inner"):
          nested_inner_c = tf.constant(20.0, name="c")
          assert nested_inner_c.op.name == "nested/inner/c"

        # Create a nested scope called "inner_1".三级命名空间
        with g.name_scope("inner"):
            nested_inner_1_c = tf.constant(30.0, name="c")
            assert nested_inner_1_c.op.name == "nested/inner_1/c"

            # Treats `scope` as an absolute name scope, and witches to the "nested/" scope. 可以通过绝对名称scope进行直接指定
            with g.name_scope(scope):
                nested_d = tf.constant(40.0, name="d")
                assert nested_d.op.name == "nested/d"
                
			# name为空字符串默认返回一级命名空间
            with g.name_scope(""):
                e = tf.constant(50.0, name="e")
                assert e.op.name == "e"
with tf.Graph().as_default() as g:
    inputs = tf.constant([1.0])
    with g.name_scope('my_layer') as scope:	# scope是此命名空间的绝对标识,context内外只能通过此名称进行重新加载
        weights = tf.Variable(initial_value=[0.1], name="weights")
        biases = tf.Variable(initial_value=[0.1], name="biases")
        affine = tf.multiply(inputs, weights) + biases
        output = tf.nn.relu(affine, name=scope)
    assert weights.op.name == "my_layer/weights"
    assert biases.op.name == "my_layer/biases"
    assert affine.op.name == "my_layer/add"
    assert output.op.name == "my_layer"
    
    # 定义新scope时容易产生问题:如果as后仍然为scope,则会导致前scope被覆盖。重名后,自动添加下标_1
    with g.name_scope('my_layer') as scope_:	# 创建了新的scope。
        weights = tf.Variable(initial_value=[0.1], name="weights")
        biases = tf.Variable(initial_value=[0.1], name="biases")
        affine = tf.multiply(inputs, weights) + biases
        output = tf.nn.relu(affine, name=scope_)
    assert weights.op.name == "my_layer_1/weights"
    assert biases.op.name == "my_layer_1/biases"
    assert affine.op.name == "my_layer_1/add"
    assert output.op.name == "my_layer_1"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tensorflow笔记1:Graph 的相关文章

随机推荐

  • 约束优化方法_2_——Frank-Wolfe方法

    Frank Wolfe方法属于约束优化中可行方向法的一种 上一篇博文对同类型的Zoutendijk可行性方法进行了介绍 xff0c 这一部分着重关注Frank Wolfe方法 Frank Wolfe方法的基本思想是 xff1a 每次迭代中使
  • 二次规划_1_——Lagrange方法

    二次规化是非线性规化中的一种特殊情形 xff0c 其目标函数是二次实函数 xff0c 约束是线性的 考试中会考到四种方法 xff0c 分别为 xff1a Lagrange方法 起作用集方法 直接消去法和广义消去法 前两种在教材上有详细描述
  • 二次规划_2_——起作用集方法

    这个算法很反人类 xff0c 迭代过程相当复杂 xff0c 最优化老师说 xff1a 明确地告诉你要考的 起作用集方法适用于消元法和Lagrange方法无法处理的不等式约束二次规化问题 其主要思想是 xff1a 以已知点为可行点 xff0c
  • 约束非线性优化:几何意义&对偶形式

    借助老师的PPT对约束非线性优化问题的几何意义 和对偶形式 进行阐述 一 几何意义 xff08 1 xff09 等式约束 考虑只有等式约束h x 的非线性优化问题 xff0c 形式为 xff1a 可视化结果如下图所示 xff0c 红色曲线为
  • 转载篇:优秀博文汇总

    1 Pytorch中堆网络语法 xff1a nn moduleList 和Sequential由来 用法和实例 写网络模型 https blog csdn net e01528 article details 84397174 2 CNN中
  • 批量归一化:Batch Normalization层 原理+Pytorch实现

    一 BN层概念明晰 BN层存在的意义 xff1a 让较深的神经网络的训练变得更加容易 BN层的工作内容 xff1a 利用小批量数据样本的均值和标准差 xff0c 不断调整神经网络中间输出 xff0c 使整个神经网络在各层的中间输出的数值更加
  • 模型量化——基础知识 & LSQ论文阅读

    感谢陈老师给的机会 xff0c 有幸能够参加2020年的DAC比赛 我在其中负责目标检测器的调试和量化 自己第一次接触量化这个任务 xff0c 很多东西都是一点一点学 一 量化基础 对于一个全精度的值 v v v xff0c 若量化步长为
  • python3安装tensorflow遇到的问题

    1 使用命令 xff1a sudo pip3 install upgrade https storage googleapis com tensorflow linux cpu tensorflow 1 1 0rc2 cp35 cp35m
  • argparse模块使用说明

    深度学习的工程中 xff0c py文件中的main函数一开始总会有大量的参数传入 xff0c 而通常使用的方法就是使用argparse通过命令行传入 xff0c 这篇博文旨在记录argparse的常用方法 一 语句简介 1 载入argpar
  • Tensorboard在网络训练中的Logger使用方法

    做为神经网络训练中最常用的可视化工具 xff0c Tensorboard经常在Pytorch和Tensorflow框架中做为可视化工具 但是其使用的确是有点繁琐 xff0c 所以开设了一个这样的专题 xff0c 用于总结见过的工程里面的数据
  • Pytorch训练流程

    调试了很久YOLO的标准Pytorch实现 xff0c 将Train代码进行了重新整理 xff0c 抽出了标准的Pytorch训练框架 现在整理下来 xff0c 以备后用 整理后的代码分为三个大部分 xff0c 每个大部分分为三个小部分 x
  • 初识Vulkan渲染管线

    目前参考 Vulkan规范 和 Vulkan开发实战详解 对渲染管线有了一个初步的认识 现结合中英文的渲染管线图进行笔记整理 中英文的渲染管线图分别如下所示 xff1a 绘制命令送入设备队列执行后 xff0c Vulkan将原始的物体顶点坐
  • Vulkan着色器的GLSL创建、编译、加载、创建流程

    Vulkan没有指定官方的着色器编程语言 xff0c 而是采用SPIR V二进制中间格式进行表示 开发人员一般需要基于某种着色器编程语言开发着色器 xff0c 之后再编译为SPIR V格式 可以选用GLSL着色器编程语言进行开发 大型游戏场
  • 神经网络运算量&参数量估计——FLOPS和FLOPs辨析

    一 概念明晰 首先要明确 运算量 和 参数量 两个概念 xff1a 参数量 xff1a 这个比较好理解 xff0c 例如卷积层中的卷积核c i k k n o xff0c 其参数量就是相乘的结果 而且 xff0c 无论输入图像的尺寸怎么变
  • 机器学习基础——彻底搞懂Precision\Recall\F1\P-R\ROC

    一直以为自己理解这些概念 xff0c 但是其实只是听说过而已 这些概念的释义来自于周志华教授的 机器学习 xff0c 都属于对机器学习算法的性能度量 一 错误率与精度 还是使用书上的定义写的明确 xff0c test set中所有样本预测对
  • [交叉熵损失函数的由来:KL散度] & [softmax+交叉熵损失函数求梯度 推导]

  • SSH基础操作

    这里写自定义目录标题 SSH基础操作SSH免密登录客户端 快捷登录服务器端 sshd配置配置完成后重启服务器端sshd服务 SSH基础操作 span class token function ssh span span class toke
  • Linux下screen的使用

    关掉xshell之后网站也随着关闭 xff0c 我们可以使用screen命令 xff0c 来让保证退出ssh之后程序继续在后台跑 利用SSH远程连接服务器 xff0c 运行程序需要保证在此期间窗口不能关闭并且连接不能断开 xff0c 否则当
  • SAI 串行音频接口学习

    SAI 简介 串行音频接口 xff08 SAI xff09 xff0c SAI具有灵活性高 配置多样的特点 SAI 通过两个完全独立的音频子模块来实现这种灵活性与可配置型 xff0c 每个音频子模块与多达4个引脚 xff08 SD SCK
  • Tensorflow笔记1:Graph

    参考内容都出自于官方API教程tf Graph 一 Graph类调用 这里使用的是1 15版本 xff0c TF官方为了能够在2 0 43 版本中保持兼容 xff0c 因此调用时使用了tf compat v1 Graph 若安装的就是1 1