1. Livres & vidéos
  2. Intelligence Artificielle
  3. TensorFlow
Extrait - Intelligence Artificielle Premiers pas vers le Deep Learning avec JavaScript
Extraits du livre
Intelligence Artificielle Premiers pas vers le Deep Learning avec JavaScript Revenir à la page d'achat du livre

TensorFlow

Création d’un réseau

1. Installation

a. Des performances élevées

TensorFlow est un projet open source initié par Google pour le deep learning. À la base, il s’agit d’un framework Python partant de la création, l’entraînement d’un modèle (ou réseau de neurones) jusqu’à son inférence. TensorFlow.js est son équivalent JavaScript. L’intérêt de ce framework est sa faculté à utiliser les CPU (Central Processing Unit) et les GPU (Graphics Processing Unit). Un GPU est souvent lié à une carte graphique, particulièrement les cartes de marque NVIDIA et AMD, ce type de processeur couplé à une couche logicielle (CUDA pour Nvidia et ROCm pour AMD) accélère considérablement les calculs pour les réseaux de neurones.

Donc si votre machine dispose d’un GPU, TensorFlow.js sera capable de l’utiliser pour accélérer les performances de calcul, dans le cas contraire, il va simplement s’appuyer sur le CPU de votre machine. En figure 1, on peut constater la différence, avec ces 4 additions à faire, le GPU utilisera ici 4 unités de calculs en même temps, là où le processeur (dans sa forme simplifiée mono cœur) sera obligé de faire chaque calcul l’un après l’autre. Compte tenu du nombre de calculs qu’imposent les réseaux de neurones, on comprend vite l’intérêt du GPU. On trouve par exemple des GPU dans les cartes graphiques NVIDIA/AMD.

images/05EI00.png

Figure 1 - Calculs CPU/GPU

TensorFlow.js étant une librairie JavaScript, elle a la particularité de pouvoir s’exécuter dans l’environnement d’un navigateur web (Chrome…) ou bien dans un cadre applicatif avec Node.js.

Avec l’usage d’un navigateur web, l’accès à un GPU reste possible en passant par la librairie graphique WebGL (Web Graphics Library).

Avec l’usage en applicatif et Node.js, alors toutes les librairies natives pour utiliser un GPU sont disponibles. La performance en JavaScript est alors proche de celle en Python.

b. Installation avec Node.js

Nous allons commencer par faire une installation en application avec Node.js. Nous avons déjà vu que l’installation de Node.js était...

Entraînement d’un réseau

1. Les tenseurs

Pour fournir des données d’entraînement, nous devrons indiquer au réseau à la fois les données entrées et les sorties attendues. Ces dernières vont être fournies par une structure de données particulières que l’on nomme tenseurs. Un tenseur peut gérer plusieurs dimensions de données, par exemple, imaginez que vous ayez une suite de nombres à indiquer au réseau ou bien une suite de tableaux de nombres… Vous passerez alors par la même structure de données. Le tenseur regroupe un ensemble de données, et il dispose également de multiples fonctions pour gérer ces données comme de pouvoir déterminer les extrêmes, de calculer une moyenne, etc. Les fonctions qui sont à disposition seront aussi utilisées par le réseau de neurones pour effectuer tous les calculs utiles.

L’autre avantage des tenseurs est le fait qu’ils sont capables d’opérer à la fois sur un CPU (Central Processing Unit) ou un GPU (Graphics Processing Unit) selon ce qui est à disposition accélérant considérablement les calculs.

Un tenseur à 0 dimensions représente une seule valeur et est un scalaire, ce n’est normalement pas exploitable pour de l’entraînement. Un tenseur à 1 dimension est un vecteur. Un tenseur à 2 dimensions est une matrice.

Un tenseur est un objet de la classe tf.Tensor. Vous avez également des tenseurs « prêts à l’emploi » selon la dimension de vos données et accessible par différentes fonctions (tf.tensor1d, tf.tensor2d…). Chaque tenseur sera associé à un tableau de données représentant vos données d’entraînement.

Prenons un exemple, vous avez un capteur de températures et vous voudriez estimer la température qui pourrait arriver juste après.

Voici les températures reçues par votre capteur :

3,5,10,15,12,10,5,10,8 

Ces valeurs ont été choisies arbitrairement pour offrir un exemple simple de construction et d’entraînement d’un réseau.

Pour prédire la prochaine température, nous allons déjà faire...

Inférence du réseau

1. Tester le réseau

a. Données de test

L’inférence du réseau intervient en dernière étape et consiste à tester le réseau. Pour cela, nous n’allons pas nous appuyer sur le jeu de données d’entraînement, sinon cela fausserait l’évaluation du réseau mais nous allons nous appuyer sur un nouveau jeu de données.

Voici nos données d’entraînement :

3,5,10,15,12,10,5,10,8 

Ces données d’entraînement font apparaître différentes phases de températures avec une montée jusqu’à 15 degrés puis une baisse, on peut donc espérer que notre réseau ait pu pondérer ces paramètres en ce sens.

Nous avons choisi arbitrairement les valeurs suivantes pour notre test, nous y intégrons une phase de hausse jusqu’à 14 degrés cette fois-ci et une phase de baisse. Pour rappel notre réseau de neurones ne prend que 3 entrées, donc pour une prédiction, nous n’avons pas besoin de l’historique des températures.

14,11,9 

Cela revient à tester notre réseau avec ce tenseur :

const temperaturesTest = tf.tensor2d( [ [14,11,9] ] ); 

b. Inférence

L’inférence est beaucoup plus simple à gérer que l’entraînement, on se contente...