当前位置: 首页 > 知识库问答 >
问题:

使用8位量化将Keras MobileNet模型转换为TFLite

俞博涛
2023-03-14

我已经使用Keras来微调MobileNet v1。现在我有Model. h5,我需要将其转换为TensorFlow Lite,以便在Android应用程序中使用。

我使用TFLite转换脚本TFLite\u convert。我可以在没有量化的情况下进行转换,但我需要更高的性能,所以我需要进行量化。

如果我运行此脚本:

tflite_convert --output_file=model_quant.tflite \
 --keras_model_file=model.h5 \
 --inference_type=QUANTIZED_UINT8 \
 --input_arrays=input_1 \
 --output_arrays=predictions/Softmax \
 --mean_values=128 \
 --std_dev_values=127 \
 --input_shape="1,224,224,3" 

它失败了:

F tensorflow/contrib/lite/toco/tooling\u util。cc:1634]Array conv1_relu/Relu6是产生输出数组conv_dw_1_relu/Relu6的DepthwiseConv运算符的输入,缺少量化所需的最小/最大数据。如果准确性很重要,可以针对非量化输出格式,或者从浮点检查点使用模型运行量化训练,以更改输入图以包含最小/最大信息。如果您不关心准确性,可以传递--default\u ranges\u min=和--default\u ranges\u max=以便于实验。\nAborted(堆芯转储)\n“

如果我使用default\u ranges\u mindefault\u ranges\u max(称为“虚拟量化”),它可以工作,但它只用于调试性能,而没有错误日志中描述的准确性。

那么,我需要做些什么来使Keras模型正确量化呢?我需要找到最好的default_ranges_mindefault_ranges_max吗?怎样?还是关于Keras训练阶段的变化?

库版本:

Python 3.6.4
TensorFlow 1.12.0
Keras 2.2.4

共有1个答案

岳鸿畴
2023-03-14

不幸的是,Tensorflow还没有为flatbuffer(tflite)中的每层训练后量化提供工具,而只是在protobuf中。现在唯一可用的方法是在图形中引入伪量化层,并在序列或校准集上重新训练/微调模型。这被称为“量化感知训练”。

一旦引入了伪量化层,您就可以为训练集提供反馈,TF将在前馈上使用它们作为模拟量化层(表示8位值的fp-32数据类型),并使用全精度值进行反向传播。这样,您就可以恢复量化造成的精度损失。

此外,fakeQuant层将通过移动平均值捕获每层或每通道的范围,并将其存储在最小/最大变量中。

稍后,您可以通过freeze_graph工具提取图定义并删除fakeQuant节点。

最后,可以将模型输入tf_-lite_转换器(交叉手指,它不会制动)并提取具有捕获范围的u8_-tflite。

谷歌提供了一份非常好的白皮书,解释了所有这些:https://arxiv.org/pdf/1806.08342.pdf

希望有帮助。

 类似资料:
  • 所以,我创建一个图形Bash PS1生成器使用Javascript。用户可以从调色板(jsColor库)中为他们想要的任何元素选择任何颜色。我得到的值是该颜色的RGB代表。我想将该值转换为0-255之间的数字,以便在Bash中表示。 示例: 输入:#000000 输出:0 输入:#FFFFFF 输出: 255 转换为最接近的8位表示形式的任何其他输入 **我检查了这篇文章,但答案不太起作用(我得到

  • 我已经使用tensorflow后端训练了一个DNN,我想在FireBase中托管它。训练好的模型被保存为.meta文件,我尝试使用下面的代码将模型转换为tflite,但我遇到了一些错误。那么我如何将这个模型转换成Tensorflow Lite呢?

  • 更新2:XSSFWorkbook不提供对调色板的访问,因此我要问以下问题:访问XSSFWorkbook中的调色板

  • 我试图按照张量流量化中的说明来生成一个量化的张量流精简版模型。 首先,我使用tf。contrib。量化。创建_training_graph()和tf。contrib。量化。在我的训练过程中创建_eval_graph(),将伪量化节点插入到图形中,并最终生成一个冻结的pb文件(model.pb)。 其次,我使用以下命令将我的伪量化tensorflow模型转换为量化tensorflow lite模型。

  • 问题内容: 我有一个返回的接口。 我想使用Java 8 Stream API处理该结果。 但是Iterable不能“流式传输”。 任何想法如何将Iterable用作流而不转换为List? 问题答案: 有一个比直接使用更好的答案,这既简单又得到更好的结果。 Iterable有一个方法,所以你应该使用该方法来获取分离器。在最坏的情况下,它是相同的代码(默认实现使用),但是在更常见的情况下,你已经是一个

  • 问题内容: 我已阅读以下有关通过GoogleDocs将UTF-8编码的(希伯来语)XLS转换为CSV的建议,并且可以正常工作。当我在Sublime2中使用utf8编码打开CSV时,希伯来语正确显示。但是,当我尝试使用SQLyog将数据导入到我的数据库中时,在确保将我的目标表和导入定义都设置为UTF8之后,我变得很乱,例如: ⒚椔 我哪里出问题了? 问题答案: 从excel导出到csv的最佳方法是: