Conversión de modelo

TensorFlow.js viene con una variedad de modelos previamente entrenados que están listos para usar en el navegador; se pueden encontrar en nuestro repositorio de modelos . Sin embargo, es posible que haya encontrado o creado un modelo de TensorFlow en otro lugar que le gustaría usar en su aplicación web. TensorFlow.js proporciona un convertidor de modelos para este propósito. El convertidor TensorFlow.js tiene dos componentes:

  1. Una utilidad de línea de comandos que convierte los modelos Keras y TensorFlow para usarlos en TensorFlow.js.
  2. Una API para cargar y ejecutar el modelo en el navegador con TensorFlow.js.

Convierte tu modelo

El convertidor TensorFlow.js funciona con varios formatos de modelo diferentes:

SavedModel : este es el formato predeterminado en el que se guardan los modelos de TensorFlow. El formato SavedModel está documentado aquí .

Modelo Keras : los modelos Keras generalmente se guardan como un archivo HDF5. Puede encontrar más información sobre cómo guardar modelos de Keras aquí .

Módulo TensorFlow Hub : estos son modelos que se han empaquetado para su distribución en TensorFlow Hub, una plataforma para compartir y descubrir modelos. La biblioteca de modelos se puede encontrar aquí .

Dependiendo del tipo de modelo que intentes convertir, necesitarás pasar diferentes argumentos al convertidor. Por ejemplo, digamos que ha guardado un modelo de Keras llamado model.h5 en su directorio tmp/ . Para convertir su modelo usando el convertidor TensorFlow.js, puede ejecutar el siguiente comando:

$ tensorflowjs_converter --input_format=keras /tmp/model.h5 /tmp/tfjs_model

Esto convertirá el modelo en /tmp/model.h5 y generará un archivo model.json junto con archivos de peso binarios en su directorio tmp/tfjs_model/ .

Se pueden encontrar más detalles sobre los argumentos de la línea de comando correspondientes a diferentes formatos de modelo en el archivo README del convertidor TensorFlow.js.

Durante el proceso de conversión, recorremos el gráfico del modelo y verificamos que cada operación sea compatible con TensorFlow.js. Si es así, escribimos el gráfico en un formato que el navegador pueda consumir. Intentamos optimizar el modelo para que se publique en la web dividiendo los pesos en archivos de 4 MB, de esa manera los navegadores pueden almacenarlos en caché. También intentamos simplificar el gráfico del modelo utilizando el proyecto Grappler de código abierto. Las simplificaciones de gráficos incluyen plegar operaciones adyacentes, eliminar subgrafos comunes, etc. Estos cambios no tienen ningún efecto en la salida del modelo. Para una mayor optimización, los usuarios pueden pasar un argumento que indique al convertidor que cuantice el modelo a un determinado tamaño de bytes. La cuantificación es una técnica para reducir el tamaño del modelo representando pesos con menos bits. Los usuarios deben tener cuidado para garantizar que su modelo mantenga un grado aceptable de precisión después de la cuantificación.

Si encontramos una operación no compatible durante la conversión, el proceso falla e imprimimos el nombre de la operación para el usuario. No dude en enviar un problema en nuestro GitHub para informarnos al respecto: intentamos implementar nuevas operaciones en respuesta a la demanda de los usuarios.

Mejores prácticas

Aunque hacemos todo lo posible para optimizar su modelo durante la conversión, a menudo la mejor manera de garantizar que su modelo funcione bien es crearlo teniendo en cuenta entornos con recursos limitados. Esto significa evitar arquitecturas demasiado complejas y minimizar la cantidad de parámetros (pesos) cuando sea posible.

Ejecute su modelo

Al convertir exitosamente su modelo, terminará con un conjunto de archivos de peso y un archivo de topología del modelo. TensorFlow.js proporciona API de carga de modelos que puede usar para recuperar estos recursos de modelo y ejecutar inferencias en el navegador.

Así es como se ve la API para un módulo TensorFlow SavedModel o TensorFlow Hub convertido:

const model = await tf.loadGraphModel(path/to/model.json);

Y así es como se ve un modelo Keras convertido:

const model = await tf.loadLayersModel(path/to/model.json);

La API tf.loadGraphModel devuelve un tf.FrozenModel , lo que significa que los parámetros son fijos y no podrá ajustar su modelo con nuevos datos. La API tf.loadLayersModel devuelve un tf.Model, que se puede entrenar. Para obtener información sobre cómo entrenar un tf.Model, consulte la guía de entrenamiento de modelos .

Después de la conversión, es una buena idea ejecutar la inferencia varias veces y comparar la velocidad de su modelo. Tenemos una página de evaluación comparativa independiente que se puede utilizar para este propósito: https://tensorflow.github.io/tfjs/e2e/benchmarks/local-benchmark/index.html Es posible que observe que descartamos mediciones de una ejecución de calentamiento inicial. esto se debe a que (en general) la primera inferencia de su modelo será varias veces más lenta que las inferencias posteriores debido a la sobrecarga de crear texturas y compilar sombreadores.