如何在不破坏结构的情况下重命名Keras模型的层?
因为我试图重命名给定模型的层(包括输入层) 以下最小示例显示了我当前方法(使用TensorFlow 2.3)遇到的错误:如何在不破坏结构的情况下重命名Keras模型的层?,keras,tf.keras,Keras,Tf.keras,因为我试图重命名给定模型的层(包括输入层) 以下最小示例显示了我当前方法(使用TensorFlow 2.3)遇到的错误: 从tensorflow.keras.models导入负荷模型 模型=负荷\模型(“模型h5”) 对于model.layers中的图层: 图层。_name=layer.name+“_重命名” model.to_json() 关于如何解决这个问题有什么想法吗?问题:Keras通过遍历层来序列化网络。_inbound_节点和模型。_network_节点;设置图层时,图层名称将保留
从tensorflow.keras.models导入负荷模型
模型=负荷\模型(“模型h5”)
对于model.layers中的图层:
图层。_name=layer.name+“_重命名”
model.to_json()
关于如何解决这个问题有什么想法吗?问题:Keras通过遍历
层来序列化网络。_inbound_节点
和模型。_network_节点
;设置图层时,图层名称将保留原始名称
解决方案:相应地重命名网络节点
。底部的工作功能,示例如下:
从tensorflow.keras.models导入负荷模型
从tensorflow.keras.layers导入输入,密集
从tensorflow.keras.models导入模型
ipt=输入((16,))
输出=密集(16)(ipt)
模型=模型(ipt,out)
model.compile('sgd','mse')
重命名(模型,模型层[1],“新名称”)
model.save('model.h5')
加载=加载\模型('model.h5')
注意:层。name
是一个没有.setter
的层,这意味着它不需要设置(很明显)。此外,它被覆盖,除了设置属性之外还执行其他步骤-可能是必要的,但无法确切确定它可能具有哪些其他效果。我已经包括了一个绕过这些的替代方案。充其量把这当作一个临时解决办法;我建议在Github上打开一个问题,因为API端的更改即将到期
功能:
并非万无一失——\u get\u node\u suffix
的命名逻辑需要工作(例如,密集型\u 1
可能与密集型\u 11
混淆)
def重命名(模型、图层、新名称):
def_get_node_后缀(名称):
对于旧\u节点中的旧\u名称:
如果旧的\u name.startswith(name):
返回旧名称[len(name):]
旧名称=layer.name
旧节点=列表(模型网络节点)
新的_节点=[]
对于model.layers中的l:
如果l.name==旧名称:
l、 \u name=新的\u名称
#vars(l)。uuu setitem_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu__
新节点。追加(新节点名称+\u获取节点后缀(旧节点名称))
其他:
新增节点。追加(l.name+\u获取节点\u后缀(l.name))
模型。\网络\节点=集合(新\节点)
与此同时,我以另一种方式解决了我原来的问题,即不重命名任何层,但了解如何使用重命名策略很有意思。
ValueError: The target structure is of type `<class 'tensorflow.python.framework.ops.Tensor'>`
Tensor("input_1:0", shape=(None, 4), dtype=float32)
However the input structure is a sequence (<class 'list'>) of length 0.