首页 > 解决方案 > 我使用 TFLiteConvert post_training_quantize=True 但我的模型仍然太大而无法托管在 Firebase ML Kit 的自定义服务器中

问题描述

我写了一个 TensorFlow / Keras Super-Resolution GAN。我已使用以下代码将生成的训练.h5模型转换为模型,并在 Google Colab 中执行:.tflite

import tensorflow as tf
model = tf.keras.models.load_model('/content/drive/My Drive/srgan/output/srgan.h5')
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.post_training_quantize=True
tflite_model = converter.convert()
open("/content/drive/My Drive/srgan/output/converted_model_quantized.tflite", "wb").write(tflite_model)

正如你所看到的,我使用converter.post_training_quantize=True它来帮助输出.tflite比我的原始.h5模型大小更轻的模型,即 159MB。然而,生成的.tflite模型仍然是 159MB。

它太大了,我无法将它上传到 Google Firebase 控制台中的 Google Firebase 机器学习工具包的服务器。

我怎么能:

相关问题

如何减小我从 keras 转换的 .tflite 的大小:没有答案,但有一条评论告诉使用converter.post_training_quantize=True. 但是,正如我解释的那样,这个解决方案似乎不适用于我的情况。

标签: pythonfirebasetensorflowkerastensorflow-lite

解决方案


通常,量化意味着从 dtype float32 转移到 uint8。所以理论上我们的模型应该减少 4 的大小。这将在更大的文件中清晰可见。

使用工具“ https://lutzroeder.github.io/netron/ ”检查您的模型是否已量化。在这里,您必须加载模型并检查具有权重的随机层。量化图包含 uint8 格式的权重值 在未量化图中,权重值将采用 float32 格式。

仅设置“converter.post_training_quantize=True”不足以量化您的模型。其他设置包括:
converter.inference_type=tf.uint8
converter.default_ranges_stats=[min_value,max_value]
converter.quantized_input_stats={"name_of_the_input_layer_for_your_model":[mean,std]}

希望你正在处理图像。
min_value=0,max_value=255,mean=128(主观)和std=128(主观)。
name_of_the_input_layer_for_your_model= 在上述链接中加载模型时图形的名字,或者您可以通过代码获取输入层的名称“model.input”将给出输出“tf.Tensor ' input_1 :0' shape= (?, 224, 224, 3) dtype=float32"。这里 input_1 是输入层的名称(注意:模型必须包含图形配置和权重。)


推荐阅读