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...