python神经网络 tf.name_scope 和 tf.variable_scope 的区别


Posted in Python onMay 04, 2022

学习前言

最近在学目标检测……SSD的源码好复杂……看了很多版本的SSD源码,发现他们会使用tf.variable_scope,刚开始我还以为就是tf.name_scope,才发现原来两者是不一样的

两者区别

tf.name_scope()和tf.variable_scope()是两个作用域,一般与两个创建/调用变量的函数tf.variable() 和tf.get_variable()搭配使用。

为什么要使用两个不同的作用域方式呢?其主要原因与变量共享相关。

变量共享主要涉及两个函数:tf.Variable() 和tf.get_variable()

在tf.variable_scope的作用域下需要使用tf.get_variable()函数,这是因为tf.get_variable()拥有一个变量检查机制,会检测已经存在的变量是否设置为共享变量,当同名变量存在共享机制时,不会报错,如果并未设置为共享变量,则报错。

如果使用tf.Variable() 的话每次都会新建变量。但是很多时候我们希望重用一些变量,所以我们使用到了get_variable(),它会去搜索变量名,有就直接用,没有再新建。
在进行变量共享的时候需要使用到标志reuse,当reuse = True时是可以共享,False时不可以共享。

tf.variable_scope函数

tf.variable_scope(
    name_or_scope,
    default_name=None,
    values=None,
    initializer=None,
    regularizer=None,
    caching_device=None,
    partitioner=None,
    custom_getter=None,
    reuse=None,
    dtype=None,
    use_resource=None,
    constraint=None,
    auxiliary_name_scope=True
)

其中:

1、name_or_scope:范围的名称。

2、default_name:如果name_or_scope参数为None,则使用默认的名称,该名称将是唯一的;如果提供了name_or_scope,它将不会被使用,因此它不是必需的,并且可以是None。

3、values:传递给操作函数的Tensor参数列表。

4、initializer:此范围内变量的默认初始值设定项。

5、regularizer:此范围内变量的默认正规化器。

6、caching_device:此范围内变量的默认缓存设备。

7、partitioner:此范围内变量的默认分区程序。

8、custom_getter:此范围内的变量的默认自定义吸气。

9、reuse:可以是True、None或tf.AUTO_REUSE;如果是True,即可以开始共享变量,变量重构用;如果是tf.AUTO_REUSE,则我们创建变量(如果它们不存在),否则返回它们(用于在第一轮创建变量);如果是None,则我们继承父范围的重用标志。

10、dtype:在此范围中创建的变量类型。

测试代码

1、使用reuse=True共享变量

import tensorflow as tf
# 初始化第一个v1
with tf.variable_scope("scope1"):
    v1 = tf.get_variable("v1",[3,3],tf.float32,initializer=tf.constant_initializer(1))
    print(v1.name)
# 不同的作用域
with tf.variable_scope("scope2"):
    v1 = tf.get_variable("v1",[3,3],tf.float32,initializer=tf.constant_initializer(1))
    print(v1.name)
# 开始共享
with tf.variable_scope("scope1",reuse = True):
    v1_share = tf.get_variable("v1",[3,3],tf.float32,initializer=tf.constant_initializer(1))
    print(v1_share.name)

运行结果为:

scope1/v1:0
scope2/v1:0
scope1/v1:0

如果在下部再加上

with tf.variable_scope("scope2"):
    v1_share = tf.get_variable("v1",[3,3],tf.float32,initializer=tf.constant_initializer(1))
    print(v1_share.name)

此时没有reuse,不能共享,程序报错。

2、使用AUTO_REUSE共享变量

import tensorflow as tf
# 使用AUTO_REUSE可以直接创建
# 如果reuse = True,初始化第一轮创建的时候会报错
def demo():
  with tf.variable_scope("demo", reuse=tf.AUTO_REUSE):
    v = tf.get_variable("v", [1])
  return v
v1 = demo() 
v2 = demo()
print(v1.name)

运行结果为:

demo/v:0
demo/v:0

以上就是python神经网络 tf.name_scope 和 tf.variable_scope 的区别的详细内容!


Tags in this post...

Python 相关文章推荐
python中将字典转换成其json字符串
Jul 16 Python
详解Python中for循环的使用方法
May 14 Python
Python中几个比较常见的名词解释
Jul 04 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
Sep 21 Python
Python合并字典键值并去除重复元素的实例
Dec 18 Python
Python实现合并两个列表的方法分析
May 28 Python
对python中的高效迭代器函数详解
Oct 18 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
Aug 12 Python
Python networkx包的实现
Feb 14 Python
Python logging模块写入中文出现乱码
May 21 Python
使用gunicorn部署django项目的问题
Dec 30 Python
Python对excel的基本操作方法
Feb 18 Python
Python3使用Qt5来实现简易的五子棋小游戏
May 02 #Python
python开发制作好看的时钟效果
关于的python五子棋的算法
python开发人人对战的五子棋小游戏
python pygame 开发五子棋双人对弈
May 02 #Python
Python开发简易五子棋小游戏
May 02 #Python
Python开发五子棋小游戏
You might like
PHP+DBM的同学录程序(4)
2006/10/09 PHP
PHP超级全局变量数组小结
2012/10/04 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
php实现插入排序
2015/03/29 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
laravel数据库查询结果自动转数组修改实例
2021/02/27 PHP
繁简字转换功能
2006/07/19 Javascript
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
jquery操作 iframe的方法
2014/12/03 Javascript
简单谈谈javascript Date类型
2015/09/06 Javascript
利用JQuery直接调用asp.net后台的简单方法
2016/10/27 Javascript
微信小程序 picker 组件详解及简单实例
2017/01/10 Javascript
简单实现nodejs上传功能
2017/01/14 NodeJs
webpack中CommonsChunkPlugin详细教程(小结)
2017/11/09 Javascript
vue select选择框数据变化监听方法
2018/08/24 Javascript
vue+iview/elementUi实现城市多选
2019/03/28 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
2019/04/07 Javascript
vue+element实现表单校验功能
2019/05/20 Javascript
微信小程序实现打开并下载服务器上面的pdf文件到手机
2019/09/20 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
vue如何搭建多页面多系统应用
2020/06/17 Javascript
python dict remove数组删除(del,pop)
2013/03/24 Python
python字典DICT类型合并详解
2017/08/17 Python
Python编程之微信推送模板消息功能示例
2017/08/21 Python
selenium+PhantomJS爬取豆瓣读书
2019/08/26 Python
python实现输出一个序列的所有子序列示例
2019/11/18 Python
tensorflow生成多个tfrecord文件实例
2020/02/17 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
8种常用的Python工具
2020/08/05 Python
《诺贝尔》教学反思
2014/02/17 职场文书
新春文艺演出主持词
2014/03/27 职场文书
新年团拜会主持词
2014/04/02 职场文书
初中政治教学工作总结
2015/08/13 职场文书
python机器学习实现oneR算法(以鸢尾data为例)
2022/03/03 Python
Java中API的使用方法详情
2022/04/06 Java/Android
Python时间操作之pytz模块使用详解
2022/06/14 Python