我在Dense子层中有一个自定义层。我希望能够命名该子层的权重。但是,在子层初始化器上使用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
。我意识到我可以先选择图层,然后选择权重(dd.dense1.weights
,然后 ,但是我不希望在我的应用程序中不这样做。
是否可以命名自定义图层的子图层的权重?
答案 0 :(得分:2)
如果要为子类图层命名,则需要包括name_scope
,然后为每个图层调用build
。
下面是修改后的代码,它将为输出中的每一层命名。
class DoubleDense(keras.layers.Layer):
def __init__(self, units, **kwargs):
self.dense1 = keras.layers.Dense(units)
self.dense2 = keras.layers.Dense(units)
super(DoubleDense, self).__init__( **kwargs)
def build(self, input_shape):
with tf.name_scope("first_dense"):
self.dense1.build(input_shape)
with tf.name_scope("second_dense"):
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/first_dense/kernel:0', 'double_dense/first_dense/bias:0', 'double_dense/second_dense/kernel:0', 'double_dense/second_dense/bias:0']
希望这能回答您的问题,快乐学习!