据我所知,Variable
是制作变量的默认操作,而get_variable
主要用于权重共享。TensorFlow中变量和get_variable之间的区别
一方面,有人建议在需要变量时使用get_variable
而不是原始的Variable
操作。另一方面,我在TensorFlow的官方文档和演示中只看到get_variable
的任何使用。
因此,我想知道一些关于如何正确使用这两种机制的规则。有没有“标准”原则?
据我所知,Variable
是制作变量的默认操作,而get_variable
主要用于权重共享。TensorFlow中变量和get_variable之间的区别
一方面,有人建议在需要变量时使用get_variable
而不是原始的Variable
操作。另一方面,我在TensorFlow的官方文档和演示中只看到get_variable
的任何使用。
因此,我想知道一些关于如何正确使用这两种机制的规则。有没有“标准”原则?
我建议始终使用tf.get_variable(...)
- 如果您需要在任何时间共享变量,它将使重构代码变得更容易。在多GPU设置中(请参阅多GPU CIFAR示例)。它没有缺点。
纯tf.Variable
是较低级的;在某个点tf.get_variable()
不存在,所以一些代码仍然使用低级方式。
非常感谢您的回答。但是我仍然有一个关于如何用'tf.get_variable'替换'tf.Variable'的问题。那就是当我想用一个numpy数组初始化一个变量时,我无法找到一个干净而有效的方式来处理它,就像我使用'tf.Variable'一样。你如何解决它?谢谢。 –
tf.Variable是一个类,有几种创建tf.Variable的方法,包括tf.Variable .__ init__和tf.get_variable。
tf.Variable .__ init__:用初始值创建一个新变量。
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:在https://www.tensorflow.org/versions/r0.8/api_docs/python/state_ops.html#Variable
W = tf.get_variable("W", shape=[784, 256],
initializer=tf.contrib.layers.xavier_initializer())
更多信息。
是的,通过'Variable'实际上我的意思是使用它的'__init__'。由于'get_variable'非常方便,我想知道为什么我看到的大多数TensorFlow代码都使用'Variable'而不是'get_variable'。在它们之间进行选择时是否有任何约定或因素要考虑。谢谢! –
如果你想有一个特定的值,使用变量很简单:x = tf.Variable(3)。 –
@SungKim通常当我们使用'tf.Variable()'时,我们可以将它初始化为一个截断正态分布的随机值。这里是我的例子'w1 = tf.Variable(tf.truncated_normal([5,50],stddev = 0.01),name ='w1')'。这相当于什么?我如何告诉它我想要一个截断的正常?我应该做'w1 = tf.get_variable(name ='w1',shape = [5,50],initializer = tf.truncated_normal,regularizer = tf.nn.l2_loss)'? –
我能找到一个和另一个之间的两个主要区别:
首先是tf.Variable
将始终创建一个新的变量,是否tf.get_variable
从图中得到这些参数的存在的变量,如果它不存在,它创建一个新的。
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
最后一个断言错误很有趣:在同一个作用域下的两个同名变量应该是同一个变量。但是,如果你测试的变量d
名称和e
你会发现,Tensorflow改变变量e
的名字:
d.name #d.name == "two/v:0"
e.name #e.name == "two/v_1:0"
很好的例子!关于'd.name'和'e.name',我刚刚遇到了一个关于张量图命名操作的[TensorFlow doc](https://www.tensorflow.org/programmers_guide/graphs#naming_operations),它解释了它:'如果默认图形已经包含名为“answer”的操作,则TensorFlow会将“_1”,“_2”等添加到名称中,以使其唯一。 – Atlas7
get_variable是新的方式,变老的方式(这可能永远支持)为卢卡斯说(PS :他在TF中写了大量的变量名称范围) –