【问题标题】:Wildly different quantization performance on tensorflow-lite conversion of keras-trained DenseNet modelskeras 训练的 DenseNet 模型的 tensorflow-lite 转换的量化性能差异很大
【发布时间】:2018-10-29 17:34:43
【问题描述】:

我有两个使用 Keras 训练过的模型。这两个模型使用相同的架构(来自keras_applications.densenet 包的 DenseNet169 实现),但是它们各自具有不同数量的目标类(一种情况下为 80,另一种情况下为 200)。

  • 将两个模型转换为 .pb 格式效果很好(推理性能相同)。我使用位于https://github.com/amir-abdi/keras_to_tensorflowkeras_to_tensorflow 实用程序

  • 使用 TOCO 将两个模型转换为 .tflite 格式效果很好(同样,推理性能相同)。

  • 在 TOCO 中使用量化将 80 类模型转换为 .tflite 效果相当好(前 3 名准确度下降

  • 在 TOCO 中使用量化将 200-class 模型转换为 .tflite 偏离了轨道(前 3 位准确度下降了约 30%)。

我对两个模型都使用了与 TOCO 相同的命令行:

toco --graph_def_file frozen_graph.pb \ --output_file quantized_graph.tflite \ --inference_type FLOAT \ --inference_input_type FLOAT \ --output_format TFLITE \ --input_arrays input_1 \ --output_arrays output_node0 \ --quantize True

我的 tensorflow 版本是 1.11.0(通过 pip 在 macOS Mojave 上安装,尽管我也在用于训练的 Ubuntu 机器上尝试了相同的命令/环境,但结果相同)。

我完全不知道为什么一个模型的推理准确性会受到如此大的影响,而不是另一个模型。这适用于相同的两个架构/目标类组合的许多不同训练。我觉得我一定错过了什么,但我很困惑。

【问题讨论】:

    标签: tensorflow machine-learning keras tensorflow-lite toco


    【解决方案1】:

    这只是一个小小的偷偷摸摸的评论,因为我不确定这是否有帮助,但是它太长了,我决定把它作为一个答案...... p>


    我的猜测是准确率下降可能是由您的网络输出的方差引起的。量化后(顺便说一句,tensorflow 使用fixed-point quantization),您只使用256 点(8 位)而不是float32 的完整密集范围。

    在网络上的大多数博客上,都指出 量化 的主要假设是权重和激活值往往位于一个小范围内。然而,有一个隐含的假设在博客和文献中很少被提及:单个样本上的网络激活应该适当地分布在量化范围内

    考虑以下场景,其中假设成立(特定层的单个样本的激活直方图,垂直线是量化点):

    现在考虑第二个假设不正确,但第一个假设仍然存在的场景(蓝色是整体价值分布,灰色是给定样本, 竖条是量化点):

    在第一个场景中,给定样本的分布被很好地覆盖(有很多量化点)。在第二个中,只有 2 个量化点。 类似的事情也可能发生在您的网络上:也许对于 80 个类,它仍然有足够的量化点来区分,但是对于 200 个类,我们可能没有足够的量化点......

    嘿嘿,不过不影响1000个类的MobileNet,甚至MobileNetV2,哪个是残差?

    这就是为什么我称之为“疯狂的猜测”。也许 MobileNet 和 MobileNetV2 没有 DenseNet 那样宽的输出方差。前者在每一层只有一个输入(已经被 BN 归一化),而 DenseNet 在所有地方都有连接,因此它可以有更大的方差以及对微小变化的敏感性,而 BN 可能没有多大帮助。


    现在,试试这个清单:

    • TensorFlow 上手动收集 80 和 200 个模型的激活统计信息,不仅包括输出,还包括内层。价值观是集中在一个领域还是广泛传播?
    • 看看 TensorFlow 模型的单输入激活是否能很好地展开,或者我们可能会因为它集中在一个地方而遇到一些问题?
    • 最重要的是:看看 Quantized TF-Lite 模型的输出是什么?如果上面描述的方差存在问题,这里是最能体现出来的地方。

    PS:也请分享你的结果,我想很多人会对解决量化问题感兴趣:)

    【讨论】:

    • 感谢周到的回复!我投了赞成票,但暂时不接受。当我有机会尝试您的建议时,我一定会更新。
    • 感谢您的洞察力,似乎值得研究!您是否还有关于如何执行您建议的属性的建议?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2017-11-11
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多