我正在tensorflow.keras.layers.GRU
移动设备上实现 Keras GRU 模型 ( ) 用于字符级语言建模。为了有一个更小的设备检查点,我正在试验 8 位的 TFLite 和 CoreML 整数量化。问题在于,与 CoreML 压缩模型相比,TFLite 压缩模型在测试集上产生的准确率降低了 3%。测试集足够大,CoreML 模型结果非常接近完整的 32 位模型(或 16 位模型)。
这就是我为 TFLite 执行转换的方式(其中 model 是 type tf.keras.Model
):
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.experimental_new_converter = True
converter.experimental_new_quantizer = True
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converted = converter.convert()
我尝试过各种版本的 TensorFlow,包括 2.4.1、2.5.0 和 nightly。
这就是我为 CoreML 执行转换的方式(其中 model 是 type tf.keras.Model
):
import coremltools as ct
coreml_model = ct.convert(model, use_float_arraytype=True)
coreml_model = ct.models.neural_network.quantization_utils.quantize_weights(coreml_model, 8,
quantization_mode="linear")
TensorFlow Lite 不允许您指定量化模式,而 CoreML 允许您选择:(默认linear
)、、、、、。我尝试了所有这些,但是。我尝试过的所有结果都与未量化模型非常相似,除了.linear_lut
kmeans_lut
custom_lut
linear_symmetric
custom_lut
linear_lut
现在的问题是:为什么来自 TFLite 量化过程的模型比来自 CoreML 的几乎所有方法都要糟糕得多?有没有人经历过这种情况或有解决方法来提高 TFLite 量化的性能?
非常感谢你的帮助!
一些文档链接:
- TensorFlow 模型的 CoreML 转换:https ://coremltools.readme.io/docs/tensorflow-2
- TFLite量化通用页面:https ://www.tensorflow.org/lite/performance/post_training_quantization
- TFLite 量化规范:https ://www.tensorflow.org/lite/performance/quantization_spec