python - 我使用 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 机器学习工具包的服务器。
我怎么能:
减小当前
.tflite
模型的大小,即 159MB(例如使用工具),还是在删除当前
.tflite
159MB 的模型后,将.h5
模型转换为更轻的.tflite
模型(例如使用工具)?
相关问题
如何减小我从 keras 转换的 .tflite 的大小:没有答案,但有一条评论告诉使用converter.post_training_quantize=True
. 但是,正如我解释的那样,这个解决方案似乎不适用于我的情况。
解决方案
通常,量化意味着从 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 是输入层的名称(注意:模型必须包含图形配置和权重。)
推荐阅读
- android - Hilt ViewModel 构造函数在导航组件范围内不起作用
- mysql - 我需要在 Gorm 中关闭连接吗?
- c++ - 给定子字符串和索引,重新组装可能重叠的字符串片段
- reactjs - React Leaflet:无法加载源图
- python - 网页抓取 - 如何找到与非 HTML 元素关联的路径
- php - 我需要更改什么以及如何更改才能成功生成完整的填字游戏(回溯和递归)?
- java - Android:不同导航图java/kotlin的不同ViewModel实例
- python - 如何检查字符串中是否有字符?
- java - 如何使 ANTLR 使用递归消耗所有可用元素?
- javascript - Vue.Js中Microsoft Graph API日历列表视图数据可以在前端使用什么样的分页