张量流中变量与 get_Variable 的区别

据我所知,Variable是制作变量的默认操作,而 get_variable主要用于权重共享。

一方面,有些人建议在需要变量时使用 get_variable而不是原始的 Variable操作。另一方面,我只看到在 TensorFlow 的官方文档和演示中使用了 get_variable

因此,我想知道一些关于如何正确使用这两种机制的经验法则。有没有什么“标准”原则?

44251 次浏览

变量是一个类,有几种方法来创建变量,包括 tf.Variable.__init__tf.get_variable

tf.Variable.__init__ : 使用 First _ value 初始值创建一个新变量。

W = tf.Variable(<initial-value>, name=<optional-name>)

tf.get_variable : 获取包含这些参数的现有变量或创建一个新变量。

W = tf.get_variable(name, shape=None, dtype=tf.float32, initializer=None,
regularizer=None, trainable=True, collections=None)

使用像 xavier_initializer这样的初始化器非常有用:

W = tf.get_variable("W", shape=[784, 256],
initializer=tf.contrib.layers.xavier_initializer())

更多信息 给你

我建议始终使用 tf.get_variable(...)——如果您需要在任何时候共享变量,它将使您的代码更容易重构,例如在多 gpu 设置中(参见多 gpu CIFAR 示例)。这没有坏处。

tf.Variable是低级的; 在某些时候 tf.get_variable()不存在,所以一些代码仍然使用低级的方法。

我可以发现两者之间的两个主要区别:

  1. 首先,tf.Variable将始终创建一个新变量,而 tf.get_variable从图中获得一个具有指定参数的 存在变量,如果它不存在,则创建一个新变量。

  2. tf.Variable要求指定初始值。

必须澄清的是,函数 tf.get_variable使用当前变量作用域作为名称的前缀来执行重用检查。例如:

with tf.variable_scope("one"):
a = tf.get_variable("v", [1]) #a.name == "one/v:0"
with tf.variable_scope("one"):
b = tf.get_variable("v", [1]) #ValueError: Variable one/v already exists
with tf.variable_scope("one", reuse = True):
c = tf.get_variable("v", [1]) #c.name == "one/v:0"


with tf.variable_scope("two"):
d = tf.get_variable("v", [1]) #d.name == "two/v:0"
e = tf.Variable(1, name = "v", expected_shape = [1]) #e.name == "two/v_1:0"


assert(a is c)  #Assertion is true, they refer to the same object.
assert(a is d)  #AssertionError: they are different objects
assert(d is e)  #AssertionError: they are different objects

最后一个断言错误很有意思: 在相同作用域下具有相同名称的两个变量应该是相同的变量。但是如果你测试变量 de的名字,你会发现 Tensorflow 改变了变量 e的名字:

d.name   #d.name == "two/v:0"
e.name   #e.name == "two/v_1:0"

另一个区别在于,一个在 ('variable_store',)集合中,而另一个不在。

请参阅资料来源 密码:

def _get_default_variable_store():
store = ops.get_collection(_VARSTORE_KEY)
if store:
return store[0]
store = _VariableStore()
ops.add_to_collection(_VARSTORE_KEY, store)
return store

让我举例说明:

import tensorflow as tf
from tensorflow.python.framework import ops


embedding_1 = tf.Variable(tf.constant(1.0, shape=[30522, 1024]), name="word_embeddings_1", dtype=tf.float32)
embedding_2 = tf.get_variable("word_embeddings_2", shape=[30522, 1024])


graph = tf.get_default_graph()
collections = graph.collections


for c in collections:
stores = ops.get_collection(c)
print('collection %s: ' % str(c))
for k, store in enumerate(stores):
try:
print('\t%d: %s' % (k, str(store._vars)))
except:
print('\t%d: %s' % (k, str(store)))
print('')

输出:

Collection (’_ _ variable _ store’,) : 0: {‘ word _ invddings _ 2’: < tf. 变量‘ word _ inveddings _ 2:0’形状 = (30522,1024) Dtype = float32 _ ref > }