You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:12:55