Keras est une bibliothèque open source de haut niveau, écrite en Python, conçue pour simplifier la création et l'entraînement de modèles de deep learning. Elle offre une interface intuitive pour interagir avec différents backends de deep learning, tels que TensorFlow. Cet article explore en détail le concept des couches denses, un élément fondamental dans la construction de réseaux neuronaux avec Keras.
Préparation de l'environnement Keras
Avant de plonger dans les détails des couches denses, il est essentiel de configurer correctement votre environnement de développement. La méthode recommandée est d'utiliser Anaconda, une plateforme gratuite pour la science des données, qui inclut une installation Python et des bibliothèques essentielles.
Installation d'Anaconda
Pour installer Anaconda, suivez ces étapes :
- Téléchargement: Téléchargez le package d'installation adapté à votre système d'exploitation (macOS, Windows, Linux) depuis le site officiel d'Anaconda. Optez pour la version "Individual".
- Installation: Exécutez le fichier téléchargé et suivez les instructions d'installation.
Vérification de l'installation
Après l'installation, vérifiez qu'Anaconda et Python sont correctement configurés en ouvrant une ligne de commande (Terminal sur macOS) et en exécutant les commandes suivantes :
conda --version(pour afficher la version de Conda)python --version(pour afficher la version de Python)
Si vous rencontrez une erreur "Command not found", vous devrez peut-être configurer la variable d'environnement PATH pour inclure le chemin vers les binaires d'Anaconda.
Lire aussi: Couches bébé : guide d'achat
Mise à jour d'Anaconda
Avant de démarrer un nouveau projet, il est conseillé de mettre à jour les bibliothèques sous-jacentes avec les commandes suivantes :
conda update condaconda update --all
Installation de Keras et TensorFlow
Enfin, installez Keras et TensorFlow (ou un autre backend) en exécutant les commandes suivantes :
conda install tensorflowpip install keras
Vérifiez l'installation de Keras avec la commande :
python -c "import keras; print(keras.__version__)"
Si Keras est déjà installé, assurez-vous qu'il est à jour :
pip install --upgrade keras
Les Couches Denses (Dense Layers) : Le Cœur des Réseaux Neuronaux
Une couche dense, également appelée couche fully connected (entièrement connectée), est un type de couche neuronale où chaque neurone est connecté à tous les neurones de la couche précédente. Cette connectivité totale permet à la couche dense d'apprendre des relations complexes entre les caractéristiques (features) des données d'entrée.
Lire aussi: Causes et symptômes de la fausse couche
Fonctionnement d'une couche dense
- Entrée: La couche dense reçoit un vecteur d'entrée provenant de la couche précédente.
- Transformation linéaire: Chaque neurone de la couche dense effectue une transformation linéaire sur l'entrée en multipliant chaque élément de l'entrée par un poids (weight) associé à cette connexion, puis en ajoutant un biais (bias).
- Fonction d'activation: Le résultat de la transformation linéaire est ensuite passé à travers une fonction d'activation non linéaire. Cette fonction introduit de la non-linéarité dans le modèle, ce qui lui permet d'apprendre des relations complexes.
- Sortie: La sortie de chaque neurone est un scalaire, et l'ensemble des sorties de tous les neurones forme le vecteur de sortie de la couche dense.
Paramètres importants des couches denses
units: Le nombre de neurones (ou unités) dans la couche dense. Ce paramètre détermine la dimensionnalité du vecteur de sortie de la couche.activation: La fonction d'activation à utiliser. Les fonctions d'activation courantes incluentrelu,sigmoid,tanh, etsoftmax. Le choix de la fonction d'activation dépend du type de problème et de la couche dans le réseau.use_bias: Un booléen indiquant si la couche doit utiliser un biais. Par défaut, il est défini surTrue.kernel_initializer: La méthode d'initialisation des poids.bias_initializer: La méthode d'initialisation des biais.
Fonctions d'Activation: Introduction
Les fonctions d'activation sont des éléments essentiels des réseaux neuronaux. Elles introduisent de la non-linéarité, permettant aux réseaux d'apprendre des relations complexes.
- Sigmoïde : Fonction d'activation qui renvoie une valeur entre 0 et 1. Utile pour les problèmes de classification binaire.
- ReLU (Rectified Linear Unit) : Fonction d'activation qui renvoie la valeur d'entrée si elle est positive, sinon elle renvoie 0. Populaire pour les couches cachées.
- Tanh (Tangente Hyperbolique) : Fonction d'activation qui renvoie une valeur entre -1 et 1.
- Softmax : Fonction d'activation qui convertit un vecteur de nombres réels en une distribution de probabilités. Utilisée dans la couche de sortie pour les problèmes de classification multi-classes.
Exemple de code Keras
Voici un exemple simple de création d'un modèle avec une couche dense dans Keras :
from keras.models import Sequentialfrom keras.layers import Densemodel = Sequential()model.add(Dense(units=32, activation='relu', input_dim=784)) # Première couche dense avec 32 neurones, fonction d'activation ReLU et une dimension d'entrée de 784model.add(Dense(units=10, activation='softmax')) # Couche de sortie avec 10 neurones (pour la classification de 10 classes) et fonction d'activation SoftmaxDans cet exemple :
Sequentialest un modèle linéaire où les couches sont ajoutées séquentiellement.- La première couche
Densea 32 neurones, utilise la fonction d'activation ReLU et attend une entrée de dimension 784 (par exemple, une image aplatie de 28x28 pixels). L'argumentinput_dimest nécessaire seulement pour la première couche afin de spécifier la forme des données d'entrée. - La deuxième couche
Densea 10 neurones et utilise la fonction d'activation Softmax, typique pour la couche de sortie d'un problème de classification multi-classes.
Importance de la forme d'entrée
Le modèle doit connaître la forme d'entrée attendue. C'est pourquoi la première couche d'un modèle séquentiel doit recevoir les caractéristiques de la forme d'entrée via l'argument input_shape.
Compilation du modèle
Avant d'entraîner le modèle, il faut le compiler en spécifiant :
Lire aussi: Couche-Tard : Stratégies et développement
optimizer: L'algorithme d'optimisation à utiliser pour ajuster les poids du modèle.loss: La fonction de coût (loss function) que le modèle va minimiser.metrics: Une liste de métriques à évaluer pendant l'entraînement.
Exemple:
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])Entraînement du modèle
Les modèles Keras sont entraînés sur des tableaux Numpy d'entrées et de labels. Utilisez la méthode fit pour entraîner le modèle :
model.fit(x_train, y_train, epochs=10, batch_size=32)Validation des données
On peut valider les données avec l'argument validation_data=(x_val, y_val).
Exemple concret : Classification d'images avec MNIST
Pour illustrer l'utilisation des couches denses, prenons l'exemple de la classification des chiffres manuscrits de la base de données MNIST.
Préparation des données
Chargement des données: Keras fournit une fonction pour charger facilement les données MNIST :
from keras.datasets import mnist(x_train, y_train), (x_test, y_test) = mnist.load_data()Prétraitement:
- Normaliser les valeurs des pixels entre 0 et 1 :
x_train = x_train.astype('float32') / 255etx_test = x_test.astype('float32') / 255 - Aplatir les images 2D en vecteurs 1D :
x_train = x_train.reshape((60000, 784))etx_test = x_test.reshape((10000, 784)) - Convertir les labels en codage one-hot :
pythonfrom keras.utils import to_categoricaly_train = to_categorical(y_train, num_classes=10)y_test = to_categorical(y_test, num_classes=10)
- Normaliser les valeurs des pixels entre 0 et 1 :
Construction du modèle
model = Sequential()model.add(Dense(units=512, activation='relu', input_dim=784)) # Couche dense avec 512 neurones et fonction d'activation ReLUmodel.add(Dense(units=10, activation='softmax')) # Couche de sortie avec 10 neurones et fonction d'activation SoftmaxCompilation et entraînement
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])model.fit(x_train, y_train, epochs=10, batch_size=32, validation_data=(x_test, y_test))Ce modèle simple utilise une couche dense avec 512 neurones et une couche de sortie avec 10 neurones (un pour chaque chiffre). La fonction d'activation ReLU est utilisée dans la couche cachée, et la fonction Softmax est utilisée dans la couche de sortie pour produire une distribution de probabilité sur les 10 classes.
Réseaux de Neurones Convolutifs (CNN) et Couches Denses
Les couches denses sont souvent utilisées en conjonction avec les réseaux de neurones convolutifs (CNN). Les CNN sont particulièrement efficaces pour le traitement d'images, car ils exploitent la structure spatiale des données.
Architecture typique d'un CNN
- Couches de convolution: Extraient des caractéristiques (features) locales de l'image en appliquant des filtres de convolution.
- Couches de pooling (Max Pooling): Réduisent la dimensionnalité des cartes de caractéristiques (feature maps) et rendent le modèle plus robuste aux variations spatiales.
- Couches denses: Prennent en entrée les caractéristiques extraites par les couches de convolution et effectuent la classification finale.
Exemple de CNN avec Keras
from keras.layers import Conv2D, MaxPooling2D, Flattenmodel = Sequential()model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) # Couche de convolution avec 32 filtres de taille 3x3model.add(MaxPooling2D((2, 2))) # Couche de Max Pooling de taille 2x2model.add(Conv2D(64, (3, 3), activation='relu')) # Couche de convolution avec 64 filtres de taille 3x3model.add(MaxPooling2D((2, 2))) # Couche de Max Pooling de taille 2x2model.add(Flatten()) # Aplatit la sortie des couches de convolution en un vecteur 1Dmodel.add(Dense(units=10, activation='softmax')) # Couche dense pour la classificationDans cet exemple :
Conv2Dcrée des couches de convolution pour extraire des caractéristiques des images.MaxPooling2Dréduit la dimensionnalité des cartes de caractéristiques.Flattenconvertit la sortie 2D des couches de convolution en un vecteur 1D qui peut être utilisé comme entrée pour la couche dense.
Visualisation des Activations Intermédiaires
Pour comprendre comment un CNN traite les données, il est utile de visualiser les activations intermédiaires, c'est-à-dire les sorties des différentes couches du réseau. Cela permet de voir comment l'image d'entrée est transformée à travers les couches de convolution et de pooling.
Extraction des cartes de caractéristiques (feature maps)
Pour extraire les cartes de caractéristiques, on peut créer un nouveau modèle Keras qui prend en entrée l'image et produit en sortie les activations des couches intermédiaires.
from keras.models import Modellayer_outputs = [layer.output for layer in model.layers[:8]] # Extraction des sorties des 8 premières couchesactivation_model = Model(inputs=model.input, outputs=layer_outputs) # Création d'un modèle qui renvoie ces sortiesactivations = activation_model.predict(img_tensor) # Prédiction sur une imageVisualisation des activations
On peut ensuite visualiser les activations de chaque couche en affichant les cartes de caractéristiques.
import matplotlib.pyplot as pltfirst_layer_activation = activations[0]print(first_layer_activation.shape) # Affiche la forme de la carte de caractéristiques de la première couche (ex: (1, 26, 26, 32))plt.matshow(first_layer_activation[0, :, :, 4], cmap='viridis') # Affiche le 4ème canal de la première coucheEn visualisant les activations, on peut observer comment les premières couches détectent des caractéristiques simples comme les bords et les coins, tandis que les couches suivantes combinent ces caractéristiques pour détecter des motifs plus complexes.
Limites des RNN Simples
Bien qu'ils soient construits spécifiquement pour gérer des séquences, les RNN simples ont certaines limites.
Un modèle à mémoire courte
Une couche RNN est une succession de cellules, chacune prenant en entrée la représentation du caractère courant ainsi que la sortie de la cellule précédente. Ces données d'entrée sont transformées, en passant notamment par une fonction tangente hyperbolique.
La tangente hyperbolique a tendance à écraser les valeurs qu'elle prend en entrée. Ainsi, après un premier passage par la tangente hyperbolique, on obtient une valeur entre -1 et 1. Ensuite, comme tanh(1) = 0.76 et tanh(-1) = -0.76, un deuxième passage par la fonction tanh résulte en un intervalle de valeurs encore plus réduit, et ainsi de suite.
Un modèle difficile à entraîner
L'une des principales difficultés pour entraîner des réseaux de type RNN est le problème du vanishing gradient.
Un réseau de neurones est un enchaînement de fonctions simples, prenant en entrée les données de notre problème X. Dans notre exemple de génération de texte, il s'agit des N séquences de taille T.
Cet enchaînement de fonctions a comme paramètres des poids W. L'apprentissage consiste à ajuster les poids W afin de minimiser une erreur, donnée par une fonction de coût L.
Le LSTM : un RNN amélioré
Plusieurs variantes aux RNN standards ont vu le jour pour remédier aux problèmes évoqués précédemment. Nous allons ici décrire les LSTM, pour Long Short-Term Memory. Ce type de RNN est très utilisé en traitement du langage naturel.
L'idée derrière ce choix d'architecture de réseaux de neurones est de diviser le signal entre ce qui est important à court terme à travers le hidden state (analogue à la sortie d'une cellule de RNN simple), et ce qui l'est à long terme, à travers le cell state, qui sera explicité plus bas. Ainsi, le fonctionnement global d'un LSTM peut se résumer en 3 étapes :
- Détecter les informations pertinentes venant du passé, piochées dans le cell state à travers la forget gate ;
- Choisir, à partir de l'entrée courante, celles qui seront pertinentes à long terme, via l'input gate.
tags: #couche #dense #keras #explication