Tensorflow变量作用域及变量初始化

本文主要讲述Tensorflow中的变量作用域变量初始化。先来区分几个概念:

  • tf.name_scope():为了更好地管理变量的命名空间而提出的。比如在 tensorboard 中,因为引入了 name_scope, 我们的 Graph 看起来才井然有序
  • tf.variable_scope():通过 tf.get_variable()为变量名指定命名空间.

创建变量的三种方式:

  • tf.placeholder() :占位符。* trainable==False *
  • tf.Variable() :一般变量用这种方式定义。 * 可以选择 trainable 类型 *
  • tf.get_variable() :一般都是和 tf.variable_scope() 配合使用,从而实现变量共享的功能。 * 可以选择 trainable 类型 *
  • 【注意:】tf.get_variable()和tf.Variable()不是一回事!!两个的区别有好几处:
    ①比如,tf.Variable()在定义的时候必须初始化,而tf.get_variable()定义的时候可以先不进行初始化操作。
    ②想要进行变量共享,必须使用tf.get_variable()实现,搭配命名空间,以及reuse关键字的使用,就可以实现变量的共享;而tf.Variable()每次都会生成一个新的变量。

获取变量的方式:

获取所有全局变量: var = tf.global_variables() #不仅包括训练变量,还包括不训练变量
获取所有训练变量:tf.trainable_variables()
已知某个训练参数的名称,想要获取它的值:sess.run(tf.get_default_graph().get_tensor_by_name(“conv1/b:0”))


变量作用域实例

主要用到的两个部分:

  • tf.get_variable(, , ): 通过所给的名字创建或是返回一个变量.
  • tf.variable_scope(<scope_name>): 通过 tf.get_variable()为变量名指定命名空间.

直接上代码:

  #tf.variable_scope()构建了一个名为conv的命名空间,
   with tf.variable_scope(scope or 'conv', reuse=reuse):
       #构建了两个变量,这两个变量只在conv命名空间中起作用
     #定义W,只声明了变量shape,还没有初始化,后面需要初始化了才能用
       W = tf.get_variable("W", shape = [3,3,16,32])
       #trainable=False表示b是一个不可训练变量,而且在定义的时候直接用常数b对其进行了初始化,
       b = tf.get_variable("b", b.shape, trainable=False, initializer=tf.constant_initializer(b)) 

参考教程:
http://wiki.jikexueyuan.com/project/tensorflow-zh/how_tos/variable_scope.html
https://blog.csdn.net/Jerr__y/article/details/70809528


变量的初始化操作

总结了以下几种方式:
1.在定义的时候直接初始化,比如
b = tf.get_variable("b", b.shape, trainable=False, initializer=tf.constant_initializer(b))
2.在会话中使用sess.run()进行初始化,比如

sess.run(tf.global_variables_initializer())  # 初始化全局变量
sess.run(tf.local_variables_initializer())  # 初始化本地变量

3.如果只想要初始化一部分指定变量,使用:
sess.run(tf.variables_initializer(var_list))
其中,var_list是需要初始化的变量列表。

猜你喜欢

转载自blog.csdn.net/aaon22357/article/details/82898216