如何将含自定义dice_coef指标的Keras模型存入.h5文件?
Keras .h5模型能否保存自定义指标的问题
核心结论
没法把dice_coef这类自定义函数的代码直接存入.h5模型文件,加载时必须通过custom_objects参数传入该函数的定义。
为什么存不了?
.h5格式的模型文件只存储三类内容:
- 模型的层级结构(比如卷积层、全连接层的类型和参数设置)
- 训练好的权重数值
- 优化器的状态(如果开启保存的话)
它不支持存储自定义Python函数的代码本身,因为这些函数是运行时的Python逻辑,无法直接序列化到.h5这种二进制文件中。
简化加载流程的替代方案
虽然不能把函数存进.h5,但可以用以下方法让加载模型更方便:
1. 把自定义函数单独存为Python文件
新建一个custom_metrics.py文件,把dice_coef的代码放进去:
import tensorflow.keras.backend as K def dice_coef(y_true, y_pred): y_true_f = K.flatten(y_true) y_pred_f = K.flatten(y_pred) intersection = K.sum(y_true_f * y_pred_f) return (2. * intersection + K.epsilon()) / (K.sum(y_true_f) + K.sum(y_pred_f) + K.epsilon())
加载模型时,直接从这个文件导入函数即可:
from custom_metrics import dice_coef from tensorflow.keras.models import load_model model = load_model('modelo_ia_1.h5', custom_objects={"dice_coef": dice_coef})
这样不用每次复制函数代码,只要保证custom_metrics.py和加载代码在同一目录就行。
2. 改用SavedModel格式(TF2.x官方推荐)
TensorFlow 2.x更推荐使用SavedModel格式(不是.h5文件,是一个文件夹),它可以把模型结构、权重,以及符合序列化要求的自定义函数信息一起保存。操作步骤:
- 先把
dice_coef改成TensorFlow原生操作兼容的版本(替换Keras后端的API为TF原生API):
import tensorflow as tf def dice_coef(y_true, y_pred): y_true_f = tf.flatten(y_true) y_pred_f = tf.flatten(y_pred) intersection = tf.reduce_sum(y_true_f * y_pred_f) return (2. * intersection + tf.keras.backend.epsilon()) / (tf.reduce_sum(y_true_f) + tf.reduce_sum(y_pred_f) + tf.keras.backend.epsilon())
- 保存模型时不用加.h5后缀:
model.save('modelo_ia_1') # 会生成名为modelo_ia_1的文件夹
- 加载模型时直接调用,无需传
custom_objects:
model = tf.keras.models.load_model('modelo_ia_1')
这个方法更适配TF2.x的生态,能避免每次加载都要处理自定义对象的麻烦,你的TensorFlow 2.10.1完全支持该格式。
内容的提问来源于stack exchange,提问作者aranca25
相关产品推荐
相关产品推荐

