Comment utiliser TensorFlow dans votre navigateur

Bien que vous puissiez entraîner des réseaux de neurones simples avec des quantités relativement petites de données d'entraînement avec TensorFlow, pour les réseaux de neurones profonds avec de grands ensembles de données d'entraînement, vous devez vraiment utiliser des GPU Nvidia compatibles CUDA, ou des TPU Google ou des FPGA pour l'accélération. L'alternative était, jusqu'à récemment, de s'entraîner sur des grappes de processeurs pendant des semaines.

L'une des innovations introduites avec TensorFlow 2.0 est une implémentation JavaScript, TensorFlow.js. Je ne m'attendais pas à ce que cela améliore la vitesse de formation ou d'inférence, mais c'est le cas, étant donné sa prise en charge de tous les GPU (pas seulement les GPU compatibles CUDA) via l'API WebGL.

[Aussi sur: Test de TensorFlow 2.0: apprentissage automatique plus facile]

Qu'est-ce que TensorFlow.js?

TensorFlow.js est une bibliothèque permettant de développer et de former des modèles de machine learning en JavaScript, et de les déployer dans un navigateur ou sur Node.js. Vous pouvez utiliser des modèles existants, convertir des modèles Python TensorFlow, utiliser l'apprentissage par transfert pour recycler les modèles existants avec vos propres données et développer des modèles à partir de zéro.

Back-ends TensorFlow.js

TensorFlow.js prend en charge plusieurs back-ends pour l'exécution, bien qu'un seul puisse être actif à la fois. L'environnement TensorFlow.js Node.js prend en charge l'utilisation d'une version installée de Python / C TensorFlow en tant que back-end, qui peut à son tour utiliser l'accélération matérielle disponible de la machine, par exemple CUDA. Il existe également un back-end basé sur JavaScript pour Node.js, mais ses capacités sont limitées.

Dans le navigateur, TensorFlow.js a plusieurs back-ends avec des caractéristiques différentes. Le back-end WebGL prend en charge le GPU en utilisant des textures WebGL pour le stockage et des shaders WebGL pour l'exécution, et peut être jusqu'à 100 fois plus rapide que le back-end du processeur ordinaire. WebGL ne nécessite pas CUDA, il peut donc tirer parti de n'importe quel GPU présent.

Le backend WebAssembly (WASM) TensorFlow.js pour le navigateur utilise la bibliothèque XNNPACK pour une implémentation de processeur optimisée des opérateurs de réseau neuronal. Le back-end WASM est généralement beaucoup plus rapide (10x à 30x) que le back-end du processeur JavaScript, mais il est généralement plus lent que le back-end WebGL sauf pour les très petits modèles. Votre kilométrage peut varier, alors testez les back-ends WASM et WebGL pour vos propres modèles sur votre propre matériel.

Modèles et couches TensorFlow.js

TensorFlow.js prend en charge deux API pour la création de modèles de réseau neuronal. L'une est l'API Layers, qui est essentiellement la même que l'API Keras dans TensorFlow 2. L'autre est l'API Core, qui est essentiellement une manipulation directe des tenseurs.

Comme Keras, l'API TensorFlow.js Layers dispose de deux façons de créer un modèle: séquentielle et fonctionnelle. L'API séquentielle est une pile linéaire de couches, implémentée avec une liste de couches (comme indiqué ci-dessous) ou avec la model.add()méthode:

modèle const = tf.sequential ({

 couches: [

   tf.layers.dense ({inputShape: [784], unités: 32, activation: 'relu'}),

   tf.layers.dense ({unités: 10, activation: 'softmax'}),

 ]

});

L'API fonctionnelle utilise l' tf.model()API et peut créer des réseaux DAG arbitraires (graphe acyclique dirigé):

// Créer un graphe arbitraire de couches, en les connectant

// via la méthode apply ().

const input = tf.input ({shape: [784]});

const dense1 = tf.layers.dense ({unités: 32, activation: 'relu'}). apply (entrée);

const dense2 = tf.layers.dense ({unités: 10, activation: 'softmax'}). apply (dense1);

modèle const = tf.model ({entrées: entrée, sorties: dense2});

L'API principale peut atteindre les mêmes objectifs, avec un code différent et moins d'un lien intuitif avec les couches. Le modèle ci-dessous peut ressembler à des opérations tensorielles de base, mais il crée le même réseau que les deux formulations précédentes. Notez l'utilisation de relu()et softmax(), qui sont tous deux des opérations de réseau neuronal, dans la model()fonction ci-dessous.

// Les poids et biais pour les deux couches denses.

const w1 = tf.variable (tf.randomNormal ([784, 32]));

const b1 = tf.variable (tf.randomNormal ([32]));

const w2 = tf.variable (tf.randomNormal ([32, 10]));

const b2 = tf.variable (tf.randomNormal ([10]));

modèle de fonction (x) {

  return x.matMul (w1) .add (b1) .relu (). matMul (w2) .add (b2) .softmax ();

}

Modèles TensorFlow.js préconstruits

Il existe plus d'une douzaine de modèles TensorFlow.js pré-construits documentés, disponibles dans le référentiel et hébergés sur NPM (pour une utilisation dans Node.js) et unpkg (pour une utilisation dans un navigateur). Vous pouvez utiliser ces modèles tels que fournis ou pour l'apprentissage par transfert. Avec un peu de travail, vous pouvez également les utiliser comme blocs de construction pour d'autres modèles.

Plusieurs de ces modèles utilisent la caméra d'un appareil en temps réel, par exemple à la main:

La liste ci-dessous est un index pratique de la plupart des modèles TensorFlow.js pré-emballés.

  • Classification des images
  • Détection d'objets
  • Segmentation corporelle
  • Estimation de la pose
  • Détection de la toxicité du texte
  • Encodeur de phrase universel
  • Reconnaissance des commandes vocales
  • Classificateur KNN
  • Détection de visage simple
  • Segmentation sémantique
  • Détection de repère de visage
  • Détection de la pose de la main
  • Réponse aux questions en langage naturel

Qu'est-ce que ml5.js?

ml5.js est une interface open source, conviviale et de haut niveau pour TensorFlow.js développée principalement à NYU. ml5.js fournit un accès immédiat dans le navigateur à des modèles pré-entraînés pour détecter les poses humaines, générer du texte, styliser une image avec une autre, composer de la musique, détecter la hauteur, les relations de mots communs en anglais, et bien plus encore. Alors que TensorFlow.js s'adresse principalement aux scientifiques et aux développeurs de données, ml5.js vise à soutenir une compréhension plus large du public de l'apprentissage automatique et à favoriser un engagement plus profond avec l'informatique éthique, la collecte de données responsable, ainsi que l'accessibilité et la diversité des personnes et des perspectives dans la technologie et les arts. .

La plupart des exemples de ml5.js dépendent des modèles TensorFlow.js. Ils ont été regroupés sous forme de pages Web que vous pouvez exécuter telles quelles ou modifier, par exemple pour utiliser différentes images.

Démo: classification Iris avec TensorFlow.js

Le célèbre jeu de données de discrimination Iris, créé par RA Fisher en 1936 pour illustrer l'analyse discriminante linéaire, est toujours utilisé comme scénario de test pour les méthodes de classification statistique et d'apprentissage automatique. Il utilise quatre caractéristiques, la longueur et la largeur des sépales et des pétales de fleurs, pour classer trois espèces d'Iris, avec 50 échantillons de chaque espèce. (L'article original de Fisher a été publié dans les Annals of Eugenics , qui en dit plus sur la science en 1936 que sur les données ou les statistiques.)

Si vous effectuez une analyse par grappes sur ces données, deux des espèces partageront une grappe, la troisième (I. Setosa) dans une grappe séparée. D'autre part, l'analyse en composantes principales peut assez bien séparer les trois espèces.

L'exemple TensorFlow.js ajuste les données Iris avec deux couches de réseau neuronal entièrement connectées (denses), comme indiqué dans l'extrait de code ci-dessous.

// Définit la topologie du modèle: deux couches denses.

modèle const = tf.sequential ();

model.add (tf.layers.dense (

{unités: 10, activation: 'sigmoïde', inputShape: [xTrain.shape [1]]}

));

model.add (tf.layers.dense ({unités: 3, activation: 'softmax'}));

model.summary ();

optimiseur const = tf.train.adam (params.learningRate);

model.compile ({

optimiseur: optimiseur,

perte: 'categoricalCrossentropy',

métriques: ['précision'],

});

Comme vous pouvez le voir dans la capture d'écran ci-dessous, ce modèle fait un travail décent pour classer les trois espèces. Si vous jouez avec les paramètres, cependant, vous découvrirez qu'une certaine confusion entre deux des espèces (celles du même cluster) réapparaît si vous itérez pendant plus de 40 époques.

Conversion de modèles Python TensorFlow en JavaScript

Une partie du référentiel TensorFlow.js contient un convertisseur pour les modèles TensorFlow et Keras enregistrés. Il prend en charge trois formats: SavedModel (par défaut pour TensorFlow), HDF5 (par défaut pour Keras) et TensorFlow Hub. Vous pouvez utiliser le convertisseur pour les modèles enregistrés à partir des référentiels standard, les modèles que vous avez formés vous-même et les modèles que vous avez trouvés ailleurs.

Il y a en fait deux étapes pour la conversion. La première étape consiste à convertir le modèle existant en fichiers model.json et de poids binaires. La deuxième étape consiste à utiliser une API pour charger le modèle dans TensorFlow.js, soit tf.loadGraphModelpour les modèles TensorFlow et TensorFlow Hub tf.loadLayersModelconvertis , soit pour les modèles Keras convertis.

Utiliser l'apprentissage par transfert

TensorFlow.js prend en charge l'apprentissage par transfert de la même manière que TensorFlow. La documentation fournit des exemples de personnalisation de MobileNet pour vos propres images et de personnalisation d'un modèle de reconnaissance des commandes vocales pour vos propres classes sonores. Essentiellement, ce que vous faites dans chacun de ces ateliers de programmation consiste à ajouter un petit classificateur personnalisé au-dessus du modèle entraîné et à l'entraîner.

Dans l'ensemble, TensorFlow.js peut faire presque tout ce que TensorFlow peut faire. Cependant, étant donné que les environnements cibles pour TensorFlow.js (GPU de variété de jardin pour les jeux) ont généralement moins de mémoire GPU que les gros GPU de serveur Nvidia généralement utilisés pour la formation en apprentissage profond TensorFlow, vous devrez peut-être réduire la taille de votre model pour le faire fonctionner dans un navigateur. L'utilitaire de conversion fait une partie de cela pour vous, mais vous devrez peut-être retirer les couches manuellement et réduire la taille des lots pour votre formation.