首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TensorFlow模型在训练后量化后仍然是浮点。

TensorFlow模型在训练后量化后仍然是浮点。
EN

Stack Overflow用户
提问于 2018-10-17 08:04:09
回答 1查看 1.2K关注 0票数 2

在应用训练后量化后,我定制的CNN模型被缩小到原来大小的1/4 (从56.1MB减少到14 my )。我将将要预测的图像(100x100x3)作为ByteBuffer字节放入100x100x3=30,000中。但是,在推理过程中,我得到了以下错误:

代码语言:javascript
复制
java.lang.IllegalArgumentException: Cannot convert between a TensorFlowLite buffer with 120000 bytes and a ByteBuffer with 30000 bytes.**
        at org.tensorflow.lite.Tensor.throwExceptionIfTypeIsIncompatible(Tensor.java:221)
        at org.tensorflow.lite.Tensor.setTo(Tensor.java:93)
        at org.tensorflow.lite.NativeInterpreterWrapper.run(NativeInterpreterWrapper.java:136)
        at org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:216)
        at org.tensorflow.lite.Interpreter.run(Interpreter.java:195)
        at gov.nih.nlm.malaria_screener.imageProcessing.TFClassifier_Lite.recongnize(TFClassifier_Lite.java:102)
        at gov.nih.nlm.malaria_screener.imageProcessing.TFClassifier_Lite.process_by_batch(TFClassifier_Lite.java:145)
        at gov.nih.nlm.malaria_screener.Cells.runCells(Cells.java:269)
        at gov.nih.nlm.malaria_screener.CameraActivity.ProcessThinSmearImage(CameraActivity.java:1020)
        at gov.nih.nlm.malaria_screener.CameraActivity.access$600(CameraActivity.java:75)
        at gov.nih.nlm.malaria_screener.CameraActivity$8.run(CameraActivity.java:810)
        at java.lang.Thread.run(Thread.java:762) 

模型的输入图像大小为: 100x100x3。我现在一次只能预测一幅图像。所以,如果我要创建Bytebuffer: 100x100x3 = 30,000字节。但是,上面的日志信息显示TensorFlowLite缓冲区有12万字节。这使我怀疑转换后的tflite模型仍然是浮点数格式。这是预期的行为吗?我怎样才能像在示例中一样,从TensorFlow官方存储库中获得一个量化的模型,以获取8点精度的输入图像?

在示例代码中,用于输入ByteBuffer ()的tflite.run()对于量化模型来说具有8位精度。

但我也从google文档中读到:“根据推断,权重从8位精度转换为浮点,并使用浮点内核计算。”这两个例子似乎相互矛盾。

代码语言:javascript
复制
private static final int BATCH_SIZE = 1;

private static final int DIM_IMG_SIZE = 100;

private static final int DIM_PIXEL_SIZE = 3;

private static final int BYTE_NUM = 1;

imgData = ByteBuffer.allocateDirect(BYTE_NUM * BATCH_SIZE * DIM_IMG_SIZE * DIM_IMG_SIZE * DIM_PIXEL_SIZE);
imgData.order(ByteOrder.nativeOrder());

... ...

int pixel = 0;

        for (int i = 0; i < DIM_IMG_SIZE; ++i) {
            for (int j = 0; j < DIM_IMG_SIZE; ++j) {

                final int val = intValues[pixel++];

                imgData.put((byte)((val >> 16) & 0xFF));
                imgData.put((byte)((val >> 8) & 0xFF));
                imgData.put((byte)(val & 0xFF));

//                imgData.putFloat(((val >> 16) & 0xFF) / 255.0f);
//                imgData.putFloat(((val >> 8) & 0xFF) / 255.0f);
//                imgData.putFloat((val & 0xFF) / 255.0f);

            }
        } 

... ...

tfLite.run(imgData, labelProb);

训练后量化码:

代码语言:javascript
复制
import tensorflow as tf
import sys
import os

saved_model_dir = '/home/yuh5/Downloads/malaria_thinsmear.h5.pb'

input_arrays = ["input_2"]

output_arrays = ["output_node0"]

converter = tf.contrib.lite.TocoConverter.from_frozen_graph(saved_model_dir, input_arrays, output_arrays)

converter.post_training_quantize = True

tflite_model = converter.convert()
open("thinSmear_100.tflite", "wb").write(tflite_model)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-24 14:33:46

训练后量化不会改变输入或输出层的格式。您可以使用用于培训的相同格式的数据运行模型。

您可能会考虑量化感知的培训,以产生完全量化的模型,但我没有经验。

至于“在推理时,权重从8位精度转换为浮点,并使用浮点核计算。”这意味着权重被“去量化”到内存中的浮点值,并使用FP指令计算,而不是执行整数运算。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52850039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档