Keras 重命名模型和层

35

1) 我尝试在使用TF后端的Keras中重命名模型和层,因为我在一个脚本中使用多个模型。 类模型似乎具有模型名称属性model.name,但当我更改它时,会出现"AttributeError:无法设置属性"的错误。 问题出在哪里?

2) 此外,我正在使用顺序API,并且希望为层命名,这似乎可以通过Functional API完成,但我没有找到顺序API的解决方案。是否有人知道如何在顺序API中完成这一点?

更新至2): 对层进行命名是可行的,尽管似乎没有记录。只需添加参数name,例如model.add(Dense(...,...,name="hiddenLayer1")。注意,具有相同名称的层共享权重!


1
以下是有关更改模型名称的详细答案:https://dev59.com/Fbvpa4cB1Zd3GeqPCf5D#62728323 - Marco Cerliani
10个回答

46

如果您想要使用tf.keras更改模型层的名称,可以使用以下代码:

for layer in model.layers:
    layer._name = layer.name + str("_2")

我在使用双输入模型时也遇到了"AttributeError: can't set attribute"的问题。原因是有一个不可见的隐藏属性_name导致了冲突。


1
谢谢。我使用了 ._name 而不是 .name,它可以工作。 - N.IT
仍可在TF 2.3中使用tf.keras。虽然也可以使用RNN单元实现,但请注意,如果移除原始名称的后缀(例如rnn_layer_3中计算层编号的整数),则双向层和其他一些内容可能会出现轻微错误。 - runDOSrun
即使现在它运行正常:这不是一个公共API,如果开发人员更改底层实现,它可能会静默失败。此外,在训练后保存模型时未重命名层权重的名称可能会导致冲突。 - Max J
这是因为Keras通过遍历layer._inbound_nodes并与model._network_nodes进行比较来序列化网络;设置layer._name后,它将保留原始名称。请参见此处的解决方案以更改模型网络节点: https://dev59.com/ILzpa4cB1Zd3GeqPPrG-#63414614 - msarafzadeh
小心使用这种方法,这可能会损坏model.save()方法。我得使用model.save_weights()作为一种解决方法。 - Manuel V. Battan

33

不再适用于tf2+版本

关于模型名称的第一个问题在我的电脑上无法重现。 我可以像这样设置它。很多时候,这些错误是由软件版本引起的。

model=Sequential()
model.add(Dense(2,input_shape=(....)))
model.name="NAME"

关于给层命名,在Sequential模型中可以这样做

model=Sequential()
model.add(Dense(2,input_shape=(...),name="NAME"))

最新解决方案

使用 _name


谢谢你的回答!正如更新中所说,我已经找到了图层的解决方案。但是model.name仍然无法工作。还是非常感谢你,我相信你的答案是正确的! - user3921232
1
model.name 使用了属性装饰器,无法被覆盖。然而,属性 model._name 可以被覆盖。 - NameVergessen

13

在TF2.2.0中重命名keras模型的方法如下:

model._name = "newname"

我不确定这是否是个好主意-官方似乎不希望你这么做,但它确实有效。为了确认,调用model.summary(),你会看到新的模型名称。


11

用户239457的答案仅适用于标准Keras

如果你想使用Tensorflow Keras,可以这样做:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model = Sequential(name='Name')
model.add(Dense(2,input_shape=(5, 1)))

4

如果您正在使用Keras功能API,可以通过以下方式定义模型和层名称,以涵盖所有选项:

inputs = Input(shape=(value, value))

output_layer = Dense(2, activation = 'softmax', name = 'training_output')(dropout_new_training_layer)

model = Model(inputs= inputs, outputs=output_layer, name="my_model")

4

要在模型中仅更改一个层的名称,您可以使用以下行:

my_model.layers[0]._name = 'my_new_name_for_the_first_layer'
my_model.layers[1]._name = 'my_new_name_for_the_second_layer'
my_model.layers[-1]._name = 'my_new_name_for_the_last_layer'

1
为了改变Tensorflow Keras上预训练模型的层名称,解决方案会比较复杂。其他答案提出的简单方法 layer.name = "new_name"layer._name = "new_name" 并不能奏效。这篇博客文章提供了适用于该情况的解决方案。

0

0
正如作者所指出的那样,如果您希望多次使用自定义层,仅仅更改名称是不够的。这是我提供的一个临时但非常可行的解决方案。请随意复制/粘贴:
def name_custom_activation(activation):
    """ Currently, the Tensorflow library does not provide auto
        incrementation for custom layer names. Tensorflow Graphs
        requires each layer to have a unique name. Manually 
        incrementing layer names is annoying. The following trick 
        is the best method to change a layer name. It is especially 
        useful when using tf.keras.utils.plot_model to look at 
        synergistic activation models.
    """

    class_name = tf.keras.layers.Activation.__name__
    tf.keras.layers.Activation.__name__ = f'Activation_{activation.__name__}'
    activation_layer = tf.keras.layers.Activation(activation)
    tf.keras.layers.Activation.__name__ = class_name
    return activation_layer

在绘制模型的图表时,它看起来像这样:
def my_custom_activation(x): 
    return ... # Create your own activation function.

def create_model():
    return ... # Add your own model, which uses your custom activation.

model = create_model()
tf.keras.utils.plot_model(model, show_shapes=True)

Example of the tf.keras.utils.plot_model displaying the custom name as desired.


-4

对于第一点,我认为你可以构建另一个模型,名称正确且与现有模型结构相同。然后将现有模型的层权重设置到新模型的层。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接