Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不破坏结构的情况下重命名Keras模型的层?_Keras_Tf.keras - Fatal编程技术网

如何在不破坏结构的情况下重命名Keras模型的层?

如何在不破坏结构的情况下重命名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 2.3)遇到的错误:

从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.