理解 tf.Variable、tf.get_variable以及范围命名方法tf.variable_scope、tf.name_scope
tensorflow提供了通过变量名称来创建或者获取一个变量的机制。通过这个机制,在不同的函数中可以直接通过变量的名字来使用变量,而不需要将变量通过参数的形式到处传递。
1. tf.Variable(创建变量)与tf.get_variable(创建变量 或 复用变量)
TensorFlow中通过变量名获取变量的机制主要是通过tf.get_variable和tf.variable_scope实现的。
变量可以通过tf.Varivale来创建。当tf.get_variable用于变量创建时,和tf.Variable的功能基本等价。
#以下两个定义是等价的
v = tf.get_variable(name='v', shape=[1], initializer=tf.constant_initializer(1.0))
v = tf.Variable(tf.constant(name='v',shape=[1],value=1.0))
tf.get_varialbe和tf.Variable最大的区别在于:
tf.Variable的变量名是一个可选项,通过name=’v’的形式给出。但是tf.get_variable必须指定变量名。
import tensorflow as tf
with tf.name_scope("a_name_scope"):
initializer = tf.constant_initializer(value=1)
var11 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32, initializer=initializer)
var21 = tf.Variable(name='var21', initial_value=[2], dtype=tf.float32)
var22 = tf.Variable(name='var2', initial_value=[2.1], dtype=tf.float32)
var23 = tf.Variable(name='var2', initial_value=[2.2], dtype=tf.float32)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(var11.name) # var1:0
print(sess.run(var11)) # [ 1.]
print(var21.name) # a_name_scope/var21:0
print(sess.run(var21)) # [ 2.]
print(var22.name) # a_name_scope/var2_1:0
print(sess.run(var22)) # [ 2.1]
print(var23.name) # a_name_scope/var2_2:0
print(sess.run(var23)) # [ 2.2]
使用tf.Variable()定义的时候,虽然name都一样(name = 'var2'),但是为了不重复变量名,Tensorflow输出的变量名并不是一样的,如var22.name与var23.name的打印
# a_name_scope/var2_1:0 与 # a_name_scope/var2_2:0 自动添加了_1与_2
本质上var21,var22,var23并不是一样的变量。
而另一方面,使用tf.get_variable()定义的变量不受tf.name_scope()当中的名字所影响。
如果想要达到重复利用变量的效果,就要使用tf.variable_scope(),并搭配tf.get_variable()这种方式产生和提取变量。
不像tf.Variable()每次都会产生新的变量,tf.get_variable()如果遇到了同样名字的变量时,它会单纯的提取这个同样名字的变量(避免产生新变量)。
而在重复使用的时候,一定要在代码中强调scope.reuse_variables(),否则系统将会报错,以为你只是单纯的不小心重复使用到了一个变量。
with tf.variable_scope("a_variable_scope") as scope:
initializer = tf.constant_initializer(value=3)
var3 = tf.get_variable(name='var3', shape=[1], dtype=tf.float32, initializer=initializer) #创建变量
scope.reuse_variables() #申明重复使用,一定要有
var3_reuse = tf.get_variable(name='var3',) #提取变量复用
var4 = tf.Variable(name='var4', initial_value=[4], dtype=tf.float32)
var4_reuse = tf.Variable(name='var4', initial_value=[4], dtype=tf.float32)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(var3.name) # a_variable_scope/var3:0
print(sess.run(var3)) # [ 3.]
print(var3_reuse.name) # a_variable_scope/var3:0
print(sess.run(var3_reuse)) # [ 3.]
print(var4.name) # a_variable_scope/var4:0
print(sess.run(var4)) # [ 4.]
print(var4_reuse.name) # a_variable_scope/var4_1:0
print(sess.run(var4_reuse)) # [ 4.]
2. tf.get_variable与tf.variable_scope
TensorFlow中通过变量名获取变量的机制主要是通过tf.get_variable和tf.variable_scope实现的
当reuse为True时,tf.variable_scope只能获取已经创建过的变量。
#reuse=False时会报错的情况:
with tf.variable_scope('foo'):
v = tf.get_variable('v',[1],initializer=tf.constant_initializer(1.0)) with tf.variable_scope('foo'):
v1 = tf.get_variable('v',[1])
#在这种情况下会报错:Variable foo/v already exists, disallowed.Did you mean to set reuse=True in Varscope? 其原因就是在命名空间foo中创建了相同的变量。 #如果我要在foo下创建一个变量v1,其name=‘v’,只需要将reuse设置为Ture就ok了。将上面第二部分代码修改为: with tf.variable_scope('foo', reuse=True):
v1 = tf.get_variable('v',[1])
print(v1.name) #结果为foo/v
简而言之,reuse=False时,tf.variable_scope创建变量;reuse=True时,tf.variable_scope获取变量。
3. tf.variable_scope与tf.name_scope
除了tf.variable_scope,tf.name_scope函数也提供了命名空间管理的功能。
这两个函数在大部分情况下是等价的
唯一的区别是在使用tf.get_variable函数时:tf.get_variable函数不受tf.name_scope的影响
从代码看下这句话的具体意思。
首先是tf.variable_scope:
with tf.variable_scope('foo'):
a = tf.get_variable('bar',[1])
print(a.name)#结果为foo/bar:0
再看tf.name_scope:
with tf.name_scope('a'):
a=tf.Variable([1])
print(a.name)#结果为a/Variable:0
b=tf.get_variable('b',[1])
print(b.name)#结果为b:0 不受tf.name_scope的影响
从这个结果中,我们能很清晰地看到,tf.get_variable创建的变量并不是a/b:0,而是b:0。这就表示了在tf.name_scope函数下,tf.get_variable不受其约束。
理解 tf.Variable、tf.get_variable以及范围命名方法tf.variable_scope、tf.name_scope的更多相关文章
- tensorflow共享变量 the difference between tf.Variable() and get_variable()
一般这样用tf.get_variable(): v = tf.get_variable(name, shape, dtype, initializer) 下面内容来源于 http://blog.csd ...
- tf.variable和tf.get_Variable以及tf.name_scope和tf.variable_scope的区别
在训练深度网络时,为了减少需要训练参数的个数(比如具有simase结构的LSTM模型).或是多机多卡并行化训练大数据大模型(比如数据并行化)等情况时,往往需要共享变量.另外一方面是当一个深度学习模型变 ...
- tf.Variable() 与tf.get_variable()的区别
每次调用 tf.Variable() 都会产生一个新的变量,变量名称是一个可选参数,运行命名相同,如果命名冲突会根据命名先后对名字进行处理, tf.get_variable()的变量名称是必填参数,t ...
- 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.get_variable() 和 tf.Variable()
tf.Variable(<initial - value>,name=<optional - name>) 此函数用于定义图变量.生成一个初始值为initial - value ...
- tf.Variable()、tf.get_variable()和tf.placeholder()
1.tf.Variable() tf.Variable(initializer,name) 功能:tf.Variable()创建变量时,name属性值允许重复,检查到相同名字的变量时,由自动别名机制创 ...
- TensorFlow 辨异 —— tf.placeholder 与 tf.Variable
https://blog.csdn.net/lanchunhui/article/details/61712830 https://www.cnblogs.com/silence-tommy/p/70 ...
- tensorflow中使用变量作用域及tf.variable(),tf,getvariable()与tf.variable_scope()的用法
一 .tf.variable() 在模型中每次调用都会重建变量,使其存储相同变量而消耗内存,如: def repeat_value(): weight=tf.variable(tf.random_no ...
随机推荐
- python使用udp实现聊天器
聊天器简易版 使用udp实现一个简单的聊天器程序,要求如下: 在一个电脑中编写1个程序,有2个功能 1.获取键盘数据,并将其发送给对方 2.接收数据并显示 并且功能数据进行选择以上的2个功能调用 例子 ...
- oracle的Date类型遇到MyBatis产生的坑
坑描述: 公司的订单表数据量巨大(亿级),在进行查询的时候,发现一个慢查询. 背景: 数据库:oracle 表:T_order 索引字段:create_date (字段类型 date) 慢查询sql ...
- laravel中请求用例$request可用的一些方法小结
laravel中$request可用的一些方法小结 1,请求方法的获取 $method = $request->method(); 2,检测请求方法 $res = $request->is ...
- 继续封装个 Volley 组件
本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 前面已经封装了很多常用.基础的组件了:base-module, 包括了: crash 处理 常用工具类 apk 升级处理 log 组 ...
- HTML DOM classList 属性
页面DOM里的每个节点上都有一个classList对象,程序员可以使用里面的方法新增.删除.修改节点上的CSS类.使用classList,程序员还可以用它来判断某个节点是否被赋予了某个CSS类. 添加 ...
- Filter防止用户访问一些未被授权的资源
package com.drp.util.filter; import java.io.IOException; import javax.servlet.Filter; import javax.s ...
- 关于select 文字居向
我们都知道select的文字默认居左,而如果你想改变它,用text-align是不起作用的,因为select没有这个样式 但是它有自己的样式属性 文字靠右对齐:direction: rtl; 而如果要 ...
- 解决在TP5中无法使用快递鸟的即时查询API
快递鸟的接口对接其实很简单,先去官网注册账号,登陆把基本信息填好,然后在产品管理中订购一下“物流查询”,免费,不过其他产品是收费,免费的有对接口调用频率限制,结合自己的应用流量够用就可以. 使用前复制 ...
- Android 布局巧用之include、merge、ViewStub
原文链接:https://mp.weixin.qq.com/s/bTA2gztUzqvqER2rz56RRQ 相信大家经常听到include.merge.ViewStub这样的标签,官方也提到这三种布 ...
- Genymotion安卓模拟器和VirtualBox虚拟机安装、配置、测试
Genymotion安卓模拟器和VirtualBox虚拟机安装.配置.测试(win7_64bit) 目录 1.概述 2.本文用到的工具 3.VirtualBox虚拟机安装 4.Genymotion安卓 ...