Python Keras重命名模型和图层

Python Keras重命名模型和图层,python,keras,Python,Keras,1) 我尝试用TF后端重命名Keras中的模型和层,因为我在一个脚本中使用多个模型。 类模型似乎具有属性Model.name,但当更改它时,我得到“AttributeError:无法设置属性”。 这里有什么问题 2) 另外,我使用的是顺序API,我想给层起个名字,这在函数API中似乎是可行的,但我没有找到顺序API的解决方案。anonye知道如何使用顺序API吗 更新至2):命名图层是可行的,尽管似乎没有记录在案。只需添加参数名称,例如model.add(稠密(…,…,name=“hiddenL

1) 我尝试用TF后端重命名Keras中的模型和层,因为我在一个脚本中使用多个模型。 类模型似乎具有属性Model.name,但当更改它时,我得到“AttributeError:无法设置属性”。 这里有什么问题

2) 另外,我使用的是顺序API,我想给层起个名字,这在函数API中似乎是可行的,但我没有找到顺序API的解决方案。anonye知道如何使用顺序API吗


更新至2):命名图层是可行的,尽管似乎没有记录在案。只需添加参数名称,例如model.add(稠密(…,…,name=“hiddenLayer1”)。注意,同名图层共享权重!

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

model=Sequential()
model.add(Dense(2,input_shape=(....)))
model.name="NAME"
至于命名层,您可以在如下顺序模型中进行命名

model=Sequential()
model.add(Dense(2,input_shape=(...),name="NAME"))
对于1),我认为您可以使用正确的名称和与现有模型相同的结构构建另一个模型。然后将现有模型层的权重设置为新模型层的权重。

from用户239457仅适用于

如果要使用,可以这样做:

从tensorflow.keras.models导入
从tensorflow.keras.layers导入稠密
模型=顺序(name='name')
添加(密集(2,输入_形状=(5,1)))

为了涵盖所有选项,关于问题的标题,如果您使用的是Keras functional API,您可以通过以下方式定义模型和层名称:

inputs=输入(形状=(值,值))
输出层=密集(2,激活='softmax',名称='training\u output')(辍学\u新建\u training\u层)
模型=模型(输入=输入,输出=输出层,name=“我的模型”)

要使用tf.keras更改model.layers的名称,可以使用以下行:

for layer in model.layers:
    layer._name = layer.name + str("_2")
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'
我在一个两输入模型的案例中需要这个,并遇到了“AttributeError:CannotSetAttribute”。问题是,存在一个潜在的隐藏属性_name,这导致了冲突

详细答案在这里

我们可以在开发模型并准备培训时使用
model.name=“model\u name”
。我们还可以为图层命名。例:

model = Sequential()
model.name = "My_Model" #Naming model
model.add(Dense(2,input_shape=(...),name="Name") #Naming layer

要在TF2.2.0中重命名keras模型,请执行以下操作:

model.\u name=“newname”


我不知道这是不是一个坏主意——他们似乎不想让你这么做,但确实有效。要确认,请调用
model.summary()
,您应该会看到新名称。

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

for layer in model.layers:
    layer._name = layer.name + str("_2")
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'

谢谢你的回答!正如在更新中已经说过的,我找到了该层的解决方案。但是model.name仍然不起作用。谢谢你,我想你的答案是正确的!下面是更改型号名称的详细答案:谢谢。。我使用了
\u name
而不是
.name
,它仍然可以在tf.keras和tf2.3中使用。虽然这也可以通过RNN单元实现,但请注意,如果删除原始名称的后缀(计算层编号的整数,例如RNN_layer_3),则双向层和其他一些东西可能会有一些问题。即使它现在可以工作:这不是一个公共API,如果开发人员更改底层实现,它可能会自动失败。此外,未重命名层权重的名称,这可能会在训练后保存模型时导致冲突。