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

M1 Mac下Tensorflow-Keras跨文件加载已保存模型报错如何解决

错误根因

报错的核心是输入数据类型与模型保存的调用签名要求不匹配:

  • MNIST数据集加载的原始图像数据是uint8类型(取值范围0~255)
  • 你保存的SavedModel格式的模型,输入签名要求接收float32类型的张量
  • 同文件内加载时TensorFlow会复用运行时上下文做隐式类型转换,不会触发校验;独立文件加载时SavedModel的签名校验是严格模式,因此报错。
run_test.py修复方案

只需要在调用predict前,将输入数据转换为float32类型即可,修改后的代码如下:

import tensorflow as tf
import numpy as np

mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 新增:转换输入数据类型为float32
x_test = x_test.astype(np.float32)

new_model = tf.keras.models.load_model('num_reader_basic.model')
predictions = new_model.predict(x_test)
print(np.argmax(predictions[0]))
其他模型加载方案
  • 方案1:训练时改用HDF5格式保存模型,该格式仅保存模型结构和权重,无严格调用签名校验,无需手动转换输入类型
    训练代码修改保存逻辑:
    # 替换原来的model.save行
    model.save('num_reader_basic.h5')
    
    加载代码直接读取h5文件即可:
    new_model = tf.keras.models.load_model('num_reader_basic.h5')
    
  • 方案2:推理时实时转换输入类型,无需修改加载和数据预处理逻辑:
    predictions = new_model.predict(tf.cast(x_test, tf.float32))
    
  • 方案3:加载模型后重新编译,重置调用签名校验规则:
    new_model = tf.keras.models.load_model('num_reader_basic.model')
    new_model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 16:06:02