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

加载H5模型执行Quantization Aware Training触发ValueError问题排查

问题原因分析

你的问题出在Keras导入冲突和模型加载后的类型不兼容:

  • 代码中同时导入了from tensorflow import keras和import tf_keras as keras,导致命名空间混乱,保存的模型和加载的模型分属不同Keras框架(TensorFlow内置的tf.keras vs 独立Keras 3)。
  • TensorFlow Model Optimization 0.8.0对独立Keras 3的支持不完善,quantize_model只能识别tf.keras的Sequential/Functional模型,加载后的model1属于Keras 3模型,因此触发错误。
解决方案

1. 统一Keras导入

删除import tf_keras as keras,所有Keras相关操作都使用TensorFlow内置的tf.keras,避免框架冲突。

2. 对齐模型保存/加载API

确保保存和加载都使用tf.keras的API,保证模型类型一致。

修改后的完整代码

import numpy as np
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras import layers, regularizers, utils, losses

# 加载并预处理MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(60000, 784).astype('float32') / 255
x_test = x_test.reshape(10000, 784).astype('float32') / 255
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

num_classes = 10
y_train = utils.to_categorical(y_train, num_classes)
y_test = utils.to_categorical(y_test, num_classes)

# 构建Sequential模型
model = Sequential([
    layers.Dropout(0.2, input_shape=(784,)),
    layers.Dense(1000, kernel_regularizer=regularizers.l2(0.01), activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(1000, kernel_regularizer=regularizers.l2(0.01), activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(10, activation='softmax')
])

model.compile(loss=losses.categorical_crossentropy, 
              optimizer='adam', 
              metrics=['accuracy'])

# 训练模型
hist = model.fit(x_train, y_train,
                 batch_size=128,
                 epochs=1,
                 verbose=1,
                 validation_data=(x_test, y_test))

score = model.evaluate(x_test, y_test, verbose=1)
print("Test loss {:.4f}, accuracy {:.2f}%".format(score[0], score[1] * 100))

# 保存模型
model.save("model.h5")
print("Saved model.h5 to disk")


# 量化感知训练(直接基于内存模型)
import tensorflow_model_optimization as tfmot

print("\n\n\nDirect QAT")
quantize_model = tfmot.quantization.keras.quantize_model
q_aware_model = quantize_model(model)
q_aware_model.compile(loss=losses.categorical_crossentropy, 
                      optimizer='adam', 
                      metrics=['accuracy'])
q_aware_model.summary()


# 量化感知训练(从加载的模型)
print("\n\n\nQAT from loading model.h5")
# 使用tf.keras加载模型,确保模型类型为tf.keras.Sequential
model1 = tf.keras.models.load_model('model.h5')
q_aware_model1 = quantize_model(model1)
q_aware_model1.compile(loss=losses.categorical_crossentropy, 
                       optimizer='adam', 
                       metrics=['accuracy'])
q_aware_model1.summary()

额外注意事项

  • 你的环境中Keras 3.5.0是独立安装的,而TensorFlow 2.17自带了适配的tf.keras版本,混用两者会导致兼容性问题,优先使用TensorFlow内置的tf.keras。
  • TensorFlow Model Optimization 0.8.0建议搭配TensorFlow官方的tf.keras使用,避免与独立Keras版本混用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:25:53