问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

通俗理解tf.name_scope()、tf.variable_scope()

发布网友 发布时间:2024-10-08 03:16

我来回答

1个回答

热心网友 时间:2024-10-08 03:20

2022-04-30更新:这篇内容分享还是很多年前,当时接触tf,所以随手记录了一下,后来收到很多读者的反馈,表示其中有很多错误,估计是我当时使用的tf版本太老的缘故,对此最近专门去看了官方api并重新梳理。 大家也可以去参考权威的说明文件: tf.name_scope()

tf.variable_scope()

通过在tf1.15版本上运行,发现第一个代码样例无法运行,具体原因在于tf.variable_scope()会判断是否要共享变量名,而在样例中,因为首先创建了"V1/a1",而在"V2"中设置"reuse=True"去共享变量名,如果继续创建"a1"则会报错,这就是代码无法运行的原因。修改代码如下:

输出:

此时,可以发现"V1"和"V2"没有共享参数,分别各自创建了属于自己的"a1","a2",而且分别具备不同的size。

然后,我们修改"V2"为"tf.variable_scope('V2',reuse=True)",具体如下:

输出:

下面讨论一个评论区的分享(@weiwei ):将"tf.variable_scope('V2',reuse=True)"修改为"tf.variable_scope('V1',reuse=True)"

之后,我进一步将代码修改为:

上述两个样例清楚说明了tf.get_variable()和tf.Variable()的区别:在一个命名空间"V1"内,tf.get_variable()会执行检测机制,并且,节点信息相同,会直接运行,否则会报错,而 tf.Variable() 会自动创建新的命名空间。

前言:最近做一个实验,遇到TensorFlow变量作用域问题,对tf.name_scope()、tf.variable_scope()等进行了较为深刻的比较,记录相关笔记:

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

1)变量共享;2)tensorboard画流程图进行可视化封装变量。

通俗理解就是:tf.name_scope()、tf.variable_scope()会在模型中开辟各自的空间,而其中的变量均在这个空间内进行管理,但是之所以有两个,主要还是有着各自的区别。

1.name_scope() 和 variable_scope():

name_scope 和 variable_scope主要用于变量共享。其中,变量共享主要涉及两个函数:tf.variable() 和tf.get_variable();即就是必须要在tf.variable_scope()的作用域下使用tf.get_variable()函数。这里用tf.get_variable( ) 而不用tf.Variable( ),是因为前者拥有一个变量检查机制,会检测已经存在的变量是否设置为共享变量,如果已经存在的变量没有设置为共享变量,TensorFlow 运行到第二个拥有相同名字的变量的时候,就会报错。

注意,tf.variable() 和tf.get_variable()有不同的创建变量的方式:tf.Variable() 每次都会新建变量。如果希望重用(共享)一些变量,就需要用到了get_variable(),它会去搜索变量名,有就直接用,没有再新建。此外,为了对不同位置或者范围的共享进行区分,就引入名字域。既然用到变量名了,就涉及到了名字域的概念。这就是为什么会有scope 的概念。name_scope 作用域操作,variable_scope 可以通过设置reuse 标志以及初始化方式来影响域下的变量,因为想要达到变量共享的效果, 就要在 tf.variable_scope()的作用域下使用 tf.get_variable() 这种方式产生和提取变量. 不像 tf.Variable() 每次都会产生新的变量, tf.get_variable() 如果遇到了已经存在名字的变量时, 它会单纯的提取这个同样名字的变量,如果不存在名字的变量再创建.

例如:

输出:

2.name_scope()和variable_scope()区别

TF中有两种作用域类型: 命名域 (name scope),通过tf.name_scope() 或 tf.op_scope()创建; 变量域 (variable scope),通过tf.variable_scope() 或 tf.variable_op_scope()创建; 这两种作用域,对于使用tf.Variable()方式创建的变量,具有相同的效果,都会在变量名称前面,加上域名称。对于通过tf.get_variable()方式创建的变量,只有variable scope名称会加到变量名称前面,而name_scope()不会作为前缀。

举例1:

输出:

举例2:

输出:

总结:

1、name_scope()不会作为tf.get_variable()变量的前缀,但是会作为tf.Variable()的前缀。(举例1)

2、在variable_scope()的作用域下,tf.get_variable()和tf.Variable()都加了scope_name()前缀。因此,在tf.variable_scope()的作用域下,通过get_variable()可以使用已经创建的变量,实现了变量的共享,即可以通过get_variable()在tf.variable_scope()设定的作用域范围内进行变量共享。(举例2)

3、在重复使用的时候, 一定要在代码中强调 scope.reuse_variables()

参考链接:

[1] scope 命名方法 - Tensorflow | 莫烦Python

[2] tf.name_scope()和tf.variable_scope() - AI-FUTURE - CSDN博客
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
找专业防水队做完还漏水怎么维权 法院会受理房屋漏水造成的纠纷吗? 巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 建筑工程农民工在宿舍二楼吃晚饭喝多了,发生争吵,到走廊时坍塌四位工人... 从天津站到滨海机场正常情况多长时间?麻烦坐过的朋友说下,还有是坐大巴... 从天津车站到滨海机场最快捷的坐车方式是什么? 暗夜盗贼70后!怎么样赚钱最快还省时间 70级盗贼 怎么赚钱 设整型变量a,b的值均为5,则表达式(m=n=a++)/(n=b-2)的值是什么?_百度... 从未整容的女生和整容的女生放在一起对比,这样公平么? ppt标尺可以旋转吗 我把桌面上的"我的文档"删除了,怎么再把它弄出来啊 怎样用dos格式化c盘??? 怎么在dos系统下格式化c盘? ...图标不小心被删除了,回收站里也没有,怎么样恢复图标啊?(我是win7... ...我的电脑 我的文档 都不见了.注意是WIN7的.在桌面右键没有属性和个性... ...职场中什么样的人最容易被排挤?受到排挤应如何处理 有哪位师傅能帮我看看这个紫微命盘?请尽量中肯的描述一下,先谢谢... 6斤蚕丝被多少钱 win7系统重装怎样格式化c盘? Windows硬盘分区:通过命令行进行Diskpart 磁盘管理 桌面上的图标除了我的电脑我的文档和E都变成黑色块块该怎么复原?_百度... 如何格式化C盘?? tensorflowtf.variable和tf.get_variable的用法? Functions introduction 专业重不重要 急性胰腺炎患者饮食 TensorFlow 源码大坑(2) Session 在python中怎么将tensor转换为numpy数组? 胰腺炎出院一月后饮食禁忌 急性胰腺炎患者的饮食禁忌 tf.Session()提示module 'tensorflow' has no attribute 'Session... led灯珠p10和p100有什么区别吗 小野人怎样知道是P90灯珠 如何做一个合格的小学生 两点要求需知 hdmi- arc是什么? 家里蚊子太多,各种实用小妙招用起来,蚊子来一只灭一只,真管用_百度... 胰腺炎能不能吃葡萄?胰腺炎吃葡萄好不好? 胰腺炎如何饮食护理 佩乐能治疗慢乙肝,有哪些不良反应,安全性好不好? 胰腺炎的饮食要点有哪些? 达英-35的作用是什么 打针和输液的区别