jlearning.cn

TensorFlow——tf.Variable和tf.get_variable()的区别

基础用法的例子:

1
2
3
4
var1 = tf.get_variable("var3",[1])
sess.run(tf.global_variables_initializer())
var1.eval()
#输出:array([-1.57205701], dtype=float32)
1
2
3
4
5
6
7
8
W = tf.Variable([.3], tf.float32)
b = tf.Variable([-.3], tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W * x + b
init = tf.global_variables_initializer()
sess.run(init)
print(sess.run(linear_model, {x:[1,2,3,4]}))
#输出 [ 0. 0.30000001 0.60000002 0.90000004]

看看文档怎么说:

tf.get_variable:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> get_variable(
> name,
> shape=None,
> #变来那个类型,默认DT_FLOAT
> dtype=None,
> initializer=None,
> regularizer=None,
> trainable=True,
> collections=None,
> caching_device=None,
> partitioner=None,
> validate_shape=True,
> use_resource=None,
> custom_getter=None
> )
>

>

通过参数得到一个已经存在的变量,或者创建一个新的变量。

如果initializerNone,将会应用变来那个空间(variable scope)的默认initilizer。如果这个也是None,将会应用glorot_uniform_initializerinitializer也可以是一个Tensor,在这种情况下,变来那个将会被初始化为这个值和这个shape

所以,glorot_uniform_initializer是什么?在文档里搜了一下,搜不到。最接近的是random_uniform_initializer,看名字能看出来是一个随机初始化的工具,这也能解释最前面的代码例子。所以,真的是文档写错了吗。glorot怎么看也不像是一个单词啊。

文档里还有一个说明的,这个函数会将加变量空间作为前缀,而且执行reuse检查。

1
2
3
4
5
with tf.variable_scope("foo"):
v = tf.get_variable("v", [1]) # v.name == "foo/v:0"
w = tf.get_variable("w", [1]) # w.name == "foo/w:0"
with tf.variable_scope("foo", reuse=True):
v1 = tf.get_variable("v") # The same as v above.

网上的一篇博文:http://blog.csdn.net/u012436149/article/details/53696970

  1. 使用tf.Variable时,如果检测到命名冲突,系统会自己处理。使用tf.get_variable()时,系统不会处理冲突,而会报错
1
2
3
4
5
6
7
import tensorflow as tf
w_1 = tf.get_variable(name="w_1",initializer=1)
w_2 = tf.get_variable(name="w_1",initializer=2)
#错误信息
#ValueError: Variable w_1 already exists, disallowed. Did
#you mean to set reuse=True in VarScope?

下面看tf.Variable

一个变量通过调用run()来在图中维持状态。你在图中增加爱一个变来那个,通过构建一个Variable类的实例。

Variable()构造器需要一个变量的初始值,可以是一个任何类型和shape的Tensor。构造之后,类型和shape都固定了。值可以通过assign方法改变。

使用Tensor的操作,也可以使用Variable

当有一个图之后,可以通过变量的initializer操作来初始化它。

最常见的初始化方法是使用global_variables_initializer()初始化所有的变量。

如果你需要创建一个变量,这个变量的值依赖于应该一个变量,使用另外那个变量的initialized_value()。这保证让你的变量以正确的顺序初始化。

global_variables()返回图中所有变量的集合。

初始化方法:

1
2
3
4
5
6
7
8
9
10
__init__(initial_value=None,
trainable=True,
collections=None,
validate_shape=True,
caching_device=None,
name=None,
variable_def=None,
dtype=None,
expected_shape=None,
import_scope=None)