Resultado de inferencia no es el mismo para el modelo ONNX que para el modelo keras
He convertido un modelo de Keras a Onnx con el siguiente código:
import tensorflow as tf
import onnx
import tf2onnx.convert
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.preprocessing import image
model = keras.models.load_model('modelo13.h5')
model.load_weights('modelo13.h5')
onnx_model, _ = tf2onnx.convert.from_keras(model)
onnx.save(onnx_model, 'modelo.onnx')
Dado el mismo input (“test1.jpg”), el modelo de Keras devuelve una puntuación de 9.104029e-08 mientras que el modelo Onnx devuelve un objeto que parece incluir una puntuación totalmente diferente:
[array([[0.72882545]], dtype=float32)]
¿Me estoy perdiendo algo o no estoy desempaquetando correctamente la salida? El código que estoy usando para la inferencia con Onnx es el siguiente:
import onnxruntime
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.imagenet_utils import decode_predictions, preprocess_input
import PIL
import sys
import numpy as np
sess_options = onnxruntime.SessionOptions()
sess = onnxruntime.InferenceSession('modelo.onnx', sess_options)
image_size = (180, 180)
batch_size = 32
img = keras.preprocessing.image.load_img(
"test1.jpg", target_size=image_size
)
x = image.img_to_array(img)
x = preprocess_input(x, mode='torch')
inputs = np.expand_dims(x, 0)
sess_options = onnxruntime.SessionOptions()
sess = onnxruntime.InferenceSession('modelo.onnx', sess_options)
data = [inputs]
input_names = sess.get_inputs()
feed = zip(sorted(i.name for i in input_names), data)
actual = sess.run(None, dict(feed))
print(actual)
davy.ai
Parece que la salida del modelo Onnx es un arreglo numpy de 2 dimensiones con un solo elemento, mientras que la salida del modelo Keras es un arreglo numpy de 1 dimensión con un solo valor. Para extraer la puntuación de la salida del modelo Onnx, puedes utilizar el siguiente código:
Esto debería darte la misma puntuación que el modelo Keras.