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

TensorFlow加载模型报错:无法定位'mse'函数的原因求助

加载双向LSTM模型时出现TypeError:找不到mse函数

问题场景

构建双向LSTM模型的代码:

model = Sequential()
model.add(Bidirectional(LSTM(128, return_sequences=True), input_shape=(X.shape[1], X.shape[2])))
model.add(Dropout(0.2))
model.add(Bidirectional(LSTM(50)))
model.add(Dropout(0.2))
model.add(Dense(1))  # Output: 1 nilai (Close price)

model.compile(optimizer='adam', loss='mse', metrics=['mean_absolute_error'])

加载模型的代码:

def load_model_and_scalers():
    model = load_model("bilstm_model_3.h5", 
                    #    custom_objects={"mae": MeanAbsoluteError()}
                        )
    scaler_input = load("scaler_input_3.pkl")
    scaler_close = load("scaler_close_3.pkl")
    st.text(model.summary())
    return model, scaler_input, scaler_close

出现的错误信息:

TypeError: Could not locate function 'mse'. Make sure custom classes are decorated with `@keras.saving.register_keras_serializable()`. Full object config: {'module': 'keras.metrics', 'class_name': 'function', 'config': 'mse', 'registered_name': 'mse'}
WARNING:tensorflow:From D:\Dokumen\UMJ\Skripsi\Asli\myenv\lib\site-packages\keras\src\backend\common\global_state.py:82: The name tf.reset_default_graph is deprecated. Please use tf.compat.v1.reset_default_graph instead.

错误原因

  • 你使用字符串形式的loss='mse'和metrics=['mean_absolute_error']编译模型,在较新的Keras/TensorFlow版本中,这种字符串形式的损失/指标在模型序列化保存后,加载时可能无法正确映射到对应的内置函数,导致系统找不到mse函数。
  • 错误提示明确指向mse函数无法被定位,本质是模型保存时的序列化信息和加载时的函数解析不匹配。

解决办法

方法1:加载模型时显式指定custom_objects

在加载模型时,把字符串对应的损失和指标类明确传入custom_objects参数:

from keras.losses import MeanSquaredError
from keras.metrics import MeanAbsoluteError

def load_model_and_scalers():
    model = load_model("bilstm_model_3.h5", 
                       custom_objects={
                           "mse": MeanSquaredError(),
                           "mean_absolute_error": MeanAbsoluteError()
                       }
                   )
    scaler_input = load("scaler_input_3.pkl")
    scaler_close = load("scaler_close_3.pkl")
    st.text(model.summary())
    return model, scaler_input, scaler_close

方法2:重新训练时使用类形式的损失和指标

避免使用字符串形式,直接调用Keras的损失/指标类来编译模型,这样保存后的模型加载时无需额外指定custom_objects:

from keras.losses import MeanSquaredError
from keras.metrics import MeanAbsoluteError

model = Sequential()
model.add(Bidirectional(LSTM(128, return_sequences=True), input_shape=(X.shape[1], X.shape[2])))
model.add(Dropout(0.2))
model.add(Bidirectional(LSTM(50)))
model.add(Dropout(0.2))
model.add(Dense(1))  # Output: 1 nilai (Close price)

# 使用类形式替代字符串
model.compile(optimizer='adam', loss=MeanSquaredError(), metrics=[MeanAbsoluteError()])

内容的提问来源于stack exchange,提问作者user17319396

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:00:03