二进制分类中的 TensorFlow lite 负预测

Posted

技术标签:

【中文标题】二进制分类中的 TensorFlow lite 负预测【英文标题】:Tensorflow lite negative predictions in binary classification 【发布时间】:2020-11-19 07:07:06 【问题描述】:

我基本上是希望通过 pyinstaller 准备我的模型以进行分发。并且由于打包 tensorflow 导致最终的可执行文件大小约为 500mbs。我求助于使用 tensorflow lite。

现在的问题是,当我将模型转换为 tflite(量化与否)时,它会为我输入的任何图像提供以下输出。

array([[-1.3749948e+23]], dtype=float32)

以下是我的模型转换代码

import tensorflow as tf

m = load_model("weights.best.hdf5")
converter = tf.lite.TFLiteConverter.from_keras_model(m)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_quant_model = converter.convert()

以下是测试 tflite 模型的代码

import tflite_runtime.interpreter as tflite
interpreter = tf.lite.Interpreter(model_content=tflite_quant_model)
interpreter.allocate_tensors()
inputdets = interpreter.get_input_details()
outputdets = interpreter.get_output_details()

import imageio
import cv2
import numpy as np
img = imageio.imread("1 (162).jpg")/256.0

final = cv2.resize(img,(150,150))
input_data = np.array([final],dtype=np.float32)
interpreter.set_tensor(inputdets[0]['index'], input_data)
interpreter.get_tensor(outputdets[0]['index']) 

keras 模型的输出

数组([[0.9934516]], dtype=float32)

tflite 模型的输出

数组([[-1.3749948e+23]], dtype=float32)

其他信息

在 keras 上训练时的模型准确度

98%

输入详情

['dtype': numpy.float32,
  'index': 0,
  'name': 'input_3',
  'quantization': (0.0, 0),
  'quantization_parameters': 'quantized_dimension': 0,
   'scales': array([], dtype=float32),
   'zero_points': array([], dtype=int32),
  'shape': array([  1, 150, 150,   3], dtype=int32),
  'shape_signature': array([  1, 150, 150,   3], dtype=int32),
  'sparsity_parameters': ]

输出细节

['dtype': numpy.float32,
  'index': 21,
  'name': 'Identity',
  'quantization': (0.0, 0),
  'quantization_parameters': 'quantized_dimension': 0,
   'scales': array([], dtype=float32),
   'zero_points': array([], dtype=int32),
  'shape': array([1, 1], dtype=int32),
  'shape_signature': array([1, 1], dtype=int32),
  'sparsity_parameters': ]

【问题讨论】:

【参考方案1】:

您需要在阅读结果之前运行interpreter.invoke()。 https://www.tensorflow.org/lite/guide/inference#load_and_run_a_model_in_python

如下更新您的代码:

...
...
interpreter.set_tensor(inputdets[0]['index'], input_data)
interpreter.invoke()
result = interpreter.get_tensor(outputdets[0]['index']) 
..
..

【讨论】:

终于成功了。感谢上帝。希望你有个美好的一天。 :p

以上是关于二进制分类中的 TensorFlow lite 负预测的主要内容,如果未能解决你的问题,请参考以下文章

AI 赋能边缘计算:在 Kuiper 中运行 TensorFlow Lite 模型

如何在使用 tensorflow lite Android API 第一次正确图像检测后停止分类

官方推荐 | 在 Flutter 中使用 TensorFlow Lite 插件实现文字分类

如何创建可轻松转换为 TensorFlow Lite 的模型?

如何创建一个可轻松转换为TensorFlow Lite的模型?

中文教学视频 | 在 Android 中使用 TensorFlow Lite