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.

Cómo convertir una matriz multidimensional de Swift al formato de datos para TensorFlow Lite?

Tengo un modelo TFLite con la siguiente forma de entrada:

num_rows = 40
num_columns = 174
num_channels = 1

Comencé con una matriz en Swift, pero TensorFlow Lite quiere que sea del tipo Data.

Así es como intenté convertir mi matriz a Data:

let interpreter = try Interpreter(modelPath: modelPath!)

// Asignar memoria para los tensores de entrada del modelo.
try interpreter.allocateTensors()

// Obtener datos iniciales "sendtoModel" como tipo Array<><double>> 
// ... desde la función testRecognizer()

let sendtoModel = try? testRecognizer()

// Convertir Array<><double>> a Data
let encodedData = NSKeyedArchiver.archivedData(withRootObject: sendtoModel)

// Enviar Data convertida al modelo TFLite
try self.interpreter.copy(encodedData, toInputAt: 0)

Cuando ejecuto este código, obtengo un error que apunta a la última línea.

Hilo 1: Error fatal: Inesperadamente se encontró nil al desempaquetar un valor opcional

¿Qué está pasando aquí? Claramente estoy haciendo algo mal en el proceso de conversión. No encontré elementos nulos en sendtoModel, la matriz inicial de matrices de doble precisión. Luego recorrí los elementos del objeto Data y verifiqué si alguno era nulo; ninguno lo era.

He luchado con esta conversión durante muchas horas y agradecería mucho algunos consejos. Sé que hay una forma de convertir matrices de Swift al formato Data requerido por TFLite para Swift, pero mi forma no lo es. Ni siquiera estoy seguro de estar haciendo correctamente si puedo solucionar el error mencionado anteriormente.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar en la forma en que se realiza la conversión de una matriz Swift a Data utilizando NSKeyedArchiver. Este método no es apropiado para este caso de uso y está causando errores inesperados.

    Para convertir correctamente una matriz Swift a Data para usar con TensorFlow Lite, se puede utilizar el inicializador de Data que toma un puntero a los bytes sin procesar de la matriz, junto con la longitud total de los datos de la matriz en bytes.

    Aquí hay una versión actualizada del código que debería funcionar correctamente:

    let interpreter = try Interpreter(modelPath: modelPath!)
    
    // Asignar memoria para los `Tensor` de entrada del modelo.
    try interpreter.allocateTensors()
    
    // Obtener datos iniciales "sendtoModel" como tipo Array<><double>>!
    // ... desde la función testRecognizer()
    
    let sendtoModel = try? testRecognizer()
    
    // Convertir Array<><double>>! a `Data`
    let numBytes = MemoryLayout<double>.stride * num_rows * num_columns * num_channels
    let data = sendtoModel.withUnsafeBytes { 
        return Data(bytes: $0.baseAddress!, count: numBytes) 
    }
    
    // Enviar Data convertida al modelo TFLite
    try self.interpreter.copy(data, toInputAt: 0)
    

    Este código utiliza el método withUnsafeBytes para obtener un puntero a los datos de bytes sin procesar de la matriz Swift y luego crea un objeto Data a partir de ese puntero.

    Ten en cuenta que deberás asegurarte de que las variables num_rows, num_columns y num_channels estén configuradas correctamente para la forma de entrada de tu modelo.

Comments are closed.