我有一个非常简单的Tensorflow模型,它基于6个传感器的输入(输入范围从0.0到1.0)输出3个值(左,直,右)
inputSensor = Input(shape=(3))
modelSensor = Dense(32, activation="relu")(inputSensor)
modelSensor = Dense(32, activation="relu")(modelSensor)
modelSensor = Dense(numClasses, activation="softmax")(modelSensor)
model = Model(inputs=inputSensor, outputs=modelSensor)
训练模型后,我可以使用
将其转换为普通的TFLite模型converter = tf.compat.v1.lite.TFLiteConverter.from_keras_model_file("models/modelpath.h5")
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
然后,我在模型上运行了一些推理测试,得到了期望的结果。 3个输出之一 是99%,其他人非常低。
测试权 输入[0.0,0.0,1.0] 结果[[0.00089144 0.00154889 0.99755967]]
直接测试 输入[0.0,1.0,0.0] 结果[[0.00087439 0.996424 0.00270158]]
左测试 输入[1.0,0.0,0.0] 结果[[0.9948014 0.00256803 0.00263061]]
然后我对模型进行量化(以便在边缘TPU上使用)
converter =tf.compat.v1.lite.TFLiteConverter. from_keras_model_file
("models/modelpath.h5")
converter.representative_dataset = representativeDataset_gen
converter.target_spec.supported_ops =
[tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
converter.optimizations = [tf.lite.Optimize.DEFAULT]
,我进行了与上述相同的测试。结果仍然正确,但最大输出为132,其他输出为62。
测试权 输入[0.0,0.0,1.0] [[62 62 132]]
直接测试 输入[0.0,1.0,0.0] [[62 132 62]]
左测试 输入[1.0,0.0,0.0] [[132 62 62]]
我希望得到的结果范围为[[255 0 0]]
当我使用整数输入如 输入[0,0,255]
Quantazion转换是否有问题? 我应该使用浮点数的整数作为输入吗?
答案 0 :(得分:0)
在进行训练后量化时,小型模型肯定会遭受较大的精度下降。实际上,TensorFlow团队已建议在应用训练后量化后执行准确性检查。
如果准确性受到严重影响,建议使用quantization-aware-training
。
在撰写此答案时,尚未启动量化感知培训。
答案 1 :(得分:0)
我自己发现了问题。
我用于量化转换的代表性数据集不够代表性。它由零的数组组成。使用适当的数据集(与用于训练的数据集相同)固定输出-> [[255 0 0]]