variable_scope和name_scope差别
先看代码:
- #命名空间函数tf.variable_scope()和tf.name_scope()函数区别于使用
- import tensorflow as tf
- with tf.variable_scope("foo"):
- a = tf.get_variable("bar", [1])
- print(a.name) #foo/bar:0
- b = tf.Variable("b", [1])
- print(b.name) #foo/Variable:0
- with tf.variable_scope("bar"):
- a = tf.get_variable("bar", [1])
- print(a.name) #bar/bar:0
- b = tf.Variable("b", [1])
- print(b.name) #bar/Variable:0
- with tf.name_scope("a"):
- a = tf.Variable([1])
- print(a.name) #a/Variable:0
- with tf.name_scope("b"):
- b = tf.get_variable("b", [1])
- print(b.name) #b_1:0
- with tf.name_scope("b"):
- c = tf.get_variable("b", [1])
- print(c.name) #出错,b已存在
可以看出,对于tf.Variable()函数,两者的使用情况都一样;而tf.get_variable()函数,它不受name_scope约束,已经声明过的变量就不能再声明了。
1. tf.name_scope('scope_name')或tf.name_scope(named_scope)
主要与tf.Variable搭配使用;
当传入字符串时,用以给变量名添加前缀,类似于目录,如case1所示;
当传入已存在的name_scope对象时,则其范围内变量的前缀只与当前传入的对象有关,与更上层的name_scope无关,如case2所示。
- import tensorflow as tf
- # case 1:
- with tf.name_scope('l1'):
- with tf.name_scope('l2'):
- wgt1 = tf.Variable([1,2,3], name='wgts')
- bias1 = tf.Variable([0.1], name='biases')
- print wgt1.name, bias1.name
- # >>> l1/l2/wgts:0 l1/l2/biases:0
- # case 2:
- with tf.name_scope('l1') as l1_scp:
- with tf.name_scope('l2'):
- wgt0 = tf.Variable([1,2,3], name='wgts')
- bias0 = tf.Variable([0.1], name='biases')
- with tf.name_scope(l1_scp):
- wgt1 = tf.Variable([1,2,3], name='wgts')
- bias1 = tf.Variable([0.1], name='biases')
- print wgt0.name, bias0.name, wgt1.name, bias1.name
- # >>> l1_1/l2/wgts:0 l1_1/l2/biases:0 l1_1/wgts:0 l1_1/biases:0
2. tf.variable_scope('scope_name', reuse=None)或
tf.variable_scope(named_scope)
与name_scope一样:当传入字符串时,用以给变量名添加前缀,类似于目录;
当传入已存在的variable_scope对象时,则其范围内变量的前缀只与当前传入的对象有关,与更上层的variable_scope无关。
常于get_variable搭配使用,多用于变量共享;其中 reuse 参数可设为 None、tf.AUTO_REUSE、True、False;
当 reuse=None(默认情况)时,与上层variable_scope的reuse参数一样。
- # case 1
- with tf.variable_scope('lv1'):
- with tf.variable_scope('lv2'):
- init = tf.constant_initializer(0.1)
- wgt1 = tf.get_variable('wgts', [2,2])
- bias1 = tf.get_variable('biases', [2,2])
- print wgt1.name, bias1.name
- # >>> lv1/lv2/wgts:0 lv1/lv2/biases:0
当 reuse=tf.AUTO_REUSE 时,自动复用,如果变量存在则复用,不存在则创建。这是最安全的用法。
- with tf.variable_scope('lv1'):
- with tf.variable_scope('lv2'):
- init = tf.constant_initializer(0.1)
- wgt1 = tf.get_variable('wgts', [2,2])
- bias1 = tf.get_variable('biases', [2,2])
- print wgt1.name, bias1.name
- # >>> lv1/lv2/wgts:0 lv1/lv2/biases:0
- with tf.variable_scope('lv1', reuse=tf.AUTO_REUSE):
- with tf.variable_scope('lv2'):
- init = tf.constant_initializer(0.1)
- wgt2 = tf.get_variable('wgts', [2,2])
- bias2 = tf.get_variable('biases', [2,2])
- print wgt2.name, bias2.name
- # >>> lv1/lv2/wgts:0 lv1/lv2/biases:0
- with tf.variable_scope('lv1', reuse=tf.AUTO_REUSE):
- with tf.variable_scope('lv2'):
- init = tf.constant_initializer(0.1)
- wgt2 = tf.get_variable('wgts', [2,2])
- bias2 = tf.get_variable('biases', [2,2])
- print wgt2.name, bias2.name
- # >>> lv1/lv2/wgts:0 lv1/lv2/biases:0
当 reuse=True 时,tf.get_variable会查找该命名变量,如果没有找到,则会报错;所以设置reuse=True之前,要保证该命名变量已存在。
- with tf.variable_scope('lv1', reuse=True):
- with tf.variable_scope('lv2'):
- init = tf.constant_initializer(0.1)
- wgt1 = tf.get_variable('wgts', [2,2])
- bias1 = tf.get_variable('biases', [2,2])
- print wgt1.name, bias1.name
- # >>> ValueError: Variable lv1/lv2/wgts does not exist,
- # or was not created with tf.get_variable(). Did you mean
- # to set reuse=tf.AUTO_REUSE in VarScope?
命名变量已存在:
- with tf.variable_scope('lv1'):
- with tf.variable_scope('lv2'):
- init = tf.constant_initializer(0.1)
- wgt1 = tf.get_variable('wgts', [2,2])
- bias1 = tf.get_variable('biases', [2,2])
- print wgt1.name, bias1.name
- # >>> lv1/lv2/wgts:0 lv1/lv2/biases:0
- # case 2
- with tf.variable_scope('lv1', reuse=True):
- with tf.variable_scope('lv2'):
- init = tf.constant_initializer(0.1)
- wgt1 = tf.get_variable('wgts', [2,2])
- bias1 = tf.get_variable('biases', [2,2])
- print wgt1.name, bias1.name
- # >>> lv1/lv2/wgts:0 lv1/lv2/biases:0
当 reuse=False 时,tf.get_variable会调用tf.Variable来创建变量,并检查创建的变量是否以存在,如果已存在,则报错;
- with tf.variable_scope('lv1'):
- with tf.variable_scope('lv2'):
- init = tf.constant_initializer(0.1)
- wgt1 = tf.get_variable('wgts', [2,2])
- bias1 = tf.get_variable('biases', [2,2])
- print wgt1.name, bias1.name
- # >>> lv1/lv2/wgts:0 lv1/lv2/biases:0
- # case 2
- with tf.variable_scope('lv1', reuse=False):
- with tf.variable_scope('lv2'):
- init = tf.constant_initializer(0.1)
- wgt1 = tf.get_variable('wgts', [2,2])
- bias1 = tf.get_variable('biases', [2,2])
- print wgt1.name, bias1.name
- # ValueError: Variable lv1/lv2/wgts already exists, disallowed.
- # Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope?
variable_scope和name_scope差别的更多相关文章
- Tensorflow中的name_scope和variable_scope
Tensorflow是一个编程模型,几乎成为了一种编程语言(里面有变量.有操作......). Tensorflow编程分为两个阶段:构图阶段+运行时. Tensorflow构图阶段其实就是在对图进行 ...
- tensorflow里面共享变量、name_scope, variable_scope等如何理解
tensorflow里面共享变量.name_scope, variable_scope等如何理解 name_scope, variable_scope目的:1 减少训练参数的个数. 2 区别同名变量 ...
- tf.variable和tf.get_Variable以及tf.name_scope和tf.variable_scope的区别
在训练深度网络时,为了减少需要训练参数的个数(比如具有simase结构的LSTM模型).或是多机多卡并行化训练大数据大模型(比如数据并行化)等情况时,往往需要共享变量.另外一方面是当一个深度学习模型变 ...
- tensorflow中的name_scope, variable_scope
在训练深度网络时,为了减少需要训练参数的个数(比如LSTM模型),或者是多机多卡并行化训练大数据.大模型等情况时,往往就需要共享变量.另外一方面是当一个深度学习模型变得非常复杂的时候,往往存在大量的变 ...
- 通俗理解tf.name_scope()、tf.variable_scope()
前言:最近做一个实验,遇到TensorFlow变量作用域问题,对tf.name_scope().tf.variable_scope()等进行了较为深刻的比较,记录相关笔记:tf.name_scope( ...
- Tensorflow 之 name/variable_scope 变量管理
name/variable_scope 的作用 充分理解 name / variable_scope TensorFlow 入门笔记 当一个神经网络比较复杂.参数比较多时,就比较需要一个比较好的方式来 ...
- Tensorflow常用函数说明(一)
首先最开始应该清楚一个知识,最外面的那个[ [ [ ]]]括号代表第一维,对应维度数字0,第二个对应1,多维时最后一个对应数字-1:因为后面有用到 1 矩阵变换 tf.shape(Tensor) 返回 ...
- [TensorBoard] Name & Variable scope
TF有两个scope, 一个是name_scope一个是variable_scope 第一个程序: with tf.name_scope("hello") as name_scop ...
- 2.4scope
name_scope variable_scope scope (name_scope/variable_scope) from __future__ import print_function im ...
随机推荐
- 20172308《Java软件结构与数据结构》第二周学习总结
教材学习内容总结 第 3 章 集合概述--栈 集合:一种聚集.组织了其他对象的对象 软件系统中的另一个类或对象通过集合预定的方式与该集合进行交互来使用这些集合 多年以来软件开发和研究人员定义了一些特定 ...
- BZOJ 4610: [Wf2016]Ceiling Functi 水题
4610: [Wf2016]Ceiling Functi 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4610 Description ...
- 2010-2011 ACM-ICPC, NEERC, Moscow Subregional Contest Problem H. Hometask 水题
Problem H. Hometask 题目连接: http://codeforces.com/gym/100714 Description Kolya is still trying to pass ...
- @RequestParam @RequestBody @PathVariable 等参数绑定注解详解(转)
引言: 接上一篇文章,对@RequestMapping进行地址映射讲解之后,该篇主要讲解request 数据到handler method 参数数据的绑定所用到的注解和什么情形下使用: 简介: han ...
- ADO.NET理论+实践
题记: 每一事物的产生和存在都有其特定的理由. 理论:ADO.NET是一组与数据源进行交互的面向对象类库.通常情况下数据源就是数据库,当然同样也能是文本文件,Excel表格或XML文件,我们知道的数 ...
- C#中如何选择使用T[]或List<T>
当有一组数据需要存放,到底是使用T[]呢,还是选择List<T>呢? 先来看数组. 所有的数组类型都隐式地从System.Array这个抽象类派生,而System.Array又派生自Sys ...
- SpringBoot中Mybatis打印sql
原文:https://www.cnblogs.com/expiator/p/8664977.html 如果使用的是application.properties文件,加入如下配置: logging.le ...
- 利用Fiddler和Wireshark解密SSL加密流量
原文地址:http://kelvinh.github.io/blog/2014/01/12/decrypt-ssl-using-fiddler-and-wireshark/ Fiddler是一个著名的 ...
- 【spring boot】【elasticsearch】spring boot整合elasticsearch,启动报错Caused by: java.lang.IllegalStateException: availableProcessors is already set to [8], rejecting [8
spring boot整合elasticsearch, 启动报错: Caused by: java.lang.IllegalStateException: availableProcessors ], ...
- python测试开发django-33.admin后台一对一关系OneToOneField
前言 假如有一张表(Card)记录用户的卡号信息和用户名,现在需要新增一个小功能,记录用户的手机号,邮箱和住址等更多信息. 为了不影响原来的表设计,可以新增一张表(CardDetail),专门记录用户 ...