在训练深度网络时,为了减少需要训练参数的个数(比如具有simase结构的LSTM模型)、或是多机多卡并行化训练大数据大模型(比如数据并行化)等情况时,往往需要共享变量。另外一方面是当一个深度学习模型变得非常复杂的时候,往往存在大量的变量和操作,如何避免这些变量名和操作名的唯一不重复,同时维护一个条理清晰的graph非常重要。
==因此,tensorflow中用tf.Variable(),tf.get_variable(),tf.Variable_scope(),tf.name_scope()几个函数来实现:==


一、tf.Variable(),tf.get_variable()的作用与区别:

tf.Variable()和tf.get_variable()都是用于在一个name_scope下面获取或创建一个变量的两种方式,区别在于:

  1. tf.Variable()会自动检测命名冲突并自行处理,但tf.get_variable()则遇到重名的变量创建且变量名没有设置为共享变量时,则会报错。
  2. tf.Variable()用于创建一个新变量,在同一个name_scope下面,可以创建相同名字的变量,底层实现会自动引入别名机制,两次调用产生了其实是两个不同的变量。
    tf.get_variable()用于获取一个变量,并且不受name_scope的约束。当这个变量已经存在时,则自动获取;如果不存在,则自动创建一个变量。
二、tf.name_scope()与tf.variable_scope()的作用与区别:

tf.name_scope():主要用于管理一个图里面的各种op,返回的是一个以scope_name命名的context manager。一个graph会维护一个name_space的
堆,每一个namespace下面可以定义各种op或者子namespace,实现一种层次化有条理的管理,避免各个op之间命名冲突。

tf.variable_scope():一般与tf.name_scope()配合使用,用于管理一个graph中变量的名字,避免变量之间的命名冲突,tf.variable_scope()允许在一个variable_scope下面共享变量。

代码示例:

在 tf.name_scope下时,tf.get_variable()创建的变量名不受 name_scope 的影响,而且在未指定共享变量时,如果重名会报错,tf.Variable()会自动检测有没有变量重名,如果有则会自行处理。

import tensorflow as tfwith tf.name_scope('name_scope_x'):var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)var3 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)var4 = tf.Variable(name='var2', initial_value=[2], dtype=tf.float32)with tf.Session() as sess:sess.run(tf.global_variables_initializer())print(var1.name, sess.run(var1))print(var3.name, sess.run(var3))print(var4.name, sess.run(var4))
# 输出结果:
# var1:0 [-0.30036557]   可以看到前面不含有指定的'name_scope_x'
# name_scope_x/var2:0 [ 2.]
# name_scope_x/var2_1:0 [ 2.]  可以看到变量名自行变成了'var2_1',避免了和'var2'冲突

如果使用tf.get_variable()创建变量,且没有设置共享变量,重名时会报错

import tensorflow as tfwith tf.name_scope('name_scope_1'):var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)var2 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
with tf.Session() as sess:sess.run(tf.global_variables_initializer())print(var1.name, sess.run(var1))print(var2.name, sess.run(var2))# ValueError: Variable var1 already exists, disallowed. Did you mean
# to set reuse=True in VarScope? Originally defined at:
# var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)

所以要共享变量,需要使用tf.variable_scope()

import tensorflow as tfwith tf.variable_scope('variable_scope_y') as scope:var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)scope.reuse_variables()  # 设置共享变量var1_reuse = tf.get_variable(name='var1')var2 = tf.Variable(initial_value=[2.], name='var2', dtype=tf.float32)var2_reuse = tf.Variable(initial_value=[2.], name='var2', dtype=tf.float32)with tf.Session() as sess:sess.run(tf.global_variables_initializer())print(var1.name, sess.run(var1))print(var1_reuse.name, sess.run(var1_reuse))print(var2.name, sess.run(var2))print(var2_reuse.name, sess.run(var2_reuse))
# 输出结果:
# variable_scope_y/var1:0 [-1.59682846]
# variable_scope_y/var1:0 [-1.59682846]   可以看到变量var1_reuse重复使用了var1
# variable_scope_y/var2:0 [ 2.]
# variable_scope_y/var2_1:0 [ 2.]

转载于:https://www.cnblogs.com/guoyaohua/p/8081192.html

tf.variable和tf.get_Variable以及tf.name_scope和tf.variable_scope的区别相关推荐

  1. tensorflow 变量及命名空间 tf.Variable() vs tf.get_variable() tf.name_scope() vs tf.variable_scope()

    tf.Variable() vs tf.get_variable() tf.name_scope() vs tf.variable_scope() 1. 基础功能 1.1 tf.Variable() ...

  2. tensorflow变量共享——VariableScope的reuse模式、tf.get_variable()、tf.Variable() 探索

    文章目录 一.VariableScope的reuse模式的设置 1.1节 1.2节 1.3节 1.4节 1.5节 二.reuse模式对tf.Variable() 的影响 三.reuse模式对tf.ge ...

  3. TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别

    TF:tensorflow框架中常用函数介绍-tf.Variable()和tf.get_variable()用法及其区别 目录 tensorflow框架 tensorflow.Variable()函数 ...

  4. tf.name_scope()与tf.variable_scope()

    TensorFlow的tf.name_scope().tf.variable_scope()是两个作用域函数,一般与两个创建/调用变量的函数tf.variable() 和tf.get_variable ...

  5. tensorflow tf.Variable 的用法

    import tensorflow as tf #导入模块 import numpy as np tf.Variable(3) # 数字输入 <tf.Variable 'Variable:0' ...

  6. tf.Variable、tf.get_variable、tf.variable_scope以及tf.name_scope

    tf.Variable与tf.get_variable tensorflow提供了通过变量名称来创建或者获取一个变量的机制.通过这个机制,在不同的函数中可以直接通过变量的名字来使用变量,而不需要将变量 ...

  7. tf.Variable、tf.get_variable、tf.variable_scope、tf.name_scope、random、initializer

    转自:tensorflow学习笔记(二十三):variable与get_variable TF.VARIABLE.TF.GET_VARIABLE.TF.VARIABLE_SCOPE以及TF.NAME_ ...

  8. tf.Variable,tf.get_variable,tf.variable_scope,tf.name_scope区别分析

    1.tf.Variable与tf.get_variable ①在创建变量的时候,两者是等价的 ②tf.Variable的变量名是一个可选项,而tf.get_variable必须要有变量名 import ...

  9. TensorFlow 学习(一)—— tf.get_variable() vs tf.Variable(),tf.name_scope() vs tf.variable_scope()

    scope 命名方法 对于一个复杂的 tensorflow 模型会有很多个变量, tf.variable_scope() :提供了简单的命名空间技术以避免冲突: tf.get_variable():从 ...

最新文章

  1. 关于HTML Object中三个Style实例的区别
  2. 【pointnet++点云识别】基于pointnet++的点云地理数据识别的MATLAB仿真
  3. javaBean List Map json(转)
  4. 6.求级数e = 1 + 1/1! + 1/2! + 1/3! + …… 1/n! 要求: 求n项(n由键盘输入)或最后一项小于10-6结束。
  5. 程序实现php文件上传,PHP实例:实现文件上传的程序源码_php
  6. 前端学习(2979):vue-element-admin结构always:true始终显示
  7. 转:DotNET企业架构应用实践-架构师成长之路-如何成为优秀架构师
  8. 喜欢初音未来的桌面壁纸看过来
  9. 形成性考核(计算机应用基础) 答案,2019年最新电大《计算机应用基础(Win7)》形成性考核册及答案.pdf...
  10. vim的简单使用及配置
  11. 《恋上数据结构第1季》动态数组实现栈
  12. 50.9. 触发器(Trigger)
  13. 零基础转行如何准备一场软件测试面试
  14. securecrt8.1破解版安装与注册机的使用方法
  15. 什么是Pagerank?Pagerank算法介绍与计算公式
  16. 老杨推荐|初级到高级网工学习渠道最全汇总(建议收藏)
  17. screen linux卸载,Ubuntu常用软件安装(附截图软件、FTP、卸载命令)
  18. Oracle WITH AS 用法
  19. Uva 437 巴比伦塔  UVA10003
  20. macbook更新windows11

热门文章

  1. 循序渐进Python3(十一) --6--  Ajax 实现跨域请求 jsonp 和 cors
  2. 基于群集的Hyper-v Server副本
  3. tomcat 中部署java web项目
  4. 只有 DBA 才能导入由其他 DBA 导出的文件
  5. IPSec 之 Server2003Cisco路由器(1)
  6. 跟着 Event loop 规范理解浏览器中的异步机制
  7. BinaryTree-学习二叉树的Python库
  8. Linux 下hosts文件
  9. ADMT3.2迁移域用户
  10. php float浮点型 用round方法比较