下面是一个代码片段,它尝试命名张量操作的结果 所以我可以在保存和恢复网络后访问它
def createForward(self):
# forward propogation
Z = tf.add(tf.matmul(self.W,self.prevLayer.A),self.b)
self.Z = tf.nn.dropout(Z,self.keepProb,name = self.name+'_Z')
print(self.name+'_Z',self.Z)
当self.name为'输出'我期待print语句打印出来
output_Z Tensor("output_Z:0", shape=(3, ?), dtype=float32)
我实际得到的是
output_Z Tensor("output_Z/mul:0", shape=(3, ?), dtype=float32)
有人可以解释发生了什么。
由于
答案 0 :(得分:0)
我认为您不熟悉的是TensorFlow中的操作命名。我们先来看看:
In [2]: import tensorflow as tf
In [4]: w = tf.Variable([[1,2,3], [4,5,6], [7,8,9], [3,1,5], [4,1,7]], dtype=tf.float32)
In [6]: z = tf.nn.dropout(w, 0.4, name="output_Z")
In [7]: z.op.name
Out[7]: u'output_Z/mul'
In [8]: z.name
Out[8]: u'output_Z/mul:0'
正如您所看到的,z的名称与操作z的名称不同,但所有这些名称都附加了操作名称mul
。
为了得到你所期望的,你可以这样做:
In [12]: Z = tf.identity(z, name="output_Z")
In [13]: Z.op.name
Out[13]: u'output_Z'
In [14]: Z.name
Out[14]: u'output_Z:0'
tf.variable_scope()
中的操作名称我们讨论了tf.variable_scope如何管理变量的名称。但 它如何影响范围内其他操作的名称?它是 自然,在变量范围内创建的操作也应该共享 那个名字。因此,当我们使用tf.variable_scope(“name”)时, 这隐式地打开了一个tf.name_scope(“name”)。例如:
with tf.variable_scope("foo"):
x = 1.0 + tf.get_variable("v", [1])
assert x.op.name == "foo/add"