TensorFlow中Variable和get_variable之间的区别

Lif*_*ang 116 python tensorflow

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

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

因此,我想知道如何正确使用这两种机制的一些经验法则.有没有"标准"原则?

小智 87

我建议总是使用tf.get_variable(...)- 如果你需要在任何时候共享变量,它会更容易重构你的代码,例如在multi-gpu设置中(参见multi-gpu CIFAR示例).它没有任何缺点.

纯粹tf.Variable是较低级别; 在某些时候tf.get_variable()不存在,所以一些代码仍然使用低级方式.

  • 非常感谢你的回答.但是我仍然有一个关于如何用`tf.get_variable`替换`tf.Variable`的问题.那是当我想用一个numpy数组初始化一个变量时,我找不到像`tf.Variable`那样干净有效的方法.你是如何解决的?谢谢. (5认同)

Sun*_*Kim 67

tf.Variable是一个类,有几种方法可以创建tf.Variable,包括tf.Variable .__ init__和tf.get_variable.

tf.Variable .__ init__:使用initial_value创建一个新变量.

W = tf.Variable(<initial-value>, name=<optional-name>)
Run Code Online (Sandbox Code Playgroud)

tf.get_variable:使用这些参数获取现有变量或创建一个新变量.您也可以使用初始化程序.

W = tf.get_variable(name, shape=None, dtype=tf.float32, initializer=None,
       regularizer=None, trainable=True, collections=None)
Run Code Online (Sandbox Code Playgroud)

使用xavier_initializer等初始化程序非常有用:

W = tf.get_variable("W", shape=[784, 256],
       initializer=tf.contrib.layers.xavier_initializer())
Run Code Online (Sandbox Code Playgroud)

有关更多信息,访问https://www.tensorflow.org/versions/r0.8/api_docs/python/state_ops.html#Variable.


Jad*_*mas 45

我可以找到一个与另一个之间的两个主要区别:

  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
Run Code Online (Sandbox Code Playgroud)

最后一个断言错误很有趣:在同一范围内具有相同名称的两个变量应该是相同的变量.但是,如果你测试变量的名字de你会发现,Tensorflow改变变量的名称e:

d.name   #d.name == "two/v:0"
e.name   #e.name == "two/v_1:0"
Run Code Online (Sandbox Code Playgroud)