使用tf.keras.load_model加载.h5模型时遇IndexError问题求助
加载含自定义层的Siamese模型时触发IndexError问题
我通过Model.save()成功训练并将Siamese模型保存至本地,随后尝试执行以下代码加载模型:
siamese_model = tf.keras.models.load_model('siamesemodelv2.h5',custom_objects={'L1Dist':L1Dist,'BinaryCrossentropy':tf.losses.BinaryCrossentropy})
加载时必须传入自定义的L1Dist层,该层代码如下:
from tensorflow.keras.layers import Layer # 注意:确保导入Layer基类 class L1Dist(Layer): # 初始化方法 - 继承自Layer def __init__(self, **kwargs): super().__init__() # 相似度计算逻辑 def call(self, input_embedding, validation_embedding): return tf.math.abs(input_embedding - validation_embedding)
运行加载代码时触发如下错误:
> File "c:/Users/xa3/Desktop/face-recogntion.py", line 383, in <module> siamese_model = tf.keras.models.load_model('siamesemodelv2.h5',custom_objects={'L1Dist':L1Dist,'BinaryCrossentropy':tf.losses.BinaryCrossentropy}) File "C:\Users\xa3\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\keras\utils\traceback_utils.py", line 70, in error_handler raise e.with_traceback(filtered_tb) from None File "C:\Users\xa3\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\keras\engine\functional.py", line 1392, in process_node inbound_node = inbound_layer._inbound_nodes[inbound_node_index] IndexError: list index out of range
恳请提供解决思路,感谢!
解决思路
补充自定义层的序列化方法:Keras加载模型时需要自定义层实现
get_config方法完成配置序列化,当前L1Dist类缺少该方法,导致模型无法正确重建。在L1Dist类中添加以下代码:def get_config(self): return super().get_config()若后续层添加了自定义参数,需在
get_config中返回这些参数的键值对。切换模型保存格式:Siamese属于多输入的复杂模型,HDF5格式对这类模型的兼容性不如SavedModel。训练后改用
model.save('siamesemodelv2')(不带.h5后缀)保存为SavedModel格式,加载时同样传入custom_objects参数即可。统一TensorFlow/Keras版本:训练和加载模型时使用的TensorFlow/Keras版本不一致可能引发序列化问题,确保两边版本匹配(Python3.7建议搭配TensorFlow 2.8.x等稳定兼容版本)。
验证模型构建逻辑:训练前测试模型的前向传播,确认
L1Dist层的输入连接逻辑正确,避免因模型结构异常导致保存后无法加载。
内容的提问来源于stack exchange,提问作者BlaCK _ WolF
相关产品推荐
相关产品推荐

