【问题标题】:Explanation of TensorflowLite inference official tutorialTensorflowLite inference官方教程讲解
【发布时间】:2020-12-04 19:44:02
【问题描述】:

我正在运行下面的 github 代码以在我的 Raspberry Pi 上进行推理。我已经成功地在我的 Pi 上运行了我的模型,尽管其中一个预测与非量化版本相比非常糟糕。 我研究了代码和库,但我很难理解 2 个小部分,我认为这会影响我的模型的性能。

Tensorflow 在 tflite 模型上运行推理的官方代码。 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/examples/python/label_image.py

这两部分是:

parser.add_argument(
      '--input_mean',
      default=127.5, type=float,
      help='input_mean')
  parser.add_argument(
      '--input_std',
      default=127.5, type=float,
      help='input standard deviation')

我无法理解这 2 个参数如何影响推理以及为什么在此命令中使用它们。 args 值应该如何改变输入数据。

if floating_model:
    input_data = (np.float32(input_data) - args.input_mean) / args.input_std

第二,什么时候是模型np.float32类型?量化模型不是 int 类型吗?

floating_model = input_details[0]['dtype'] == np.float32

【问题讨论】:

    标签: python tensorflow-lite inference quantization


    【解决方案1】:

    这两个参数如何影响推理

    均值和标准差的应用称为“归一化”。此操作需要更改输入数据的范围。在您的情况下,输入数据的范围为 0...255,而浮点模型需要范围 -1...1。这仅取决于模型、模型架构和用于训练的数据。以normalization parameters为例查看详细信息

    量化模型不是 int 类型吗?

    实际上有不同类型的量化(例如Float16),但最常见的与量化相关的类型是int8/uint8。 example 中提供的型号是 FP。使用https://netron.app/等应用检查您的模型输入输出

    最后:看起来 input_mean/input_std 更改已经很老了,对我来说,它们与他们提供的模型不匹配。根据您不需要归一化的模型,模型将 0...255 范围内的浮点值作为输入。

    【讨论】:

    • 感谢您的回答。因此,如果我的模型接受 0-255 范围内的值,我不能通过将输入除以 [0,1] 范围内的 255 来实现归一化吗?我怎么知道我的输入是否应该在 [-1,1] 或 [0,1] 范围内。经过反复试验,他们似乎都在工作,这并不奇怪
    • 如果输入模型需要范围 0...255,您实际上需要确保输入数据在该范围内:如果您的 FP 范围为 0..1,您应该将其标准化为范围(乘以255);如果你有整数 0...255,你很好,只需转换为类型;如果您已经在 0..255 范围内的 FP 中,则不需要标准化。输入信息可以在模型元数据(如我们的案例)或带有模型的补充文档中找到,规范化通常是预处理的一部分。
    • 关于 [-1, 1] 和 [0, 1]:这完全取决于模型需要什么以及它如何处理超范围值。示例:模型输入 [-1, 1],馈送图像 [0, 1] - 视为动态范围的减少,您的图像将“更亮”到网络。它可能对它不敏感。如果模型 [0, 1] 和饲料 [-1, 1] 值可以被限制,但仍然有 50% 的信息可用。它可以工作,但准确性会急剧下降。
    猜你喜欢
    • 1970-01-01
    • 2018-11-29
    • 2014-11-15
    • 2016-06-24
    • 1970-01-01
    • 2012-09-24
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多