我在一个密集的子层中有一个自定义层。我想能够命名这个子层的权重。然而,在子层初始值设定项上使用name="my_dense"
似乎不能做到这一点;权重仅以外部自定义层命名
为了说明这个问题,假设我想要一个自定义层,它只是堆叠两个密集层。我将打印此自定义层的权重名称
class DoubleDense(keras.layers.Layer):
def __init__(self, units, **kwargs):
self.dense1 = keras.layers.Dense(units, name="first_dense")
self.dense2 = keras.layers.Dense(units, name="second_dense")
super(DoubleDense, self).__init__(**kwargs)
def build(self, input_shape):
self.dense1.build(input_shape)
self.dense2.build(self.dense1.units)
def call(self, input):
hidden = self.dense1(input)
return self.dense2(hidden)
dd = DoubleDense(3)
# We need to evaluate the layer once to build the weights
trivial_input = tf.ones((1,10))
output = dd(trivial_input)
# Print the names of all variables in the DoubleDense layer
print([weight.name for weight in dd.weights])
输出如下:
['double_dense_1/kernel:0',
'double_dense_1/bias:0',
'double_dense_1/kernel:0',
'double_dense_1/bias:0']
…但我期待着更像这样的事情:
['double_dense_1/first_dense_1/kernel:0',
'double_dense_1/first_dense_1/bias:0',
'double_dense_1/second_dense_1/kernel:0',
'double_dense_1/second_dense_1/bias:0']
因此,Keras对这些权重的命名含糊不清;单凭一个重量张量的名称无法判断它是属于dd.dense1
还是dd.dense2
。我意识到我可以先选择图层,然后选择权重(^{
有没有办法命名自定义层的子层的权重
如果需要子类层的名称,则需要包含
name_scope
,然后为每个层调用build
下面是修改后的代码,它将给出输出中每个层的名称
输出:
希望这能回答你的问题,学习愉快
相关问题 更多 >
编程相关推荐