AI002

Deep Learning appliqué avec PyTorch (de zéro à maîtrise)

Ce cours propose une introduction complète au Deep Learning en utilisant PyTorch, le framework le plus populaire pour la recherche en apprentissage automatique. En partant des fondamentaux des tenseurs, les étudiants suivront l'intégralité du flux de travail ML, la vision par ordinateur, l'ingénierie logicielle modulaire, le transfert d'apprentissage et le déploiement des modèles. Le programme est basé sur le "code d'abord", en mettant l'accent sur l'implémentation pratique et l'expérimentation.

5.0 Évaluation
512 Étudiants

Aperçu du cours

📚 Résumé du contenu

Ce cours offre une introduction complète au deep learning en utilisant PyTorch, le cadre le plus populaire pour la recherche en apprentissage automatique. En partant des bases des tenseurs, les étudiants progresseront à travers l'intégralité du flux de travail d'apprentissage automatique, la vision par ordinateur, l'ingénierie logicielle modulaire, le transfert d'apprentissage et le déploiement des modèles. Le programme est conçu selon une approche "code-first", mettant l'accent sur l'implémentation pratique et l'expérimentation, garantissant que les étudiants non seulement comprennent la théorie mais peuvent aussi concevoir, optimiser et déployer des systèmes robustes de deep learning.

Un bref résumé des objectifs principaux consiste à maîtriser l'écosystème PyTorch dans sa globalité, passant des mathématiques fondamentales aux applications de vision par ordinateur prêtes pour la production.

🎯 Objectifs d'apprentissage

  1. Implémenter l'intégralité du flux de travail machine learning PyTorch, depuis les opérations fondamentales sur les tenseurs jusqu'à l'entraînement, l'évaluation et la persistance du modèle.
  2. Concevoir et déployer des architectures de deep learning, y compris les réseaux de neurones artificiels (ANN) et les réseaux de neurones convolutifs (CNN), pour des tâches complexes de classification et de vision par ordinateur.
  3. Transformer un code expérimental en logiciel modulaire prêt pour la production en adoptant des pratiques d'ingénierie standardisées et des structures de répertoires définies.
  4. Utiliser des techniques avancées comme le transfert d'apprentissage et le suivi systématique des expériences (TensorBoard) afin d'obtenir des résultats de pointe sur des jeux de données personnalisés.
  5. Préparer et déployer des modèles entraînés dans des applications web interactives et tirer parti des fonctionnalités modernes de PyTorch 2.0 pour accélérer l'inférence.

🔹 Leçon 1 : Fondamentaux de PyTorch

Aperçu : Cette leçon fondamentale présente PyTorch et sa structure de données centrale : le tenseur. Nous commencerons par expliquer pourquoi PyTorch est le cadre privilégié pour la recherche moderne en deep learning, en insistant sur son graphe computationnel dynamique. L'accent technique principal porte sur la maîtrise de la manipulation des tenseurs. Les étudiants apprendront à initialiser des tenseurs — allant des scalaires 0D aux matrices de dimensions supérieures — en utilisant diverses méthodes (par exemple torch.zeros(), torch.rand()). Les opérations cruciales seront couvertes, notamment les opérations arithmétiques élémentaires (addition, multiplication) et les opérations spécifiques d'algèbre linéaire comme la multiplication matricielle (torch.matmul). Nous aborderons également des techniques de gestion structurale, telles que l'indexation, le découpage, le redimensionnement (.view(), .reshape()) et la suppression des dimensions redondantes (.squeeze()). Enfin, nous traiterons le concept essentiel d'utiliser différents appareils (CPU vs GPU) via .to(), préparant ainsi les étudiants à une computation accélérée dans les leçons suivantes.

Objectifs d'apprentissage :

  • Expliquer le rôle des tenseurs comme structure de données fondamentale en deep learning et dans PyTorch.
  • Créer et initialiser des tenseurs PyTorch de différentes dimensions (scalaires, vecteurs, matrices) en utilisant des méthodes intégrées.
  • Effectuer des opérations arithmétiques standard sur les tenseurs et des opérations spécialisées comme la multiplication matricielle.
  • Manipuler la structure des tenseurs à l’aide de techniques d’indexation, de découpage, de redimensionnement et de compression.
  • Déplacer efficacement les tenseurs entre les appareils CPU et GPU pour une computation accélérée.

🔹 Leçon 2 : Le flux de travail PyTorch

Aperçu : Cette leçon établit le flux de travail PyTorch essentiel et reproductible en implémentant un modèle de régression linéaire simple à partir de zéro. Nous commençons par la préparation des données, en nous concentrant sur la génération de données synthétiques et leur division en ensembles d'entraînement et de test, en soulignant l'importance de l'alignement des types de données et des appareils (CPU/GPU). Ensuite, nous définissons l'architecture du modèle en héritant correctement de torch.nn.Module et en implémentant la passe forward. Le cœur du flux de travail consiste à choisir des fonctions de perte adaptées (comme nn.L1Loss pour la régression) et des optimiseurs (la descente de gradient stochastique ou SGD). Nous construirons ensuite minutieusement la boucle d'entraînement (passage avant, calcul de la perte, remise à zéro des gradients, passage arrière, étape de l'optimiseur) et la boucle de test/évaluation pour mesurer les performances. Enfin, nous conclurons ce cadre en apprenant à sauvegarder les dictionnaires d'état du modèle entraîné avec torch.save() puis à les charger à nouveau pour l'inférence ou la réutilisation, complétant ainsi tout le cycle ML end-to-end.

Objectifs d'apprentissage :

  • Structurer et implémenter les six étapes fondamentales du flux de travail machine learning end-to-end PyTorch.
  • Construire un modèle linéaire simple en définissant correctement une classe héritant de torch.nn.Module.
  • Appliquer des fonctions de perte appropriées (nn.L1Loss) et des optimiseurs (torch.optim.SGD) pour des tâches de régression basiques.
  • Définir et exécuter la boucle d'entraînement, incluant la rétropropagation et la descente de gradient, ainsi que la boucle d'évaluation distincte.
  • Mettre en œuvre la fonctionnalité de sauvegarde et de chargement des dictionnaires d’état du modèle à l’aide des outils PyTorch pour la persistance du modèle.

🔹 Leçon 3 : Classification par réseau de neurones

Aperçu : Cette leçon applique le flux de travail PyTorch à la résolution de problèmes de classification non linéaires, en dépassant la simple régression linéaire. Nous commençons par distinguer les scénarios binaires et multiclasse, et montrons comment structurer la dernière couche de sortie en utilisant des activations Sigmoid (pour les cas binaires) et Softmax (pour les cas multiclasse). Le concept crucial de la non-linéarité est introduit en intégrant des fonctions d'activation ReLU dans les couches cachées, permettant au réseau d’apprendre des frontières de décision complexes. Les étudiants implémenteront les fonctions de perte correctes pour la classification : BCEWithLogitsLoss et CrossEntropyLoss. La partie pratique consiste à générer et entraîner un réseau de neurones sur un jeu de données synthétique complexe (par exemple, le jeu de données 'moons') et à tracer visuellement la surface de décision résultante pour confirmer la capacité du réseau à séparer efficacement les points de données non linéaires, assurant ainsi une maîtrise des architectures fondamentales de modèles de deep learning.

Objectifs d'apprentissage :

  • Différencier et implémenter des modèles PyTorch pour des tâches de classification binaire et multiclasse.
  • Expliquer la nécessité des fonctions d'activation non linéaires (ReLU, Sigmoid, Softmax) pour permettre des frontières de décision complexes.
  • Appliquer des fonctions de perte adaptées (BCEWithLogitsLoss, CrossEntropyLoss) et calculer des métriques de précision de classification.
  • Implémenter l’intégralité du flux de travail de classification PyTorch sur un jeu de données non linéaire.
  • Visualiser la frontière de décision apprise par un modèle et interpréter sa capacité à classer les points de données.

🔹 Leçon 4 : Vision par ordinateur avec CNNs

Aperçu : Cette session marque la transition cruciale du traitement des données structurées vers le traitement des données d’image à haute dimension, nécessitant des architectures de deep learning spécialisées. Nous commencerons par démystifier la représentation des images sous forme de tenseurs PyTorch multidimensionnels, en nous concentrant intensivement sur la notation standard de forme (N, C, H, W : taille du lot, canaux, hauteur, largeur). Le noyau théorique introduit les Réseaux de Neurones Convolutifs (CNN) en expliquant comment les couches de convolution (nn.Conv2d) extraient efficacement des caractéristiques spatiales locales, et comment les couches de pooling (nn.MaxPool2d) réduisent la dimensionnalité tout en préservant les informations importantes. Par une approche centrée sur le code, nous construirons ensuite et entraînerons une architecture CNN complète, à petite échelle — une réplique TinyVGG — à partir de zéro, fournissant un exemple concret d’un modèle de vision par ordinateur fonctionnel. Enfin, nous comparerons les différences fondamentales entre cette architecture CNN et les réseaux linéaires utilisés précédemment pour consolider l’intuition sur la raison pour laquelle les CNN surpassent les autres architectures dans la reconnaissance de motifs d’images.

Objectifs d'apprentissage :

  • Expliquer et utiliser le format de tenseur (N, C, H, W) pour représenter les données d’image dans PyTorch.
  • Implémenter des couches Convolutives (nn.Conv2d) et de Pooling (nn.MaxPool2d) dans un modèle PyTorch.
  • Construire et entraîner une architecture CNN complète et à petite échelle (une réplique TinyVGG) pour une tâche de classification.
  • Expliquer les différences fondamentales en matière d’extraction de caractéristiques et de partage de poids entre les couches linéaires et les CNN.

🔹 Leçon 5 : Jeux de données personnalisés

Aperçu : Cette session cruciale comble l’écart entre les exemples structurés et simplifiés (comme MNIST) et les données réelles complexes et non structurées, préparant le terrain pour le projet pratique "FoodVision" en vision par ordinateur. Nous commencerons par apprendre à structurer correctement les répertoires de données pour PyTorch, en utilisant la classe très efficace torchvision.datasets.ImageFolder pour le chargement automatique et l’inférence des étiquettes à partir des chemins des fichiers. De manière cruciale, nous maîtriserons le concept de la classe personnalisée torch.utils.data.Dataset, qui donne un contrôle total sur la logique de chargement des données, le prétraitement et la gestion des étiquettes pour des formats de données arbitraires. Nous introduirons ensuite DataLoader pour gérer efficacement le regroupement en lots, le mélange et le chargement multi-threadé. Enfin, la session couvrira des techniques essentielles d’augmentation de données et les transformations PyTorch, qui sont vitales pour agrandir la taille effective des jeux de données limités et améliorer la généralisation et la robustesse du modèle.

Objectifs d'apprentissage :

  • Structurer les données d’image du monde réel selon le format de répertoire attendu par les outils PyTorch.
  • Utiliser torchvision.datasets.ImageFolder pour charger efficacement des jeux de données d’images personnalisés depuis le disque.
  • Implémenter une classe personnalisée torch.utils.data.Dataset pour gérer des besoins de chargement de données uniques ou complexes.
  • Appliquer une gamme de torchvision.transforms pour le prétraitement (redimensionnement, conversion en tenseur) et l’augmentation de données (rotation, retournement).
  • Intégrer la classe Dataset avec DataLoader pour gérer le regroupement en lots, le mélange et le chargement parallèle optimisé.

🔹 Leçon 6 : Passer à la modularité (Ingénierie logicielle)

Aperçu : Cette session est essentielle pour passer du code expérimental des notebooks Jupyter à des pratiques d’ingénierie logicielle durables et prêtes pour la production dans l’écosystème PyTorch. Nous aborderons les étapes obligatoires pour refactoriser un code monolithique de notebook en scripts Python structurés et réutilisables. Le concept central consiste à instaurer une structure de projet PyTorch standardisée, en séparant les préoccupations en modules dédiés. Les modules clés à créer incluent data_setup.py (gestion du chargement des données, des transformations et des DataLoaders), model_builder.py (contenant les définitions de modèles héritant de nn.Module) et engine.py (gérant les boucles d’entraînement et de test). Enfin, les étudiants apprendront à initialiser et exécuter tout le flux d’entraînement — y compris la définition des hyperparamètres et le choix de l’appareil — directement depuis la ligne de commande en utilisant l’exécution standard Python, ce qui est essentiel pour le déploiement et les expérimentations à grande échelle.

Objectifs d'apprentissage :

  • Expliquer les différences entre le code expérimental de notebook et une architecture de script Python structurée et modulaire.
  • Mettre en œuvre une structure de répertoire de projet PyTorch standardisée conçue pour l’évolutivité et la collaboration.
  • Refactoriser la logique existante d’entraînement de modèle en modules distincts et réutilisables (ex. data_setup.py, model_builder.py, engine.py).
  • Configurer un script d’exécution principal pour lancer tout le processus d’entraînement depuis la ligne de commande.
  • Décrire les avantages pratiques du code modulaire concernant le test, le contrôle de version et la préparation au déploiement en production.

🔹 Leçon 7 : Transfert d’apprentissage

Aperçu : Le transfert d’apprentissage est une technique puissante qui permet d’utiliser les connaissances acquises à partir de modèles entraînés sur de grands jeux de données, comme ImageNet, et de les appliquer efficacement à des problèmes plus petits et spécialisés. Cette session introduit la théorie fondamentale, en insistant sur le fait que les poids pré-entraînés (spécifiquement à partir de modèles comme ResNet ou EfficientNet via torchvision.models) sont cruciaux pour atteindre des résultats de pointe avec moins de données et de temps de calcul. L’implémentation pratique se concentre sur l'extraction de caractéristiques : les étudiants apprendront à charger un modèle, à figer les paramètres de ses couches de base convolutives en utilisant requires_grad=False de PyTorch, puis à remplacer stratégiquement et à entraîner uniquement la tête de classification finale adaptée à un nouveau domaine cible, comme le projet 'FoodVision' en cours. Nous comparerons également cette méthode à l’approche plus coûteuse en ressources du fine-tuning de toute la réseau.

Objectifs d'apprentissage :

  • Expliquer l'avantage théorique et les scénarios courants où le transfert d'apprentissage est nécessaire.
  • Charger et inspecter des architectures de modèles pré-entraînés courantes à l'aide de l'outil torchvision.models de PyTorch.
  • Mettre en œuvre l'extraction de caractéristiques en figeant correctement les paramètres des couches de base convolutives.
  • Modifier la tête du classificateur d'un modèle pré-entraîné pour gérer de nouvelles tâches de classification personnalisées.
  • Différencier les stratégies d'extraction de caractéristiques (figeage) et de fine-tuning (défigeage).

🔹 Leçon 8 : Suivi des expériences (Projet phare 1)

Aperçu : Alors que nous passons de l'entraînement d'un seul modèle à des comparaisons sophistiquées (par exemple, comparer un CNN vanilla à un modèle utilisant le transfert d'apprentissage), la journalisation manuelle devient insuffisante. Cette leçon établit la pratique cruciale du suivi systématique des expériences. Nous introduirons et mettrons en œuvre la solution native de PyTorch, torch.utils.tensorboard.SummaryWriter, pour enregistrer et gérer les données de performance. Les étudiants apprendront à instrumenter leurs boucles d'entraînement pour enregistrer des métriques scalaires essentielles, telles que la perte d'entraînement et de test, la précision et les taux d'apprentissage par epoch. L'objectif principal est de maîtriser le lancement et l'utilisation de l'interface TensorBoard pour comparer visuellement les résultats de plusieurs exécutions côte à côte, permettant une analyse objective des changements d'hyperparamètres, des décisions architecturales et des stratégies d'optimisation, garantissant ainsi la reproductibilité et accélérant l'amélioration du modèle.

Objectifs d'apprentissage :

  • Expliquer la nécessité d’un suivi systématique des expériences pour assurer la reproductibilité et l’efficacité du deep learning.
  • Implémenter la classe torch.utils.tensorboard.SummaryWriter pour enregistrer des métriques scalaires (perte, précision) au sein d’une boucle d’entraînement PyTorch.
  • Lancer et naviguer dans l’interface TensorBoard pour visualiser les courbes de métriques et comparer les performances de différentes exécutions expérimentales.
  • Appliquer des techniques de suivi pour comparer systématiquement l’impact de réglages d’hyperparamètres variés (ex. taille du lot, taux d’apprentissage) et d’architectures de modèles.

🔹 Leçon 9 : Réplication de papiers (Projet phare 2)

Aperçu : Cette leçon constitue le sommet du cours, défiant les étudiants de traduire la recherche théorique en code fonctionnel en reproduisant une architecture moderne à partir d’un article scientifique. Nous commencerons par démystifier la structure d’un article typique de ML, en nous concentrant particulièrement sur la façon d’extraire les détails architecturaux et les formulations mathématiques de la section Méthodologie. La tâche technique centrale consiste à mapper des équations mathématiques complexes — comme celles régissant les mécanismes d’attention ou les nouveaux types de couches — directement en modules PyTorch en utilisant des classes nn.Module personnalisées. Un exemple moderne, comme le Vision Transformer (ViT), sera utilisé comme cas d’étude pour l’implémentation. L’accent sera mis sur des stratégies de débogage systématiques nécessaires pour les modèles complexes à plusieurs composants, en abordant des défis comme la compatibilité des formes, l’initialisation des poids et la vérification du flux de gradients, garantissant ainsi que les étudiants peuvent réussir à implémenter des modèles de pointe à partir de zéro.

Objectifs d'apprentissage :

  • Décortiquer et analyser les descriptions architecturales et les notations mathématiques présentées dans les articles de recherche en apprentissage automatique.
  • Traduire des étapes algorithmiques complexes et des formules (ex. mécanismes d’attention auto) directement en code PyTorch idiomatique en utilisant des classes nn.Module personnalisées.
  • Implémenter et intégrer tous les composants requis d’une architecture de deep learning moderne et complexe (ex. Vision Transformer) entièrement à partir de zéro.
  • Appliquer des stratégies avancées de débogage pour résoudre des erreurs de forme, des incompatibilités matérielles et des erreurs logiques rencontrées lors de la réplication de modèles de pointe.

🔹 Leçon 10 : Déploiement des modèles & PyTorch 2.0

Aperçu : Cette dernière leçon se concentre sur la transition d’un modèle PyTorch entraîné de l’environnement de recherche vers une application web interactive accessible au public. Nous commencerons par apprendre les étapes cruciales de préparation d’un modèle pour le déploiement, en nous concentrant sur le chargement efficace et l’inférence en production. L’activité principale pratique consiste à créer une démonstration web fonctionnelle en utilisant des outils de prototypage rapide comme Gradio ou Streamlit, permettant aux utilisateurs finaux d’entrer des données et de recevoir instantanément des prédictions. Nous couvrirons des stratégies pratiques pour héberger ces applications, en exploitant des plateformes comme Hugging Face Spaces. Enfin, nous consacrerons du temps à explorer l’avenir du cadre, en particulier les améliorations de performance et les fonctionnalités de compilation introduites dans PyTorch 2.0, en démontrant comment des innovations comme torch.compile offrent des gains significatifs de vitesse tant pour l’entraînement que pour le déploiement.

Objectifs d'apprentissage :

  • Préparer un artefact de modèle PyTorch entraîné pour un chargement et une inférence efficaces en production.
  • Développer une interface de démonstration web fonctionnelle et interactive en utilisant soit Gradio soit Streamlit.
  • Héberger l’application de machine learning développée sur une plateforme publique (ex. Hugging Face Spaces).
  • Expliquer le concept fondamental et le mécanisme de la fonctionnalité torch.compile de PyTorch 2.0.
  • Intégrer les connaissances en déploiement avec les pratiques de code modulaire précédentes pour créer un projet final complet et end-to-end.