tf.variable和tf.get_Variable以及tf.name_scope和tf.variable_scope的区别
在训练深度网络时,为了减少需要训练参数的个数(比如具有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下面获取或创建一个变量的两种方式,区别在于:
- tf.Variable()会自动检测命名冲突并自行处理,但tf.get_variable()则遇到重名的变量创建且变量名没有设置为共享变量时,则会报错。
- 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的区别相关推荐
- 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() ...
- 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 ...
- TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别
TF:tensorflow框架中常用函数介绍-tf.Variable()和tf.get_variable()用法及其区别 目录 tensorflow框架 tensorflow.Variable()函数 ...
- tf.name_scope()与tf.variable_scope()
TensorFlow的tf.name_scope().tf.variable_scope()是两个作用域函数,一般与两个创建/调用变量的函数tf.variable() 和tf.get_variable ...
- tensorflow tf.Variable 的用法
import tensorflow as tf #导入模块 import numpy as np tf.Variable(3) # 数字输入 <tf.Variable 'Variable:0' ...
- tf.Variable、tf.get_variable、tf.variable_scope以及tf.name_scope
tf.Variable与tf.get_variable tensorflow提供了通过变量名称来创建或者获取一个变量的机制.通过这个机制,在不同的函数中可以直接通过变量的名字来使用变量,而不需要将变量 ...
- 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_ ...
- tf.Variable,tf.get_variable,tf.variable_scope,tf.name_scope区别分析
1.tf.Variable与tf.get_variable ①在创建变量的时候,两者是等价的 ②tf.Variable的变量名是一个可选项,而tf.get_variable必须要有变量名 import ...
- TensorFlow 学习(一)—— tf.get_variable() vs tf.Variable(),tf.name_scope() vs tf.variable_scope()
scope 命名方法 对于一个复杂的 tensorflow 模型会有很多个变量, tf.variable_scope() :提供了简单的命名空间技术以避免冲突: tf.get_variable():从 ...
最新文章
- 关于HTML Object中三个Style实例的区别
- 【pointnet++点云识别】基于pointnet++的点云地理数据识别的MATLAB仿真
- javaBean List Map json(转)
- 6.求级数e = 1 + 1/1! + 1/2! + 1/3! + …… 1/n! 要求: 求n项(n由键盘输入)或最后一项小于10-6结束。
- 程序实现php文件上传,PHP实例:实现文件上传的程序源码_php
- 前端学习(2979):vue-element-admin结构always:true始终显示
- 转:DotNET企业架构应用实践-架构师成长之路-如何成为优秀架构师
- 喜欢初音未来的桌面壁纸看过来
- 形成性考核(计算机应用基础) 答案,2019年最新电大《计算机应用基础(Win7)》形成性考核册及答案.pdf...
- vim的简单使用及配置
- 《恋上数据结构第1季》动态数组实现栈
- 50.9. 触发器(Trigger)
- 零基础转行如何准备一场软件测试面试
- securecrt8.1破解版安装与注册机的使用方法
- 什么是Pagerank?Pagerank算法介绍与计算公式
- 老杨推荐|初级到高级网工学习渠道最全汇总(建议收藏)
- screen linux卸载,Ubuntu常用软件安装(附截图软件、FTP、卸载命令)
- Oracle WITH AS 用法
- Uva 437 巴比伦塔 UVA10003
- macbook更新windows11