Keras加载含coeff_determination指标模型传custom_objects仍报错如何解决
问题排查与解决方案
错误原因
你传入load_model的custom_objects参数字典结构不符合Keras的匹配规则:Keras加载时会直接以自定义对象的名称字符串作为键查找对应的实现,你当前将自定义指标放在metrics键下,Keras无法匹配到名为coeff_determination的对象,因此抛出未知指标错误。
修复方案
方案1:直接修正custom_objects字典结构
把你定义的dependencies变量修改为以下格式即可正常运行:
## metric function def coeff_determination(y_true, y_pred): SS_res = K.sum(K.square( y_true-y_pred )) SS_tot = K.sum(K.square( y_true - K.mean(y_true) ) ) return ( 1 - SS_res/(SS_tot + K.epsilon()) ) ## load models from file def load_all_models(n_models,Cus_bjects): all_models = list() for i in range(n_models): # define filename for this ensemble filename = 'snapshot_model_' + str(i + 1) + '.h5' # load model from file model = load_model(filename,custom_objects=Cus_bjects) # add to list of members all_models.append(model) print('>loaded %s' % filename) return all_models ## 修正后的依赖声明 dependencies = {'coeff_determination': coeff_determination} members = load_all_models(10,dependencies)
方案2:预先注册自定义对象(可选,避免每次加载传参)
如果不想每次加载模型都手动传入custom_objects,可以在定义自定义指标时添加注册装饰器,后续加载模型无需额外传参即可识别自定义指标:
import tensorflow as tf ## 注册后的自定义指标 @tf.keras.utils.register_keras_serializable() def coeff_determination(y_true, y_pred): SS_res = K.sum(K.square( y_true-y_pred )) SS_tot = K.sum(K.square( y_true - K.mean(y_true) ) ) return ( 1 - SS_res/(SS_tot + K.epsilon()) )
内容的提问来源于stack exchange,提问作者mohammad24
相关产品推荐
相关产品推荐

