gpt4 book ai didi

python - 命名自定义层中层的权重

转载 作者:行者123 更新时间:2023-12-04 14:16:18 26 4
gpt4 key购买 nike

我在 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),但我不想在我的应用程序中这样做。

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

最佳答案

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

希望这能回答您的问题,祝您学习愉快!

关于python - 命名自定义层中层的权重,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59984492/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com