Guardar y cargar modelos

TensorFlow.js proporciona funcionalidad para los modelos que se han creado con el ahorro y la carga Layers API o convertidos a partir de los modelos existentes TensorFlow. Estos pueden ser modelos que haya entrenado usted mismo o aquellos entrenados por otros. Un beneficio clave de usar la API de capas es que los modelos creados con ella son serializables y esto es lo que exploraremos en este tutorial.

Este instructivo se enfocará en guardar y cargar modelos de TensorFlow.js (identificables por archivos JSON). También podemos importar modelos de TensorFlow Python. La carga de estos modelos se cubre en los dos tutoriales siguientes:

Guardar un modelo tf.

tf.Model y tf.Sequential tanto proporcionan una función model.save que le permiten guardar la topología y los pesos de un modelo.

  • Topología: este es un archivo que describe la arquitectura de un modelo (es decir, qué operaciones utiliza). Contiene referencias a los pesos de los modelos que se almacenan externamente.

  • Pesos: estos son archivos binarios que almacenan los pesos de un modelo dado en un formato eficiente. Por lo general, se almacenan en la misma carpeta que la topología.

Echemos un vistazo a cómo se ve el código para guardar un modelo

const saveResult = await model.save('localstorage://my-model-1');

Algunas cosas a tener en cuenta:

  • El save método toma un argumento de cadena-URL como que se inicia con un esquema. Esto describe el tipo de destino en el que intentamos guardar un modelo. En el ejemplo anterior el esquema es localstorage://
  • El esquema es seguido por un camino. En el ejemplo anterior el camino es my-model-1 .
  • El save método es asíncrona.
  • El valor de retorno de model.save es un objeto JSON que lleva la información tal como los tamaños de bytes de la topología y los pesos del modelo.
  • El entorno utilizado para guardar el modelo no afecta qué entornos pueden cargar el modelo. Guardar un modelo en node.js no evita que se cargue en el navegador.

A continuación, examinaremos los diferentes esquemas disponibles.

Almacenamiento local (solo navegador)

Esquema: localstorage://

await model.save('localstorage://my-model');

Esto ahorra un modelo bajo el nombre de my-model en el navegador de almacenamiento local . Esto persistirá entre las actualizaciones, aunque los usuarios o el navegador mismo pueden borrar el almacenamiento local si el espacio se convierte en un problema. Cada navegador también establece su propio límite sobre la cantidad de datos que se pueden almacenar en el almacenamiento local para un dominio determinado.

IndexedDB (solo navegador)

Esquema: indexeddb://

await model.save('indexeddb://my-model');

Esto ahorra un modelo para el navegador de IndexedDB almacenamiento. Al igual que el almacenamiento local, persiste entre actualizaciones, también tiende a tener límites más grandes en el tamaño de los objetos almacenados.

Descargas de archivos (solo navegador)

Esquema: downloads://

await model.save('downloads://my-model');

Esto hará que el navegador descargue los archivos del modelo a la máquina del usuario. Se producirán dos archivos:

  1. Un archivo de texto llamado JSON [my-model].json , que lleva la topología y la referencia al archivo de pesos describe a continuación.
  2. Un archivo binario que lleva los valores de peso nombrados [my-model].weights.bin .

Puede cambiar el nombre de [my-model] para obtener los archivos con un nombre diferente.

Debido a que los .json puntos de archivos a la .bin utilizando una ruta relativa, los dos archivos deben estar en la misma carpeta.

Solicitud HTTP (S)

Esquema: http:// o https://

await model.save('http://model-server.domain/upload')

Esto creará una solicitud web para guardar un modelo en un servidor remoto. Debe tener el control de ese servidor remoto para asegurarse de que pueda manejar la solicitud.

El modelo se envía al servidor HTTP especificado a través de un POSTAL petición. El cuerpo de la POST es en el multipart/form-data formato y consta de dos archivos

  1. Un archivo de texto JSON llamado model.json , que lleva la topología y la referencia a los pesos archivo descrito a continuación.
  2. Un archivo binario que lleva los valores de peso nombrado model.weights.bin .

Tenga en cuenta que el nombre de los dos archivos siempre será exactamente como se especificó anteriormente (el nombre está integrado en la función). Esta documentación del API contiene un fragmento de código Python que demuestra cómo se puede utilizar el frasco framework web para manejar la petición se originó en save .

A menudo, tendrá que pasar más argumentos o solicitar encabezados a su servidor HTTP (por ejemplo, para autenticación o si desea especificar una carpeta en la que se debe guardar el modelo). Puede hacerse con el control preciso sobre estos aspectos de las solicitudes de save mediante la sustitución del argumento de cadena URL en tf.io.browserHTTPRequest . Esta API ofrece una mayor flexibilidad para controlar las solicitudes HTTP.

Por ejemplo:

await model.save(tf.io.browserHTTPRequest(
    'http://model-server.domain/upload',
    {method: 'PUT', headers: {'header_key_1': 'header_value_1'} }));

Sistema de archivos nativo (solo Node.js)

Esquema: file://

await model.save('file:///path/to/my-model');

Cuando se ejecuta en Node.js, también tenemos acceso directo al sistema de archivos y podemos guardar modelos allí. El comando anterior guardará dos archivos a la path especificada afer el scheme .

  1. Un archivo de texto JSON llamado [model].json , que lleva la topología y la referencia al archivo de pesos describe a continuación.
  2. Un archivo binario que lleva los valores de peso nombrados [model].weights.bin .

Tenga en cuenta que el nombre de los dos archivos siempre será exactamente como se especificó anteriormente (el nombre está integrado en la función).

Cargando un modelo tf.

Teniendo en cuenta un modelo que se guardó usando uno de los métodos anteriores, podemos cargarlo mediante el tf.loadLayersModel API.

Echemos un vistazo a cómo se ve el código para cargar un modelo

const model = await tf.loadLayersModel('localstorage://my-model-1');

Algunas cosas a tener en cuenta:

  • Al igual que model.save() , el loadLayersModel función toma un argumento similar al URL cadena que comienza con un esquema. Esto describe el tipo de destino desde el que intentamos cargar un modelo.
  • El esquema es seguido por un camino. En el ejemplo anterior el camino es my-model-1 .
  • La cadena similar a una URL se puede reemplazar por un objeto que coincida con la interfaz IOHandler.
  • El tf.loadLayersModel() función es asíncrona.
  • El valor de retorno de tf.loadLayersModel es tf.Model

A continuación, examinaremos los diferentes esquemas disponibles.

Almacenamiento local (solo navegador)

Esquema: localstorage://

const model = await tf.loadLayersModel('localstorage://my-model');

Esto carga un modelo llamado my-model a partir del navegador de almacenamiento local .

IndexedDB (solo navegador)

Esquema: indexeddb://

const model = await tf.loadLayersModel('indexeddb://my-model');

Esto carga un modelo a partir del navegador IndexedDB almacenamiento.

HTTP (S)

Esquema: http:// o https://

const model = await tf.loadLayersModel('http://model-server.domain/download/model.json');

Esto carga un modelo desde un punto final http. Después de cargar el json archivo de la función será realizar solicitudes relacionadas correspondiente .bin archivos que los json referencias de archivo.

Sistema de archivos nativo (solo Node.js)

Esquema: file://

const model = await tf.loadLayersModel('file://path/to/my-model/model.json');

Cuando se ejecuta en Node.js, también tenemos acceso directo al sistema de archivos y podemos cargar modelos desde allí. Tenga en cuenta que en la llamada a la función anterior hacemos referencia al archivo model.json en sí (mientras que al guardar especificamos una carpeta). El correspondiente .bin archivo (s) debe estar en la misma carpeta que el json archivo.

Carga de modelos con IOHandlers

Si los esquemas anteriores no son suficientes para sus necesidades, puede implementar el comportamiento de carga personalizado con un IOHandler . Una IOHandler que ofrece TensorFlow.js es tf.io.browserFiles lo que permite a los usuarios del navegador para subir archivos de modelo en el navegador. Consulte la documentación para obtener más información.

Guardar y cargar modelos con IOHandlers personalizados

Si los esquemas anteriores no son suficientes para su carga o necesidades de ahorro se puede implementar el comportamiento de serialización personalizado mediante la implementación de un IOHandler .

Un IOHandler es un objeto con una save y load método.

El save función toma un parámetro que es una coincide con el ModelArtifacts interfaz y debe devolver una promesa que se resuelve en un SaveResult objeto.

La load la función no toma parámetros y debe devolver una promesa que se resuelve en un ModelArtifacts objeto. Este es el mismo objeto que se pasa a save .

Ver BrowserHTTPRequest para un ejemplo de cómo implementar un IOHandler.