knitr::opts_chunk$set(echo = TRUE)
library(keras)
library(ggplot2)
library(dplyr)
library(corrplot) # pour représenter la matrice des corrélations empiriques
library(factoextra) # pour avoir des représentations graphiques pour l'ACP
library(tensorflow)
#library(reticulate)
# use_miniconda("r-reticulate")
if (tensorflow::tf$executing_eagerly()) {
  tensorflow::tf$compat$v1$disable_eager_execution()
}
K <- keras::backend()

Introduction : l’apprentissage profond en pratique

Il existe deux grandes “bibliothèques logicielles” pour faire de l’apprentissage profond (deep learning).

  1. Pytorch est une “bibliothèque logicielle” écrite en C++, Python et C, basée sur Torch, développée par les équipes d’intelligence artificielle (IA) de Facebook, déposée en open source sur GitHub en 2017. Selon les blogs, Pytorch est réputé être plutôt pour les développeurs orientés recherche, plus convivial, plus facile à adapter et debugger.

  2. TensorFlow est une plateforme Open-Source, proposant un ensemble complet et flexible d’outils, bibliothèques et ressources communautaires pour le “machine learning”. C’est aussi une bibliothèque logicielle pour le calcul numérique utilisant des graphiques de flux de données. Les noeuds représentent des fonctions mathématiques et les arêtes des tableaux multidimensionnels (tenseurs) communiquant entre eux. TensorFlow a été développé par les équipes de Google et publié en 2015. Le “+” revendiqué est le côté écosystème complet, pas besoin de gérer CPU/GPU et facilitation de mise en production d’outils liés à l’IA.

Keras est une interface “high-level” pour construire et entraîner des modèles d’apprentissage profond, développée par F. Chollet et qui sert d’interface pour TensorFlow, mais aussi The MicroSoft Cognitive ToolKit and Theano. Keras ne se charge pas directement des opérations de bas niveau comme les produits ou les convolutions de Tensor, et s’appuie sur un moteur backend (par exemple TensorFlow). Keras inclut aussi des ensembles de données et des modèles bien connus, pré-entraînés (sur ImageNet).

Il semble qu’aujourd’hui les deux ont travaillé sur leurs points faibles.

Et avec R ?

Il existe des bibliothèques R de mêmes noms que celles Python, tensorflow, keras, torch.

  1. torch : construction sur PyTorch C++, pas de dépendance à Python, installation plus facile.

  2. Il existe un projet RStudio autour de TensorFlow https://tensorflow.rstudio.com/ (et donc documentation assez complète) Pour les utilisateurs de R, tensorflow et keras sont basés sur reticulate et revient à utiliser des packages Python depuis R.

L’interface Keras a été portée sous R par JJ. Allaire, et évolue avec la philosophie “make it R-like and natural, where possible and make it easy to port from Python, where necessary”. Vous pouvez lire l’article de blog ci-dessous pour plus d’infos sur les dernières évolutions. Il existe aussi le livre Deep Learning with R écrit par F. Chollet et JJ Allaire dont une deuxième version est attendue sous peu.

“Cheatsheet” pour le package R keras https://raw.githubusercontent.com/rstudio/cheatsheets/master/keras.pdf

Objectif du tuto

Comprendre les commandes permettant de construire et entraîner un autoencodeur (variationnel) avec le package keras, depuis RStudio, avec un objectif de réduction de dimension.

Quelques ateliers passés autour de l’apprentissage profond :

Pré-requis et installation

Pour installer tensorflow et keras et travailler depuis RStudio, suivre les consignes d’installation disponibles ici.

Sous Ubuntu, on est un peu pris par la main. Installer les packages keras et tensorflow.
Si TensorFlow n’est pas installé sur notre machine, il suffira de lancer la fonction tensorflow::install_tensorflow() mais là encore, vous devriez avoir un message explicite. Si besoin on vous proposera d’installer Miniconda.

Pour vérifier son installation tensorflow :

library(tensorflow)
tf$constant("Hellow Tensorflow")

Possiblement on verra apparaître des messages d’erreur qui en fait ne concernent que les calculs sur GPU. Si vous n’avez pas de carte GPU ou ne souhaitez pas faire de calculs sur GPU vous pouvez ignorer les messages.

Si vous souhaitez pouvoir utiliser les fonctionnalités GPU, vous aurez sans doute besoin d’installation supplémentaire.

Remarque : pour avoir des infos sur sa carte graphique sous Ubuntu, taper lspci | egrep "3D|VGA" dans une console.

Recette keras

Pour définir le modèle puis l’ajuster, on utilisera toujours les étapes suivantes.

1. Construction du modèle (configuration des couches)

Dans keras on assemble des couches pour construire un modèle (mode de construction le plus courant est le mode séquentiel).

layer_input(shape = NULL)

layer_dense(object, units, activation = NULL, use_bias = TRUE, input_shape = NULL)

Outre la fonction d’activation à spécifier, les schémas d’initialisation des poids (kernel_initializer) ou de régularisation des poids (kernel_regularizer) peuvent être importants.

2. Processus d’apprentissage

a. Configuration (methode compile)

compile(loss='mean_squared_error', optimizer='sgd')

  • optimizer : optimiseur, souvent "rmsprop" par défaut.

  • loss: fonction de perte à minimiser.

  • metrics: métriques à évaluer pendant l’entrainement et le test du modèle.

Ex : pour de la classification

optimizer = 'adam', loss = 'categorical_crossentropy', metrics = list('accuracy')

b. Préparer les donnees d’apprentissage

c. Apprentissage (fit)

fit(object, x = NULL, y = NULL, bath_size = NULL, epochs = 10)

  • epochs: l’apprentissage est structuré en ‘epochs’, ie itération sur le jeu entier de données (ce qui fait en lots (‘batches’) plus petits).

  • batch_size: le modèle découpe les données en lots plus petits et itèrent sur chaque lote pendant l’entrainement. Attention si le nombre total d’échantillons n’est pas divisible par la taille du lot, le dernier batch doit être le plus petit.

3. Evaluer et prédire (predict)

Réduction de dimension

Données

Nous considérerons le jeu de données “vin rouge” de la base de données de vins portugais “Vinho Verde”. Nous disposons de 12 variables physico-chimiques et sensorielles, dont une variable de quality de vin correspondant à un score entre 0 et 10. Une courte description de chaque variable est disponible ici. Les données sont utilisées à titre purement illustratif.

wine <- read.csv("http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv", sep = ";")
#quality <- wine$quality<6
#wine2 <- read.table("http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data", sep = ",")
# Taille du jeux de données
dim(wine)
## [1] 1599   12
# Aperçu des premières lignes
head(wine[,-12])
##   fixed.acidity volatile.acidity citric.acid residual.sugar chlorides
## 1           7.4             0.70        0.00            1.9     0.076
## 2           7.8             0.88        0.00            2.6     0.098
## 3           7.8             0.76        0.04            2.3     0.092
## 4          11.2             0.28        0.56            1.9     0.075
## 5           7.4             0.70        0.00            1.9     0.076
## 6           7.4             0.66        0.00            1.8     0.075
##   free.sulfur.dioxide total.sulfur.dioxide density   pH sulphates alcohol
## 1                  11                   34  0.9978 3.51      0.56     9.4
## 2                  25                   67  0.9968 3.20      0.68     9.8
## 3                  15                   54  0.9970 3.26      0.65     9.8
## 4                  17                   60  0.9980 3.16      0.58     9.8
## 5                  11                   34  0.9978 3.51      0.56     9.4
## 6                  13                   40  0.9978 3.51      0.56     9.4
# Résumé
summary(wine)
##  fixed.acidity   volatile.acidity  citric.acid    residual.sugar  
##  Min.   : 4.60   Min.   :0.1200   Min.   :0.000   Min.   : 0.900  
##  1st Qu.: 7.10   1st Qu.:0.3900   1st Qu.:0.090   1st Qu.: 1.900  
##  Median : 7.90   Median :0.5200   Median :0.260   Median : 2.200  
##  Mean   : 8.32   Mean   :0.5278   Mean   :0.271   Mean   : 2.539  
##  3rd Qu.: 9.20   3rd Qu.:0.6400   3rd Qu.:0.420   3rd Qu.: 2.600  
##  Max.   :15.90   Max.   :1.5800   Max.   :1.000   Max.   :15.500  
##    chlorides       free.sulfur.dioxide total.sulfur.dioxide    density      
##  Min.   :0.01200   Min.   : 1.00       Min.   :  6.00       Min.   :0.9901  
##  1st Qu.:0.07000   1st Qu.: 7.00       1st Qu.: 22.00       1st Qu.:0.9956  
##  Median :0.07900   Median :14.00       Median : 38.00       Median :0.9968  
##  Mean   :0.08747   Mean   :15.87       Mean   : 46.47       Mean   :0.9967  
##  3rd Qu.:0.09000   3rd Qu.:21.00       3rd Qu.: 62.00       3rd Qu.:0.9978  
##  Max.   :0.61100   Max.   :72.00       Max.   :289.00       Max.   :1.0037  
##        pH          sulphates         alcohol         quality     
##  Min.   :2.740   Min.   :0.3300   Min.   : 8.40   Min.   :3.000  
##  1st Qu.:3.210   1st Qu.:0.5500   1st Qu.: 9.50   1st Qu.:5.000  
##  Median :3.310   Median :0.6200   Median :10.20   Median :6.000  
##  Mean   :3.311   Mean   :0.6581   Mean   :10.42   Mean   :5.636  
##  3rd Qu.:3.400   3rd Qu.:0.7300   3rd Qu.:11.10   3rd Qu.:6.000  
##  Max.   :4.010   Max.   :2.0000   Max.   :14.90   Max.   :8.000
wine %>%
  select_if(is.numeric) %>%
  cor() %>% # Calcul de la matrice de corrélation empirique
  corrplot::corrplot() # représentation graphique de la matrice