Conversion de modèle

TensorFlow.js est livré avec une variété de modèles pré-entraînés prêts à être utilisés dans le navigateur. Ils peuvent être trouvés dans notre référentiel de modèles . Cependant, vous avez peut-être trouvé ou créé ailleurs un modèle TensorFlow que vous souhaiteriez utiliser dans votre application Web. TensorFlow.js fournit un convertisseur de modèle à cet effet. Le convertisseur TensorFlow.js comporte deux composants :

  1. Un utilitaire de ligne de commande qui convertit les modèles Keras et TensorFlow pour les utiliser dans TensorFlow.js.
  2. Une API pour charger et exécuter le modèle dans le navigateur avec TensorFlow.js.

Convertissez votre modèle

Le convertisseur TensorFlow.js fonctionne avec plusieurs formats de modèles différents :

SavedModel : il s'agit du format par défaut dans lequel les modèles TensorFlow sont enregistrés. Le format SavedModel est documenté ici .

Modèle Keras : Les modèles Keras sont généralement enregistrés sous forme de fichier HDF5. Plus d'informations sur la sauvegarde des modèles Keras peuvent être trouvées ici .

Module TensorFlow Hub : Il s'agit de modèles qui ont été packagés pour être distribués sur TensorFlow Hub, une plateforme de partage et de découverte de modèles. La bibliothèque de modèles peut être trouvée ici .

Selon le type de modèle que vous essayez de convertir, vous devrez transmettre différents arguments au convertisseur. Par exemple, disons que vous avez enregistré un modèle Keras nommé model.h5 dans votre répertoire tmp/ . Pour convertir votre modèle à l'aide du convertisseur TensorFlow.js, vous pouvez exécuter la commande suivante :

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

Cela convertira le modèle dans /tmp/model.h5 et générera un fichier model.json ainsi que des fichiers de poids binaires dans votre répertoire tmp/tfjs_model/ .

Plus de détails sur les arguments de ligne de commande correspondant aux différents formats de modèle peuvent être trouvés dans le fichier README du convertisseur TensorFlow.js.

Pendant le processus de conversion, nous parcourons le graphique du modèle et vérifions que chaque opération est prise en charge par TensorFlow.js. Si tel est le cas, nous écrivons le graphique dans un format que le navigateur peut utiliser. Nous essayons d'optimiser le modèle pour qu'il soit diffusé sur le Web en répartissant les pondérations dans des fichiers de 4 Mo - de cette façon, ils peuvent être mis en cache par les navigateurs. Nous essayons également de simplifier le graphe modèle lui-même en utilisant le projet open source Grappler . Les simplifications des graphiques incluent le regroupement des opérations adjacentes, l'élimination des sous-graphes communs, etc. Ces modifications n'ont aucun effet sur la sortie du modèle. Pour une optimisation plus poussée, les utilisateurs peuvent transmettre un argument qui demande au convertisseur de quantifier le modèle à une certaine taille d'octet. La quantification est une technique permettant de réduire la taille du modèle en représentant les poids avec moins de bits. Les utilisateurs doivent veiller à ce que leur modèle conserve un degré de précision acceptable après quantification.

Si nous rencontrons une opération non prise en charge lors de la conversion, le processus échoue et nous imprimons le nom de l'opération pour l'utilisateur. N'hésitez pas à soumettre un problème sur notre GitHub pour nous en faire part - nous essayons de mettre en œuvre de nouvelles opérations en réponse à la demande des utilisateurs.

Les meilleures pratiques

Bien que nous fassions tout notre possible pour optimiser votre modèle lors de la conversion, le meilleur moyen de garantir que votre modèle fonctionne correctement est souvent de le créer en gardant à l'esprit des environnements aux ressources limitées. Cela signifie éviter les architectures trop complexes et minimiser le nombre de paramètres (poids) lorsque cela est possible.

Exécutez votre modèle

Une fois votre modèle converti, vous obtiendrez un ensemble de fichiers de poids et un fichier de topologie de modèle. TensorFlow.js fournit des API de chargement de modèle que vous pouvez utiliser pour récupérer ces actifs de modèle et exécuter l'inférence dans le navigateur.

Voici à quoi ressemble l'API pour un module TensorFlow SavedModel ou TensorFlow Hub converti :

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

Et voici à quoi cela ressemble pour un modèle Keras converti :

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

L'API tf.loadGraphModel renvoie un tf.FrozenModel , ce qui signifie que les paramètres sont fixes et que vous ne pourrez pas affiner votre modèle avec de nouvelles données. L'API tf.loadLayersModel renvoie un tf.Model, qui peut être entraîné. Pour plus d'informations sur la façon de former un tf.Model, reportez-vous au guide des modèles de train .

Après la conversion, c'est une bonne idée d'exécuter l'inférence plusieurs fois et de comparer la vitesse de votre modèle. Nous disposons d'une page d'analyse comparative autonome qui peut être utilisée à cette fin : https://tensorflow.github.io/tfjs/e2e/benchmarks/local-benchmark/index.html Vous remarquerez peut-être que nous supprimons les mesures d'un échauffement initial - en effet, (en général) la première inférence de votre modèle sera plusieurs fois plus lente que les inférences suivantes en raison de la surcharge liée à la création de textures et à la compilation des shaders.