【问题标题】:Understanding input and output of tflite model了解 tflite 模型的输入和输出
【发布时间】:2020-07-06 18:18:25
【问题描述】:

我是 Tensorflow 的新手,并试图将其整合到我的项目中。我正在使用带有摄像头的树莓派 pi4 来检测我的喂鸟器的变化,拍照,然后用 tensorflow 识别那只鸟。我正在使用Birds_V1 来完成此操作。

我很好奇如何解释输入和输出。根据概述,输入是:

预计为 224 x 224 大小的 3 通道 RGB 彩色图像,缩放为 [0, 1]。

我对缩放到 [0,1] 的含义感到困惑 此外,输出

image_classifier:一个965维的概率向量,对应labelmap中的一个背景类和964种鸟类。

我完全被这里的意思弄糊涂了。

最后,我运行了interpreter.get_input_details() 和interpreter.get_output_details() 看看它会输出给我什么。

我把这个打印回来了,顶部是输入,底部是输出:

[{'name': 'module/hub_input/images_uint8', 'index': 170, 'shape': array([  1, 224, 224,   3]), 'dtype': <class 'numpy.uint8'>, 'quantization': (0.0078125, 128), 'quantization_parameters': {'scales': array([0.0078125], dtype=float32), 'zero_points': array([128]), 'quantized_dimension': 0}}]

[{'name': 'module/prediction', 'index': 171, 'shape': array([  1, 965]), 'dtype': <class 'numpy.uint8'>, 'quantization': (0.00390625, 0), 'quantization_parameters': {'scales': array([0.00390625], dtype=float32), 'zero_points': array([0]), 'quantized_dimension': 0}}]

我不知道如何解释这一点,并且想知道我是否应该放弃它,或者如果它不重要则忽略它。

感谢您对此任何部分的任何澄清,并感谢您认为对解决此问题有用的任何资源。我一直在寻求帮助,但还没有得到任何帮助。

【问题讨论】:

  • 嗨,将缩放视为一种数学运算,将值带入 [0,1] 范围内。例如 MinMaxScaler(从一个值中减去最小值并除以最小值和最大值之间的差值)。每个训练输出都会给出一个大小为 965 的概率向量,表示图像 A 属于 965 个类别中的任何一个。然后你选择最高的概率值作为真正的鸟类。例如,在 5 个物种模型中,输出 1 = [0.1,0.1,0.6,0.1,0.1] 分别对应于 [A,B,C,D,E] 物种。这意味着输入图像被分类为物种 C(最大值 0.6)。
  • @smile 您好,感谢您的评论。所以如果我理解你在说什么,我需要使用像 MInMaxScaler 这样的函数来将每个潜在的 965 个标签的概率值缩放为 0 到 1 之间的某个数字,所有概率总计高达 1 ?
  • 您缩放输入(图像)。概率向量是模型返回的。你不需要扩展它。概率向量以概率的形式告诉您输入属于哪个物种。我希望这会有所帮助。
  • 是的,这是有道理的。谢谢你,我很感激你的帮助。我现在至少理解了我的问题的那一部分!
  • 到你问题的最后一部分。首先,您使用的是来自 Tensorhub blog.tensorflow.org/2018/03/… 的预训练模型。在 tensorhub 页面上,您可以浏览可用的模块(您的示例来自分类示例)。可以观察到您的示例也是一个 TFLite 预训练模块,因此这个 tensorflow.org/lite 将特别有用。此tensorflow.org/lite/models/image_classification/overview 包含 TFLite 的图像分类详细信息。链接包含大量信息。探索它们。最好的问候

标签: python tensorflow machine-learning inference


【解决方案1】:

大部分问题由 cmets 中的 @smile 回答,但为了社区的利益,在此处(回答部分)提供说明。

问题:我对缩放到 [0,1] 的含义感到困惑

答案:通常,Images 只是一个 Numpy Array(在您的形状为 224、224、3 的情况下),其值范围为 0 to 255。我们NormalizePixel Values 将每个像素值除以 255,这样每个Pixel 的值都在[0,1] 范围内。如果我们不NormalizePixel ValuesModelConverge 所花费的时间会非常长。

有关规范化的更多信息,请参阅此Stack Overflow Answer 和此Stack Exchange Answer

问题:一个维度为 965 的 probability vector,对应标签图中的背景 class 和 964 种鸟类。我完全被这里的意思弄糊涂了。

答案:在我们 CNN 的最后一层,我们将使用 Softmax Activation FunctionNumber of Units 等于 Number of Classes(在您的情况下,它的值是 965 )。因此,LayerOutput 将导致 965 Probabilities 与所有 Probabilities 的总和为 1。具有最高 ProbabilityClass 表示对应于 @987654350 的 Class @。

例如在 5 个物种中 model output = [0.1,0.1,0.6, 0.1, 0.1] 分别对应于 [A,B,C,D,E] 物种。这意味着输入图像被分类为物种 C(最大值 0.6)。 (以@smile 为例,解释得很好)。

问题:我不知道如何解释interpreter.get_input_detailsinterpreter.get_output_details

答案get_input_details 的源代码解释说它返回了我们输入图像张量的所有详细信息的列表。同样,get_output_details 的源代码解释说它返回了我们的输出预测张量的所有细节的列表。关于 API、Interpreter 的信息可以在这个Tensorflow Documentation找到。

所以在代码中,

[{'name': 'module/hub_input/images_uint8', 'index': 170, 

'shape': array([  1, 224, 224,   3]), 'dtype': <class 'numpy.uint8'>, 

'quantization': (0.0078125, 128), 'quantization_parameters': {'scales': 

array([0.0078125], dtype=float32), 'zero_points': array([128]), 

'quantized_dimension': 0}}]

Name表示图中输入张量的NameShape表示其shapeQuantization 的目的是减小Model 的大小,因为Mobile DevicesMemory 会更小。有关Quantization 的更多信息,请访问此Tensorflow Documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2015-04-14
    • 1970-01-01
    • 2011-10-26
    • 2021-06-25
    • 1970-01-01
    相关资源
    最近更新 更多