发新帖

local_variable未经初始化却能被global_variable使用

[复制链接]
532 1

快来加入 TensorFlowers 大家庭!

您需要 登录 才可以下载或查看,没有帐号?加入社区

x
  1. import tensorflow as tf

  2. with tf.variable_scope('foo',reuse=tf.AUTO_REUSE):
  3.     a = tf.get_variable('a', [2,3], dtype=tf.float32,
  4.                         initializer=tf.initializers.he_normal(seed=1234),
  5.                         collections=[tf.GraphKeys.LOCAL_VARIABLES])

  6. with tf.variable_scope('bar'):
  7.     f= tf.get_variable('f', initializer=a.initialized_value() + 1)

  8. glob_var_init  = tf.global_variables_initializer()
  9. loc_var_init = tf.local_variables_initializer()

  10. with tf.Session() as sess:
  11.     sess.run(glob_var_init)
  12.     # sess.run(loc_var_init)
  13.     print(sess.run(tf.report_uninitialized_variables()))
  14.     # print('a\n', sess.run(a))
  15.     print(sess.run(f))
复制代码



我的a是一个local variable,而f是一个global variable或者说是trainable variable,
但是我用的是global_variables_initializer()初始化f,并没有初始化a,
为什么session run 输出f却能够得到值,而session run 输出 a 却会报错
我知道答案 回答被采纳将会获得10 金币 + 5 金币 已有1人回答
本楼点评(0) 收起

精彩评论1

2h4dl  TF荚荚  发表于 2019-3-29 12:02:12 | 显示全部楼层

我仔细看了一边TF的官方Variable教程,注意到下面两句话:

  1. 默认情况下,每个 tf.Variable 都放置在以下两个集合中:

  2. tf.GraphKeys.GLOBAL_VARIABLES - 可以在多台设备间共享的变量,
  3. tf.GraphKeys.TRAINABLE_VARIABLES - TensorFlow 将计算其梯度的变量。
  4. 如果您不希望变量可训练,可以将其添加到 tf.GraphKeys.LOCAL_VARIABLES 集合中。
复制代码

  1. 要在训练开始前一次性初始化所有可训练变量,请调用 tf.global_variables_initializer()。此函数会返回一个操作,负责初始化 tf.GraphKeys.GLOBAL_VARIABLES 集合中的所有变量。运行此操作会初始化所有变量。
复制代码


global_variables_initializer()会初始化在集合tf.GraphKeys.GLOBAL_VARIABLS和tf.GraphKey.TRAINABLE_VARIABLES的所有变量,
代码里的a虽然是在tf.GraphKeys.LOCAL_VARIABLES集合里,但是tainable属性是True,并不像官方说的那样,变成untrainable。

所以在进行global_initialize 的时候,对variable进行了自动推导初始化,所以f可以被输出,但是直接输出a,却因为是local_variable,session没有获取到数据。
大概这么个情况,我觉得是个bug。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入社区

x
本楼点评(0) 收起
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

主题

帖子

17

积分
快速回复 返回顶部 返回列表