关于tensorflow中变量作用域的名称

关于tensorflow中变量作用域的名称,tensorflow,Tensorflow,最近我一直在尝试学习使用TensorFlow,但我不知道变量作用域是如何工作的。特别是,我有以下问题: 将tensorflow导入为tf 从tensorflow.models.rnn导入rnn\u单元 从tensorflow.models.rnn导入rnn 输入=[tf.placeholder(tf.float32,shape=[10,10]),用于范围(5)] 单元=rnn_单元。基本单元(10) 输出,状态=rnn.rnn(单元格,输入,数据类型=tf.float32) 打印输出[2]。名称

最近我一直在尝试学习使用TensorFlow,但我不知道变量作用域是如何工作的。特别是,我有以下问题:

将tensorflow导入为tf
从tensorflow.models.rnn导入rnn\u单元
从tensorflow.models.rnn导入rnn
输入=[tf.placeholder(tf.float32,shape=[10,10]),用于范围(5)]
单元=rnn_单元。基本单元(10)
输出,状态=rnn.rnn(单元格,输入,数据类型=tf.float32)
打印输出[2]。名称
#==>u'RNN/BasicLSTMCell\u 2/mul\u 2:0'
'BasicLSTMCell\u 2'
中的
'u 2'
来自哪里?当以后使用
tf.get_variable(reuse=True)
再次获取相同的变量时,它是如何工作的

编辑:我想我发现了一个相关的问题:

def创建:
使用tf.variable_scope('test'):
使用tf.variable_scope('inner'):
a=tf.get_变量[1])
归还
def创建_模块:
使用tf.variable_scope('test'):
使用tf.variable_scope('inner'):
a=tf.Variable(0.0,name=s)
归还
tf.ops.reset_default_graph()
a=创建('a')
b=创建_mod('b'))
c=创建('c')
d=创建_mod('d'))
打印a.name,'\n',b.name,'\n',c.name,'\n',d.name
输出是

测试/内部/a:0
测试单元1/内部/b:0
测试/内部/c:0
测试_3/内部/d:0
我很困惑…

“BasicLSTMCell\u 2”
中的
“\u 2”
与创建op
输出[2]
的位置相关。每次创建新的名称范围(带)或变量范围(带)时,都会根据给定字符串向当前名称范围添加一个唯一的后缀,可能还会添加一个额外的后缀以使其唯一。对
rnn.rnn(…)
的调用具有以下伪代码(为了清晰起见,简化并使用公共API方法):

输出=[]
使用tf.variable_scope(“RNN”):
对于时间步,在枚举中输入(输入):
如果时间步长>0:
tf.get_variable_scope().重用_variables()
使用tf.variable_作用域(“BasicLSTMCell”):
输出。追加(…)
返回输出
如果查看
输出
中的张量名称,您将看到它们如下所示:

>打印[o.输出中o的名称]
[u'RNN/BasicLSTMCell/mul_2:0',
u'RNN/BasicLSTMCell_1/mul_2:0',
u'RNN/BasicLSTMCell_2/mul_2:0',
u'RNN/BasicLSTMCell_3/mul_2:0',
u'RNN/BasicLSTMCell_4/mul_2:0']
输入新名称范围(通过输入或块)时,TensorFlow会为范围创建一个新的唯一名称。第一次输入
“BasicLSTMCell”
作用域时,TensorFlow会逐字使用该名称,因为它以前从未使用过(在
“RNN/”
作用域中)。下一次,TensorFlow会在作用域中添加
“\u 1”
,使其唯一,依此类推,直到
“RNN/BasicLSTMCell\u 4”


变量作用域和名称作用域之间的主要区别在于,变量作用域还具有一组名称到-绑定。通过调用
tf.get\u variable\u scope().reuse\u variables()
,我们指示TensorFlow在时间步0之后为
“RNN/”
作用域(及其子对象)重用变量,而不是创建变量。这确保了权重在多个RNN单元之间正确共享。

上述答案在某种程度上是误导性的

让我来回答为什么您有两个不同的作用域名称,尽管看起来您定义了两个相同的函数:
creating
creating_mod

这只是因为您使用了
tf.Variable(0.0,name=s)
在函数
creating_mod
中创建变量

如果希望变量被范围识别,请始终使用
tf.get_variable

请查看此以了解更多详细信息


谢谢

你能指出使用tf.name\u作用域的确切代码行吗?我只能在rnn_cell.py中找到带有tf.variable_scope(scope或type(self)的
):#“BasicLSTMCell”
有两个位置:顶级(
“rnn”
)作用域()和嵌套(
“BasicLSTMCell”
)作用域()。请注意,调用
variable\u scope()
意味着调用
name\u scope()
(请参见实现)。我编辑了答案,以便更清楚地说明在哪里使用
variable\u scope()
。Thx,我或多或少了解发生了什么。但我认为这也与如何创建变量有关。似乎
tf.get_variables
tf.Variable
生成变量名的方法不同。虽然
tf.get\u variables
创建了新的名称\u范围,但它仍然使用变量\u范围名称命名变量,不知何故…不应该
tf.variable\u范围(“basiclstcell”,reuse=True)
reuse=None
这样它就继承了外部范围的重用,并且能够在第一次运行时创建变量?我也遇到了这个问题。但是,即使总是使用tf.get_变量,我也会在变量中添加“_1”scope@mhz我还加了“_1”。在我的例子中,它来自训练和测试模型