在自定义层中命名层的权重

我在密集子层中有一个自定义层。我希望能够命名这个子层的权重。但是,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),但我不想在我的应用程序中这样做。


有没有办法命名自定义层的子层的权重?


慕森王
浏览 108回答 1
1回答

慕森卡

如果您想要子类层的名称,则需要包含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 weightstrivial_input = tf.ones((1,10))output = dd(trivial_input)# Print the names of all variables in the DoubleDense layerprint([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']  希望这能回答你的问题,快乐学习!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python