tensorflow的variable、variable_scope和get_variable的用法和区别
在tensorflow中,可以使用tf.Variable来创建一个变量,也可以使用tf.get_variable来创建一个变量,但是在一个模型需要使用其他模型的变量时,tf.get_variable就派上大用场了。
先分别介绍两个函数的用法:
import tensorflow as tf
var1 = tf.Variable(1.0,name='firstvar')
print('var1:',var1.name)
var1 = tf.Variable(2.0,name='firstvar')
print('var1:',var1.name)
var2 = tf.Variable(3.0)
print('var2:',var2.name)
var2 = tf.Variable(4.0)
print('var2:',var2.name)
get_var1 = tf.get_variable(name='firstvar',shape=[1],dtype=tf.float32,initializer=tf.constant_initializer(0.3))
print('get_var1:',get_var1.name)
get_var1 = tf.get_variable(name='firstvar1',shape=[1],dtype=tf.float32,initializer=tf.constant_initializer(0.4))
print('get_var1:',get_var1.name) with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print('var1=',var1.eval())
print('var2=',var2.eval())
print('get_var1=',get_var1.eval())
结果如下:

我们来分析一下代码,tf.Varibale是以定义的变量名称为唯一标识的,如var1,var2,所以可以重复地创建name='firstvar'的变量,但是tensorflow会给它们按顺序取后缀,如firstvar_1:0,firstval_2:0,...,如果没有制定名字,系统会自动加上一个名字Variable:0。而且由于tf.Varibale是以定义的变量名称为唯一标识的,所以当第二次命名同一个变量名时,第一个变量就会被覆盖,所以var1由1.0变成2.0。
对于tf.get_variable,它是以指定的name属性为唯一标识,而不是定义的变量名称,所以不能同时定义两个变量name是相同的,例如下面这种就会报错:
1 get_var1 = tf.get_variable(name='a',shape=[1],dtype=tf.float32,initializer=tf.constant_initializer(0.3))
2 print('get_var1:',get_var1.name)
3 get_var2 = tf.get_variable(name='a',shape=[1],dtype=tf.float32,initializer=tf.constant_initializer(0.4))
4 print('get_var1:',get_var1.name)
这样就会报错了。如果我们想声明两次相同name的变量,这时variable_scope就派上用场了,可以使用variable_scope将它们分开:
import tensorflow as tf
with tf.variable_scope('test1'):
get_var1 = tf.get_variable(name='firstvar',shape=[2],dtype=tf.float32)
with tf.variable_scope('test2'):
get_var2 = tf.get_variable(name='firstvar',shape=[2],dtype=tf.float32)
print('get_var1:',get_var1.name)
print('get_var2:',get_var2.name)
这样就不会报错了,variable_scope相当于声明了作用域,这样在不同的作用域存在相同的变量就不会冲突了,结果如下:

当然,scope还支持嵌套:
import tensorflow as tf
with tf.variable_scope('test1',):
get_var1 = tf.get_variable(name='firstvar',shape=[2],dtype=tf.float32)
with tf.variable_scope('test2',):
get_var2 = tf.get_variable(name='firstvar',shape=[2],dtype=tf.float32)
print('get_var1:',get_var1.name)
print('get_var2:',get_var2.name)
输出结果为:

怎么样?可以对照上面的结果体会一下不同。那么如何通过get_variable来实现变量共享呢?这就要用到variable_scope里的一个属性:reuse,顾名思义嘛,当把reuse设置成True时就可以了,它表示使用已经定义过的变量,这是get_variable就不会再创建新的变量,而是去找与name相同的变量:
import tensorflow as tf
with tf.variable_scope('test1',):
get_var1 = tf.get_variable(name='firstvar',shape=[2],dtype=tf.float32)
with tf.variable_scope('test2',):
get_var2 = tf.get_variable(name='firstvar',shape=[2],dtype=tf.float32)
print('get_var1:',get_var1.name)
print('get_var2:',get_var2.name)
with tf.variable_scope('test1',reuse=True):
get_var3 = tf.get_variable(name='firstvar',shape=[2],dtype=tf.float32)
with tf.variable_scope('test2',):
get_var4 = tf.get_variable(name='firstvar',shape=[2],dtype=tf.float32)
print('get_var3:',get_var3.name)
print('get_var4:',get_var4.name)
输出结果如下:

当然前面说过,reuse=True是使用前面已经创建过的变量,如果仅仅只有从第八行到最后的代码,也会报错的,如果还是想这么做,就需要把reuse属性设置成tf.AUTO_REUSE
import tensorflow as tf
with tf.variable_scope('test1',reuse=tf.AUTO_REUSE):
get_var3 = tf.get_variable(name='firstvar',shape=[2],dtype=tf.float32)
with tf.variable_scope('test2',):
get_var4 = tf.get_variable(name='firstvar',shape=[2],dtype=tf.float32)
print('get_var3:',get_var3.name)
print('get_var4:',get_var4.name)
此时就不会报错,tf.AUTO_REUSE可以实现第一次调用variable_scope时,传入的reuse值为False,再次调用时,传入reuse的值就会自动变为True。
tensorflow的variable、variable_scope和get_variable的用法和区别的更多相关文章
- tf.Variable()、tf.get_variable()和tf.placeholder()
1.tf.Variable() tf.Variable(initializer,name) 功能:tf.Variable()创建变量时,name属性值允许重复,检查到相同名字的变量时,由自动别名机制创 ...
- tf.variable和tf.get_Variable以及tf.name_scope和tf.variable_scope的区别
在训练深度网络时,为了减少需要训练参数的个数(比如具有simase结构的LSTM模型).或是多机多卡并行化训练大数据大模型(比如数据并行化)等情况时,往往需要共享变量.另外一方面是当一个深度学习模型变 ...
- TF.VARIABLE、TF.GET_VARIABLE、TF.VARIABLE_SCOPE以及TF.NAME_SCOPE关系
1. tf.Variable与tf.get_variable tensorflow提供了通过变量名称来创建或者获取一个变量的机制.通过这个机制,在不同的函数中可以直接通过变量的名字来使用变量,而不需要 ...
- 彻底弄懂tf.Variable、tf.get_variable、tf.variable_scope以及tf.name_scope异同
https://blog.csdn.net/qq_22522663/article/details/78729029 1. tf.Variable与tf.get_variabletensorflow提 ...
- Tensorflow函数——tf.variable_scope()
Tensorflow函数——tf.variable_scope()详解 https://blog.csdn.net/yuan0061/article/details/80576703 2018年06月 ...
- 理解 tf.Variable、tf.get_variable以及范围命名方法tf.variable_scope、tf.name_scope
tensorflow提供了通过变量名称来创建或者获取一个变量的机制.通过这个机制,在不同的函数中可以直接通过变量的名字来使用变量,而不需要将变量通过参数的形式到处传递. 1. tf.Variable( ...
- Tensorflow 之 name/variable_scope 变量管理
name/variable_scope 的作用 充分理解 name / variable_scope TensorFlow 入门笔记 当一个神经网络比较复杂.参数比较多时,就比较需要一个比较好的方式来 ...
- tensorflow冻结变量方法(tensorflow freeze variable)
最近由于项目需要,要对tensorflow构造的模型中部分变量冻结,然后继续训练,因此研究了一下tf中冻结变量的方法,目前找到三种,各有优缺点,记录如下: 1.名词解释 冻结变量,指的是在训练模型时, ...
- Tensorflow get_variable和Varialbe的区别
import tensorflow as tf """ tf.get_variable()和Variable有很多不同点 * 它们对重名操作的处理不同 * 它们受name ...
- tf.Variable() 与tf.get_variable()的区别
每次调用 tf.Variable() 都会产生一个新的变量,变量名称是一个可选参数,运行命名相同,如果命名冲突会根据命名先后对名字进行处理, tf.get_variable()的变量名称是必填参数,t ...
随机推荐
- 摆脱鼠标系列 - vscode 单词自动翻译 快捷键 Alt + Z
为什么 摆脱鼠标系列 - vscode 单词自动翻译 快捷键 Alt + Z 单词函数 省得每次都查字典了 插件名称 translate speaker 翻译朗读者API 截图
- Linux 服务器Python后台运行服务(ssh断开不退出)
壹: 最近用python搭建一个物联网数据存储的微服务,部署到ubuntu上去,所以,python后台运行是一个必不可少的环节. 贰: 这个只需要是一个命令即可: 命令1(记录所有日志): nohup ...
- 【开源库推荐】#5 Android高亮引导库
原文:[开源库推荐]#5 Android高亮引导库 - Stars-One的杂货小窝 本文介绍2个高亮引导库HighLightPro和Curtain hyy920109/HighLightPro: A ...
- 关于Jitpack发布aar,会丢失内置依赖库问题
原文:关于Jitpack发布aar,会丢失内置依赖库问题 | Stars-One的杂货小窝 关于发布aar出现的一个大坑排查,折腾了两天,终于是找到了解决方案 问题描述 有这样的一个情况,我新建了个A ...
- 一个简易的ORM框架的实现(二)
框架目标 什么是框架,框架能做到什么? 把一个方向的技术研发做封装,具备通用性,让使用框架的开发者用起来很轻松. 属性: 通用性 健壮性 稳定性 扩展性 高性能 组件化 跨平台 从零开始-搭建框架 建 ...
- day11-2-内置Tomcat的配置和切换
SpringBoot内置Tomcat的配置和切换 1.基本介绍 SpringBoot支持的webServer:Tomcat,Jetty,Undertow 因为在spring-boot-starter- ...
- 逆向通达信Level-2 续六 (调试pad控件)
调试终端面版单元, 以及宿主窗口 调试大数据面版单元, 以及宿主窗口 逆向通达信Level-2 续十一 (无帐号登陆itrend研究版) 逆向通达信Level-2 续十 (trace脱壳) 逆向通达信 ...
- C++自定义比较函数的bug
auto cmp = [] (int x, int y) {return true;}; priority_queue<int, vector<int> , cmp> q; 报 ...
- NJUPT第二次积分赛小结与视觉部分开源
NJUPT第二次积分赛小结与视觉部分开源 跟队友连肝一周多积分赛,写了一堆屎山,总算是今天完赛了.结果也还行,80分到手.其实题目是全做完了的,但验收时我nt了没操作好导致丢了不少分,而且整个控制流程 ...
- Linux快速入门(五)Linux系统管理
top top命令相当于任务管理器.在top命令中,可以使用M,将进程列表按内存使用排序,使用P将进程列表按照CPU的使用情况排序,输入q退出. (1)第一行是任务队列信息,显示系统时间.运行时间.当 ...