tensorflow基础知识(六) tensor变量 tf.Variable与tf.get_variable和tf.variable_scope

tensorflow中的变量

1 tf.Variable与tf.get_variable创建变量

tf.Variabletf.get_variable都可以在tensorflow 定义变量,当他们用来创建变量时,他们的区别在于:

  • tf.Variable的变量名是一个 可选项。但是tf.get_variable必须指定变量名
  • tf.get_variable一旦指定了一个变量名,就不能再重复定义。除非结合tf.variable_scope中的reuse参数。tf.Variable用相同name参数指定两个变量是不会报错的。
v1 = tf.get_variable('v', shape=[1], initializer=tf.constant_initializer(1.0))
v2 = tf.get_variable('v', shape=[1], initializer=tf.constant_initializer(1.0))

ValueError: Variable v already exists, disallowed.

v1 = tf.Variable(tf.random_normal(shape=[2,2]), name='v')
v2 = tf.Variable(tf.random_normal(shape=[2,2]), name='v')

不会报错

函数定义格式如下:

  • tf.Variable(init_obj, name='v')用于生成一个初始值为init-obj的变量
    • init_obj为必须项,它是变量的初始化数据,一般对权重变量初始化采用正态随机初始化
    • name是一个 可选项
  • tf.get_variabl(name, shape=None, dtype=tf.float32, initializer=None,
    regularizer=None, trainable=True, collections=None))
    获取已存在的变量, 不存在则新建一个变量。

    • name是一个必要的参数选项
    • 变量的初始化可以利用initializer来实现。
      比如,Xavier初始化器
#变量创建的等价定义
v = tf.get_variable('v', shape=[1], initializer=tf.constant_initializer(1.0))
v = tf.Variable(tf.random_normal(shape=[2,2]), name='v')

2 tf.variable_scope()与tf.get_variable的配合使用

tf.variable_scope(name,resue=False)tf.get_variable经常配合使用,更加方便地管理参数命名

上面说到,tf.get_variable一旦指定了一个变量名,就不能再用该变量名重复定义。但是在神经网络中我们第一层和第二层的参数都可以称为wight时,就不可以直接使用tf.get_variable,而是和要结合tf.variable_scope()定义不同的命名空间将两种变量区别开来。

with tf.variable_scope('layer1',resue=False):
    v = tf.get_variable('v',[1],initializer=tf.constant_initializer(1.0))

with tf.variable_scope('layer2',resue=False):
    v1 = tf.get_variable('v',[1])

另外,还必须知道:

  • 当reuse为False或者None时(这也是默认值),同一个tf.variable_scope下面的变量名不能相同;

  • 当reuse为True时,tf.variable_scope只能获取已经创建过的变量

违反上面两个情况都会报错。

3 使用tf.get_variable的好处

  • 可以使用reuse参数,公共同一命名空间下的变量
  • 可以和tf.variable_scope结合,管理变量

猜你喜欢

转载自blog.csdn.net/promisejia/article/details/81638287