Tensorflow Lite模型输出错误

4

我正在开发一个使用回归预测的深度学习模型。我创建了一个tflite模型,但它的预测结果与原始模型不同,并且完全错误。以下是我的步骤:

我使用keras训练了我的模型。

model = Sequential()
model.add(Dense(100, input_dim=x.shape[1], activation='relu')) # Hidden 1
model.add(Dense(50, activation='relu')) # Hidden 2
model.add(Dense(1)) # Output
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(x,y,verbose=0,epochs=500)

我将我的模型保存为h5文件。

model.save("keras_model.h5")

然后通过TocoConverter将h5文件转换为tflile格式。
converter = tf.contrib.lite.TocoConverter.from_keras_model_file("keras_model.h5")
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

当我使用相同的输入测试这两个文件时,原始的keras模型会给出合理的输出,但转换后的模型会给出不合理的输出。

# Load TFLite model and allocate tensors.
interpreter = tf.contrib.lite.Interpreter(model_path="converted_model.tflite")
interpreter.allocate_tensors()

# Get input and output tensors.
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

# Test model on random input data.
input_shape = input_details[0]['shape']
input_data = np.array(np.random.random_sample(input_shape), dtype=np.float32)
interpreter.set_tensor(input_details[0]['index'], input_data)

interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
print(input_data)
print(output_data)

//Original model testing
from keras.models import load_model
model2 = load_model("keras_model.h5")
pred = model2.predict(x)
print(pred)

输出结果如下:
[[10. 10. 10. 10. 10. 10.]]//input_data
[[-1.4308803]]// tflite output (meaningless)
[[335.0276]] // keras file output

为什么会出现这个问题?

TocoConvert.from_keras_model_file 函数中存在一个 bug。该问题已在 8 月 9 日的夜间构建版本中得到修复。感谢您报告此问题。 - Nupur Garg
1个回答

5
最终我通过使用这个代码片段将Keras模型转换为冻结图,并找到了解决方案。我将此Python文件复制到TensorFlow Scripts文件夹中,并将Keras模型文件复制到相同的文件夹中。然后创建一个名为“frozen”的文件夹。然后运行以下命令。
py cerasconvert.py keras_model.h5 frozen/ freeze_graph

我将新创建的.pb文件转换为了tflite格式。
import tensorflow as tf
import numpy as np

graph_def_file = "frozen/frozen.pb"
input_arrays = ["dense_1_input_1"]
output_arrays = ["dense_3_1/BiasAdd"]

converter = tf.contrib.lite.TocoConverter.from_frozen_graph(
graph_def_file, input_arrays, output_arrays)
tflite_model = converter.convert()
open("frozen/converted.tflite", "wb").write(tflite_model)

现在我的tflite模型预测准确率非常高。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接