Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Data Scientist et langage R
  3. Deep learning avec TensorFlow et Keras
Extrait - Data Scientist et langage R Autoformation aux bases de l'intelligence artificielle dans l'univers de la data (3e édition)
Extraits du livre
Data Scientist et langage R Autoformation aux bases de l'intelligence artificielle dans l'univers de la data (3e édition)
1 avis
Revenir à la page d'achat du livre

Deep learning avec TensorFlow et Keras

Deep learning selon Google

On ne peut pas négliger un acteur comme Google. Ce pourrait être une bonne raison pour envisager d’utiliser TensorFlow dans vos projets, mais ce n’est pas la seule.

D’après le site GitHub, TensorFlow et Keras dominent le nombre de GitHub stars by AI library en 2020 : 153 000 stars pour TensorFlow, 51 000 stars pour Keras, 46 000 stars pour PyTorch, 45 000 stars pour Scikit-learn, 31 000 stars pour Caffe, 19 000 stars pour MXNet.

Ces frameworks sont facilement accessibles sous R :

  • TensorFlow et Keras, comme nous allons le voir plus loin,

  • PyTorch, via le package rTorch,

  • Scikit-learn, qui fonctionne très bien sous R en l’important avec reticulate,

  • MXNet (mais attention pas au travers du CRAN), dont l’installation n’est pas très simple, mais l’implémentation est puissante.

TensorFlow est une bibliothèque de logiciels open source dédiée aux calculs numériques. Elle est très souvent utilisée dans le cadre du deep learning, mais pas seulement.

Cette bibliothèque implémente en arrière-plan des graphes de flux de données qui peuvent vous être accessibles, mais qui ne sont abordés que par les spécialistes. Les nœuds y représentent des opérations mathématiques, tandis que les arêtes de graphe représentent...

Installation et initialisation de votre contexte technique

N’hésitez pas à faire le point sur votre contexte avant de commencer votre travail, en vérifiant votre configuration Python et son bon fonctionnement.

getwd()                              # où suis-je ? 
library(reticulate)                  # chargement de reticulate 
os    <- reticulate::import("os")    # un petit test de fonctionnement 
os$listdir(".")                      # si tout va bien : dir local 

Vous pouvez installer des packages Python dans l’environnement que vous utilisez sous R/RStudio, tout simplement de la façon suivante :

# intallation de packages Python (on ne le fait qu'une fois !) 
# c'est pratique quand ces packages sont absents, cela évite 
# de se tromper d'environnement d'installation 
 
py_install('matplotlib') 
py_install('pandas')  
 
py_install('graphviz') 
py_install('pydot') 
py_install('pydotplus') 

Au travers de R, l’installation de TensorFlow (versions 2.x.x) est simplifiée. Par ailleurs, le fait de fonctionner sous CUDA et donc avec une unité de traitement graphique (GPU), est maintenant...

Tenseurs TensorFlow/Keras

1. Forme des tenseurs

Nous prendrons comme exemple un tenseur ayant les paramètres de forme suivants :

  • Trois colonnes,

  • Cinq lignes,

  • Deux niveaux de profondeur.

zeros <- tf$Variable(tf$zeros(shape(2L,5L,3L))) 
print(zeros) 
 
##> <tf.Variable 'Variable:0' shape=(2, 5, 3) dtype=float32, numpy= 
##> array([[[0., 0., 0.], 
##>         [0., 0., 0.], 
##>         [0., 0., 0.], 
##>         [0., 0., 0.], 
##>         [0., 0., 0.]], 
##>  
##>        [[0., 0., 0.], 
##>         [0., 0., 0.], 
##>         [0., 0., 0.], 
##>         [0., 0., 0.], 
##>         [0., 0., 0.]]], dtype=float32)> 

Il est sans doute plus intéressant de créer ce même tenseur en utilisant l’API Keras, ce qui nous permet d’écrire un code qui fonctionnerait avec un autre backend que TensorFlow :

zeros <-  k_zeros(shape = c(2, 5, 3)) 
print(zeros) 
 
##> <tf.Variable 'Variable:0' shape=(2, 5, 3) dtype=float32, numpy= 
##> array([[[0., 0., 0.], 
##>         [0., 0., 0.], 
##>         [0., 0., 0.], 
##>         [0., 0., 0.], 
##>         [0., 0., 0.]], 
##>  
##>        [[0., 0., 0.], 
##>         [0., 0., 0.], 
##>         [0., 0., 0.], 
##>         [0., 0., 0.], 
##>         [0., 0., 0.]]], dtype=float32)> 

Remarquez bien l’ordre des paramètres de TensorFlow/Keras qui sont en "style C".

Comparez-les avec les paramètres des arrays de R qui sont en "style Fortran" :

array(0.0 , c(5,3,2)) 
 
##> , , 1 
##>  
##>      [,1] [,2] [,3] 
##> [1,]    0    0    0 
##> [2,]    0    0    0 
##> [3,]    0    0    0 
##> [4,]    0    0    0 
##> [5,]    0    0  ...

Mise au point d’un modèle de référence en utilisant caret

Tout d’abord, nous allons créer un modèle avec nos techniques habituelles en utilisant le package caret, qui encapsule de nombreuses techniques et modèles. Puis nous verrons en quoi le travail avec keras va différer ou pas pour effectuer un modèle similaire.

Nous allons utiliser les données iris, sans doute le dataset le plus connu qui soit, notre objectif étant de créer un modèle qui infère le type d’iris en fonction de quelques caractéristiques de leurs fleurs.

library(caret)              # gestion de nombreux types de modèles 
library(lessR)              # toujours moins de code R ... 
library(DataExplorer)       # pour quelques fonctionnalités 

Ce dataset est inclus dans votre implémentation R, il est donc toujours disponible pour vos essais. Regardons succinctement sa structure.

summary(iris) 
 
##>   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width  
##>  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100 
##>  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300 
##>  Median :5.800   Median :3.000   Median :4.350   Median :1.300 
##>  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199 
##>  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800 
##>  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500 
##>        Species   
##>  setosa    :50   
##>  versicolor:50   
##>  virginica :50   
##>                  
##>                  
##>  
 
introduce(iris) 
 
##>   rows columns discrete_columns continuous_columns all_missing_columns 
##> 1  150       5                1                  4    ...

Création d’un modèle avec TensorFlow 2 et Keras

Nous aurons plus de lignes à écrire, et ce pour plusieurs raisons :

  • Les modèles du package caret sont déjà paramétrés et utilisables sans les peaufiner, alors que l’interface Keras que nous allons utiliser pour accéder à la puissance du framework TensorFlow nécessite plus de paramétrage. Notez que l’utilisation directe de TensorFlow nécessite encore plus d’efforts.

  • Avant de les utiliser, nous allons devoir transformer nos données en structures numériques, typiquement des tenseurs ou au moins des matrices qui, comme les vecteurs, sont du point de vue mathématique des tenseurs. D’ailleurs, Keras assimile bien les matrix de R, alors que TensorFlow et Keras possèdent leur propre type de tensor.

  • Nous allons devoir transformer la colonne de notre variable de réponse, qui est catégorielle (setosa, versicolor, virginica) en trois colonnes de 0 ou de 1 qui indiqueront si l’iris est de tel ou tel type. En première approximation, vous pourriez être tenté de transformer les catégories en niveaux (1,2,3), mais la méthode adoptée ici est beaucoup plus puissante et généralisable.

  • Il nous faudra effectuer l’opération inverse, passer des trois colonnes à une, pour rendre les résultats plus intelligibles par des humains.

Alors, pourquoi faire tout cela ? Voici quelques pistes :

  • Ce nouveau contexte est très propice à l’élaboration de réseaux neuronaux de tout type, modernes et se basant parfois sur des modèles déjà partiellement entraînés (au travers de la technique du transfert learning facilement implémentable avec Keras).

  • Les modèles créés sont exportables et parfois directement utilisables dans des contextes très variés, allant du super-ordinateur au composant électronique, en passant par les téléphones portables, des objets du quotidien ou des add-on usb sur lesquels on peut déporter l’exécution des modèles.

  • Nous pourrons travailler finement notre modèle et visualiser finement l’évolution de ses métriques pendant les itérations de sa construction (les fameuses...