es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)
Tags:  , , ,

Answer

  1. Avatar for 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:

    onnx_output = actual[0]
    score = onnx_output[0][0]
    

    Esto debería darte la misma puntuación que el modelo Keras.

Comments are closed.