[tf]中的name_scope和variable_scope以及变量重用的那些事

  • 特性:两个都会给tf.Variable创建的变量加上命名前缀,但是tf.name_scope不会给tf.get_varibale创建的变量加上命名前缀,tf.variable_scope会给tf.get_variable创建的变量加上命名前缀,这么做是与这两个方法的作用有关的。
  • name_scope的作用是为了在tensorboard中有折叠的层次化显示组件,不至于所有组件都糊在一起,比如我们有一个generator和一个discriminator那么就可以这样:
with tf.name_scope(name = 'generator') as vs:
    ...
  • variable_scope的所用是为保护和重用变量,比如我的模型中有两个LSTM,那么我就应该不同的LSTM设置不同的variable_scope这样dynamic_rnn内部的get_variable就能正确的区分两个LSTM的组件(因为dynamic_rnn内部的get_variablename都是一样的如果不使用variable_scope进行保护的话,重用都不知道重用哪一个了)。
    variable_scopereuse的几种方法
  • reuse的几种填写: None 表示查看上一层的当 reuse=tf.AUTO_REUSE 时,自动复用,如果变量存在则复用,不存在则创建。这是最安全的用法。
def foo():
  with tf.variable_scope("foo", reuse=tf.AUTO_REUSE):
    v = tf.get_variable("v", [1])
  return v

v1 = foo()  # Creates v.
v2 = foo()  # Gets the same, existing v.
assert v1 == v2
  • 因为创建过了一次,所以可以重用。
with tf.variable_scope("foo"):
    v = tf.get_variable("v", [1])
with tf.variable_scope("foo", reuse=True):
    v1 = tf.get_variable("v", [1])
assert v1 == v
  • 所以reuse不要一上来就设置成True,设置成tf.AUTO_REUSE是最靠谱的。
with tf.variable_scope("foo", reuse=True):
    v = tf.get_variable("v", [1])
    #  Raises ValueError("... v does not exists ...").
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容