加载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
相关产品推荐
相关产品推荐

