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

2024-09-27 19:18:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个密集的子层中有一个自定义层。我想能够命名这个子层的权重。然而,在子层初始值设定项上使用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。我意识到我可以先选择图层,然后选择权重(^{),但我不希望在我的应用程序中这样做

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


Tags: thenamebuildselfinput命名dddense
1条回答
网友
1楼 · 发布于 2024-09-27 19:18:44

如果需要子类层的名称,则需要包含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']  

希望这能回答你的问题,学习愉快

相关问题 更多 >

    热门问题