为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森王 2022-07-12 17:55:48
我在密集子层中有一个自定义层。我希望能够命名这个子层的权重。但是,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 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_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),但我不想在我的应用程序中这样做。有没有办法命名自定义层的子层的权重?
查看完整描述

1 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

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

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


查看完整回答
反对 回复 2022-07-12
  • 1 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信