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

本质上var21var22var23并不是一样的变量。

而另一方面,使用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的更多相关文章

  1. tensorflow共享变量 the difference between tf.Variable() and get_variable()

    一般这样用tf.get_variable(): v = tf.get_variable(name, shape, dtype, initializer) 下面内容来源于 http://blog.csd ...

  2. tf.variable和tf.get_Variable以及tf.name_scope和tf.variable_scope的区别

    在训练深度网络时,为了减少需要训练参数的个数(比如具有simase结构的LSTM模型).或是多机多卡并行化训练大数据大模型(比如数据并行化)等情况时,往往需要共享变量.另外一方面是当一个深度学习模型变 ...

  3. tf.Variable() 与tf.get_variable()的区别

    每次调用 tf.Variable() 都会产生一个新的变量,变量名称是一个可选参数,运行命名相同,如果命名冲突会根据命名先后对名字进行处理, tf.get_variable()的变量名称是必填参数,t ...

  4. TF.VARIABLE、TF.GET_VARIABLE、TF.VARIABLE_SCOPE以及TF.NAME_SCOPE关系

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

  5. 彻底弄懂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提 ...

  6. TensorFlow函数(二)tf.get_variable() 和 tf.Variable()

    tf.Variable(<initial - value>,name=<optional - name>) 此函数用于定义图变量.生成一个初始值为initial - value ...

  7. tf.Variable()、tf.get_variable()和tf.placeholder()

    1.tf.Variable() tf.Variable(initializer,name) 功能:tf.Variable()创建变量时,name属性值允许重复,检查到相同名字的变量时,由自动别名机制创 ...

  8. TensorFlow 辨异 —— tf.placeholder 与 tf.Variable

    https://blog.csdn.net/lanchunhui/article/details/61712830 https://www.cnblogs.com/silence-tommy/p/70 ...

  9. tensorflow中使用变量作用域及tf.variable(),tf,getvariable()与tf.variable_scope()的用法

    一 .tf.variable() 在模型中每次调用都会重建变量,使其存储相同变量而消耗内存,如: def repeat_value(): weight=tf.variable(tf.random_no ...

随机推荐

  1. java体系架构

    java概念 java本身是一种面向对象的语言,最显著的特性有两方面,一是所谓的“书写一次,到处运行”(write once ,run anywhrer),能够非常容易的获得跨平台能力,另外就是垃圾收 ...

  2. 你还在等着用户反馈BUG?

    译者按: 等待用户反馈BUG,一切都晚了!实时监控线上应用才是王道. 原文: Why relying on your users to report errors is the dumbest thi ...

  3. idea输入法不跟随解决办法

    最近使用idea开发项目,遇到输入法不跟随的问题,自己动手解决了下 idea输入法不跟随解决办法: 1):系统:windows10 版本:idea2017.2 解决办法:使用QQ输入法 2):系统:w ...

  4. If you did this already, delete the swap file ".git/.MERGE_MSG.swp"

    出现这种情况一般是不正常退出造成的,找到隐藏文件后删除解决

  5. js 从一个对象中找到属性值相等的集合

    getobjs: function(objs, key, value) { var result = []; for (var i in objs) { var obj = $(objs[i]); i ...

  6. Django的URL路由系统

    一. URL配置 URL配置就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图之间的映射表.你就是以这种方式告诉Django,对于哪个URL调用的这段代码. 基本格式 from ...

  7. Dynamics AX 2012 性能优化之 SQL Server 复制

    Dynamics AX 2012 性能优化之 SQL Server 复制 分析数据滞后 在博文 Dynamics AX 2012 在BI分析中建立数据仓库的必要性 里,Reinhard 阐述了在 AX ...

  8. 索引堆(Index Heap)

    首先我们先来看一个由普通数组构建的普通堆. 然后我们通过前面的方法对它进行堆化(heapify),将其构建为最大堆. 结果是这样的: 对于我们所关心的这个数组而言,数组中的元素位置发生了改变.正是因为 ...

  9. android Camera相机类

    Camera相机类相关的几个流程方法 Camera.open(cameraId) 打开相机 camera.setDisplayOrientation(0) 设置相机水平方向 mCamera.setPr ...

  10. 【转】c# [Serializable]的作用

    http://blog.csdn.net/chinarenkai/article/details/3220452 如果你做远程方法调用(RPC)时,比如,服务器端有个类A及对象a,客户端需要无视网络的 ...