• name/variable_scope 的作用

  • 充分理解 name / variable_scope

  • TensorFlow 入门笔记

  • 当一个神经网络比较复杂、参数比较多时,就比较需要一个比较好的方式来传递和管理这些参数。而Tensorflow提供了通过变量名称来创建或者获取变量的机制。通过这个机制,可以在不同的函数中直接通过变量的名称来使用变量,而不需要将变量通过参数进行传递。
  • * name_scope: * 为了更好地管理变量的命名空间而提出的。比如在 tensorboard 中,因为引入了 name_scope, 我们的 Graph 看起来才井然有序。

  • * variable_scope: * 大大大部分情况下,跟 tf.get_variable() 配合使用,实现变量共享的功能。

2.三种方式创建变量: tf.placeholder, tf.Variable, tf.get_variable

从上面的实验结果来看,这三种方式所定义的变量具有相同的类型。而且只有 tf.get_variable() 创建的变量之间会发生命名冲突。在实际使用中,三种创建变量方式的用途也是分工非常明确的。其中

  • tf.placeholder() 占位符。* trainable==False *
  • tf.Variable() 一般变量用这种方式定义。 * 可以选择 trainable 类型 *
  • tf.get_variable() 一般都是和 tf.variable_scope() 配合使用,从而实现变量共享的功能。 * 可以选择 trainable 类型 *
  • tf.get_variable的作用不仅在于创建变量,它还可以通过变量名称获取变量,但在创建变量时,如果创建失败(变量已经存在),那么就会报错。因此,就需要一个上下文管理器tf.variable_scope,可以更好的管理变量,并且可以增加程序的可读性。
  • with tf.variable_scope('foo',reuse=None):参数reuse=True时,通过tf.get_variable只能获取已经存在的变量名。上下文管理器在嵌套的时候,变量名称的前面会加上上下文管理器的名称。

3. 探索 name_scope 和 variable_scope

tf.name_scope() 并不会对 tf.get_variable() 创建的变量有任何影响。
tf.name_scope() 主要是用来管理命名空间的,这样子让我们的整个模型更加有条理。而 tf.variable_scope() 的作用是为了实现变量共享,它和 tf.get_variable() 来完成变量共享的功能。

  • 首先我们要确立一种 Graph 的思想。在 TensorFlow 中,我们定义一个变量,相当于往 Graph 中添加了一个节点。和普通的 python 函数不一样,在一般的函数中,我们对输入进行处理,然后返回一个结果,而函数里边定义的一些局部变量我们就不管了。但是在 TensorFlow 中,我们在函数里边创建了一个变量,就是往 Graph 中添加了一个节点。出了这个函数后,这个节点还是存在于 Graph 中的。
    • name_scope 返回的是 string, 而 variable_scope 返回的是对象. 这也可以感觉到, variable_scope 能干的事情比 name_scope 要多.
    • name_scope对 get_variable()创建的变量 的名字不会有任何影响,而创建的op会被加上前缀.
    • tf.get_variable_scope() 返回的只是 variable_scope,不管 name_scope. 所以以后我们在使用tf.get_variable_scope().reuse_variables() 时可以无视name_scope

总结简单来看

1. 使用tf.Variable()的时候,tf.name_scope()tf.variable_scope() 都会给 Variable 和 op 的 name属性加上前缀。 
2. 使用tf.get_variable()的时候,tf.name_scope()就不会给 tf.get_variable()创建出来的Variable加前缀。但是 tf.Variable() 创建出来的就会受到 name_scope 的影响.

name_scope可以用来干什么

典型的 TensorFlow 可以有数以千计的节点,如此多而难以一下全部看到,甚至无法使用标准图表工具来展示。为简单起见,我们为op/tensor名划定范围,并且可视化把该信息用于在图表中的节点上定义一个层级。默认情况下, 只有顶层节点会显示。下面这个例子使用tf.name_scope在hidden命名域下定义了三个操作:

import tensorflow as tfwith tf.name_scope('hidden') as scope:a = tf.constant(5, name='alpha')W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0), name='weights')b = tf.Variable(tf.zeros([1]), name='biases')print a.nameprint W.nameprint b.name

结果是得到了下面三个操作名:

hidden/alpha 
hidden/weights 
hidden/biases 
name_scope 是给op_name加前缀, variable_scope是给get_variable()创建的变量的名字加前缀。

tf.variable_scope有时也会处理命名冲突

import tensorflow as tf
def test(name=None): with tf.variable_scope(name, default_name="scope") as scope: w = tf.get_variable("w", shape=[2, 10]) test() test() ws = tf.trainable_variables() for w in ws: print(w.name) #scope/w:0 #scope_1/w:0 #可以看出,如果只是使用default_name这个属性来创建variable_scope #的时候,会处理命名冲突

共享变量

TensorFlow 支持两种共享变量的方式:

  • 显式传递 tf.Variable 对象。
  • tf.variable_scope 对象内隐式包装 tf.Variable 对象。

虽然显式传递变量的代码非常清晰,但有时编写 TensorFlow 函数(在实现中隐式使用变量)非常方便。tf.layer 中的大多数功能层以及所有 tf.metrics 和部分其他库工具都使用这种方法。

变量作用域允许您在调用隐式创建和使用变量的函数时控制变量重用。作用域还允许您以分层和可理解的方式命名变量。

例如,假设我们编写一个函数来创建一个卷积/relu 层:

def conv_relu(input, kernel_shape, bias_shape):    # Create variable named "weights".    weights = tf.get_variable("weights", kernel_shape,        initializer=tf.random_normal_initializer())    # Create variable named "biases".    biases = tf.get_variable("biases", bias_shape,        initializer=tf.constant_initializer(0.0))    conv = tf.nn.conv2d(input, weights,        strides=[1, 1, 1, 1], padding='SAME')    return tf.nn.relu(conv + biases)

此函数使用短名称 weightsbiases,这有利于清晰区分二者。然而,在真实模型中,我们需要很多此类卷积层,而且重复调用此函数将不起作用:

input1 = tf.random_normal([1,10,10,32])input2 = tf.random_normal([1,20,20,32])x = conv_relu(input1, kernel_shape=[5, 5, 32, 32], bias_shape=[32])x = conv_relu(x, kernel_shape=[5, 5, 32, 32], bias_shape = [32])  # This fails.

由于期望的操作不清楚(创建新变量还是重新使用现有变量?),因此 TensorFlow 将会失败。不过,在不同作用域内调用 conv_relu 可表明我们想要创建新变量:

def my_image_filter(input_images):    with tf.variable_scope("conv1"):        # Variables created here will be named "conv1/weights", "conv1/biases".        relu1 = conv_relu(input_images, [5, 5, 32, 32], [32])    with tf.variable_scope("conv2"):        # Variables created here will be named "conv2/weights", "conv2/biases".        return conv_relu(relu1, [5, 5, 32, 32], [32])

如果您想要共享变量,有两种方法可供选择。首先,您可以使用 variable_scopereuse=True 创建具有相同名称的作用域:

with tf.variable_scope("model"):  output1 = my_image_filter(input1)with tf.variable_scope("model", reuse=True):  output2 = my_image_filter(input2)

您也可以调用 scope.reuse_variables() 以触发重用:

with tf.variable_scope("model") as scope:  output1 = my_image_filter(input1)  scope.reuse_variables()  output2 = my_image_filter(input2)

由于根据作用域的具体字符串名称初始化变量作用域可能比较危险,因此也可以根据另一作用域进行初始化:

with tf.variable_scope("model") as scope:  output1 = my_image_filter(input1)with tf.variable_scope(scope, reuse=True):  output2 = my_image_filter(input2)

Tensorflow 之 name/variable_scope 变量管理相关推荐

  1. tensorflow中的变量管理

    import tensorflow as tf# variable_scope()示例 """ tensorflow中通过变量名称获取变量的机制主要是通过tf.get_v ...

  2. tensorflow中name_scope和variable_scope变量的使用

    1. variable_scope的使用 首先,使用variable_scope可以很方便的管理get_varibale. 如何确定 get_variable 的 prefixed name? 1.1 ...

  3. 【TensorFlow】TensorFlow从浅入深系列之八 -- 教你学会变量管理

    本文是<TensorFlow从浅入深>系列之第8篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维导 ...

  4. TensorFlow中变量管理reuse参数的使用

    TensorFlow用于变量管理的函数主要有两个: tf. get_variable()和tf.variable_scope(), 前者用于创建或获取变量的值,后者用于生成上下文管理器,创建命名空间, ...

  5. Tensorflow name_scope和variable_scope的用法

    Tensorflow name_scope和variable_scope 的用法 简介 当一个神经网络比较复杂.参数比较多时,就比较需要一个比较好的方式来传递和管理这些参数.而Tensorflow提供 ...

  6. TensorFlow的常量、变量、常用函数(一)

    TensorFlow常用函数(一) (1)tf.variable_scope('namespace')和tf.name_scope('namespace'):返回一个用于定义创建variable(层) ...

  7. TensorFlow解析常量、变量和占位符

    TensorFlow解析常量.变量和占位符 最基本的 TensorFlow 提供了一个库来定义和执行对张量的各种数学运算.张量,可理解为一个 n 维矩阵,所有类型的数据,包括标量.矢量和矩阵等都是特殊 ...

  8. Tensorflow |(3)变量的的创建、初始化、保存和加载

    Tensorflow |(1)初识Tensorflow Tensorflow |(2)张量的阶和数据类型及张量操作 Tensorflow |(3)变量的的创建.初始化.保存和加载 变量的的创建.初始化 ...

  9. linux环境变量管理器,运维 - linux(ubuntu) 环境变量管理 (持续更新)

    运维 - linux(ubuntu) 环境变量管理 (持续更新) 注: 本教程以 Ubuntu16.04 操作, 请细看. 如果看完还不明白, 联系我, 我给你发红包. 一, 查看环境变量: 方法 1 ...

最新文章

  1. Copy复制命令兼容各种浏览器(等同于触发Ctrl+C或者Command⌘+C)
  2. 用摩斯电码通关《黑暗之魂3》!up主自制奇葩手柄,连育碧都找上门合作
  3. mybatis使用Mapper时对参数处理的设计与实现
  4. 实时计字数提醒的文本框
  5. socket编程总结
  6. HDU 3709 Balanced Number (数位DP)
  7. C# WPF MVVM模式下在主窗体显示子窗体并获取结果
  8. Asp.net基础概念之 事件
  9. MD5工具类 加盐加密 及编码
  10. 5件你可能不知道可以使用 CSS-in-JS 来做的事情
  11. python小程序100题-python 练习题:流量套餐订购小程序
  12. 如何为复杂页面实现过渡页面
  13. VS Tips (new ones)
  14. SVN missing 解决
  15. 微信支付功能测试用例
  16. 电脑键盘指法的正确练习步骤
  17. 如何转行做数据分析师?
  18. php redis 存入数组,php redis 多维数组操作
  19. The request was rejected because the URL contained a potentially malicious String “%2e“
  20. IC | latency和delay区别

热门文章

  1. 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之数据篇
  2. MCSE第六课-DHCP
  3. 关于TCHAR和string对象的c.str()一些注意事项
  4. linux中查看和开放端口
  5. 微信公众号开发之授权获取用户信息
  6. 设计模式六大原则——迪米特法则(LoD)
  7. 大数据上的“大产品”
  8. TensorNet——基于TensorFlow的大规模稀疏特征模型分布式训练框架
  9. 如何提高PHP代码的质量?第二部分 单元测试
  10. SpringCloud Consul功能介绍及其Raft算法原理