HyperAIHyperAI

Command Palette

Search for a command to run...

De bruit à chiffre : Construire un DCGAN pour générer des chiffres MNIST avec PyTorch

Ils disaient que les machines ne pouvaient pas créer d'art. Puis sont arrivés les GAN. Imaginez une network neurale capable de générer des chiffres écrits à la main avec une telle réalisme qu'ils peuvent même tromper des yeux entraînés, ou encore de dessiner des articles de mode jamais vus auparavant. Ce n'est pas de la science-fiction, c'est la magie des Réseaux Adversariaux Génératifs (GAN). Proposés pour la première fois par Ian Goodfellow en 2014, les GAN ont déclenché une révolution dans la création de données synthétiques. Ces systèmes doubles comprennent une network génératrice qui produit des données et une network critique qui évalue leur authenticité. Les deux s'affrontent et collaborent dans une danse digitale jusqu'à ce que les données simulées ressemblent véritablement aux données réelles. Mais comment fonctionnent-ils réellement ? Et surtout, comment pouvez-vous construire un GAN vous-même ? Dans cet guide pratique, vous allez aller au-delà de la théorie. Vous allez former votre propre Deep Convolutional GAN (DCGAN) à l'aide de PyTorch. Nous utiliserons des jeux de données issus du monde réel et curated par Hugging Face pour générer des chiffres manuscrits et des images de mode. Prenons le temps d'explorer cette architecture, bloc par bloc. Vous découvrirez comment le processus de formation se déroule et observerez chaque amélioration de la network génératrice à travers les epochs, apprenant peu à peu à tromper sa rivale. À l'issue de ce guide, vous ne vous contenterez pas de comprendre comment opèrent les DCGAN. Vous aurez également bâti un modèle capable de faire preuve d'imagination. Nous maintiendrons le code simple, la logique claire comme de l'eau de roche, et les explications visuelles et compréhensibles, afin de faciliter votre apprentissage, que vous débutiez ou que vous soyez déjà familier avec les concepts de deep learning. Pour vous lancer, voici un aperçu du plan. Nous commencerons par une présentation des principes fondamentaux des GAN, avant de nous attarder sur les spécificités architecturales des DCGAN. Ensuite, nous explorerons chaque étape de l'implémentation et de l'entraînement dans PyTorch, en mettant l'accent sur la compréhension intuitive des mécanismes en jeu. Les GAN reprennent le principe d'un jeu antagoniste entre deux réseaux : un générateur et un discriminateur. Le générateur crée des données synthétiques à partir de bruit aléatoire, tandis que le discriminateur cherche à distinguer ces données synthétiques des données réelles. Au fil du temps, le générateur apprend à produire des données de plus en plus proches de la réalité, tandis que le discriminateur devient de plus en plus performant pour détecter les faux. Architecture des DCGAN Un DCGAN est une version spécialisée de GAN qui utilise des couche de convolution pour le générateur et le discriminateur. Cela permet de traiter efficacement des images et d'apprendre des caractéristiques hiérarchiques importantes. Le Générateur : Il prend en entrée un vecteur de bruit aléatoire et le transforme progressivement en une image réaliste grâce à une série de couches de déconvolution (ou transposées). Chaque couche agrandit et affine l'image jusqu'à la dimension finale souhaitée. Le Discriminateur : Il analyse les images en utilisant des couches de convolution pour extraire des caractéristiques pertinentes. Son objectif est de déterminer si une image est réelle ou synthétique, ce qui se traduit par une probabilité en sortie. Mise en place de l'environnement Installation de PyTorch : Assurez-vous d'avoir PyTorch installé, ainsi que les bibliothèques nécessaires pour le chargement et le traitement des données. Chargement des données : Utilisez les jeux de données MNIST et Fashion-MNIST, disponibles via les outils de Hugging Face. Implémentation en PyTorch Étape 1 : Définir les modèles ```python import torch import torch.nn as nn import torch.optim as optim Définir le générateur class Generator(nn.Module): def init(self, nz, ngf, nc): super(Generator, self).init() self.main = nn.Sequential( nn.ConvTranspose2d(nz, ngf * 8, 4, 1, 0, bias=False), nn.BatchNorm2d(ngf * 8), nn.ReLU(True), nn.ConvTranspose2d(ngf * 8, ngf * 4, 4, 2, 1, bias=False), nn.BatchNorm2d(ngf * 4), nn.ReLU(True), nn.ConvTranspose2d(ngf * 4, ngf * 2, 4, 2, 1, bias=False), nn.BatchNorm2d(ngf * 2), nn.ReLU(True), nn.ConvTranspose2d(ngf * 2, ngf, 4, 2, 1, bias=False), nn.BatchNorm2d(ngf), nn.ReLU(True), nn.ConvTranspose2d(ngf, nc, 4, 2, 1, bias=False), nn.Tanh() ) def forward(self, input): return self.main(input) Définir le discriminateur class Discriminator(nn.Module): def init(self, ndf, nc): super(Discriminator, self).init() self.main = nn.Sequential( nn.Conv2d(nc, ndf, 4, 2, 1, bias=False), nn.LeakyReLU(0.2, inplace=True), nn.Conv2d(ndf, ndf * 2, 4, 2, 1, bias=False), nn.BatchNorm2d(ndf * 2), nn.LeakyReLU(0.2, inplace=True), nn.Conv2d(ndf * 2, ndf * 4, 4, 2, 1, bias=False), nn.BatchNorm2d(ndf * 4), nn.LeakyReLU(0.2, inplace=True), nn.Conv2d(ndf * 4, ndf * 8, 4, 2, 1, bias=False), nn.BatchNorm2d(ndf * 8), nn.LeakyReLU(0.2, inplace=True), nn.Conv2d(ndf * 8, 1, 4, 1, 0, bias=False), nn.Sigmoid() ) def forward(self, input): return self.main(input).view(-1, 1).squeeze(1) ``` Étape 2 : Configurer les paramètres d'entraînement ```python Paramètres nz = 100 # Dimension du bruit aléatoire ngf = 64 # Feature maps pour le générateur ndf = 64 # Feature maps pour le discriminateur nc = 1 # Nombre de canaux de l'image (1 pour MNIST, 3 pour Fashion-MNIST) lr = 0.0002 # Taux d'apprentissage beta1 = 0.5 # Hyperparamètre pour l'optimiseur Adam Initialisation des modèles netG = Generator(nz, ngf, nc).to(device) netD = Discriminator(ndf, nc).to(device) Initialisation des optimiseurs optimizerG = optim.Adam(netG.parameters(), lr=lr, betas=(beta1, 0.999)) optimizerD = optim.Adam(netD.parameters(), lr=lr, betas=(beta1, 0.999)) Critère de perte criterion = nn.BCELoss() ``` Étape 3 : Entraîner le modèle L'entraînement se fait en alternant les phases d'optimisation du générateur et du discriminateur. Chaque époque comprend plusieurs iterations où : Le discriminateur est entraîné à reconnaître les vraies images du dataset et à rejeter les images générées. Le générateur est ensuite entrainé pour produire des images capables de tromper le discriminateur. ```python Boucle d'entraînement num_epochs = 200 for epoch in range(num_epochs): for i, data in enumerate(dataloader, 0): # Étape de l'entraînement du discriminateur netD.zero_grad() real_images = data[0].to(device) batch_size = real_images.size(0) label = torch.full((batch_size,), 1., device=device) output = netD(real_images) errD_real = criterion(output, label) errD_real.backward() noise = torch.randn(batch_size, nz, 1, 1, device=device) fake_images = netG(noise) label.fill_(0.) output = netD(fake_images.detach()) errD_fake = criterion(output, label) errD_fake.backward() optimizerD.step() # Étape de l'entraînement du générateur netG.zero_grad() label.fill_(1.) output = netD(fake_images) errG = criterion(output, label) errG.backward() optimizerG.step() # Afficher les erreurs et sauvegarder les images synthétiques régulièrement if (epoch % 10 == 0): print(f'Epoch [{epoch}/{num_epochs}] Loss D: {errD_real.item() + errD_fake.item()} Loss G: {errG.item()}') with torch.no_grad(): fake = netG(fixed_noise).detach().cpu() img_list.append(vutils.make_grid(fake, padding=2, normalize=True)) ``` Compréhension intuitive Lors de l'entraînement, l'objectif principal du générateur est de créer des images qui ressemblent autant que possible aux images réelles du dataset. Le discriminateur, quant à lui, doit être capable de distinguer les images réelles des fausses. Au fur et à mesure, le générateur apprend à se perfectionner, et le discriminateur doit constamment améliorer ses capacités d'évaluation. Résultats attendus Après quelques époques, vous devriez observer une amélioration notable dans la capacité du générateur à produire des images de chiffres manuscrits et d'articles de mode. Avec suffisamment d'iterations, ces images deviendront de plus en plus convaincantes, témoignant de l'efficacité de l'approche DCGAN. En conclusion, ce guide vous a mené du concept initial à la construction d'un DCGAN capable de générer des images de haute qualité. Grâce à une compréhension détaillée de l'architecture et du processus d'entraînement, vous êtes maintenant prêt à explorer davantage les possibilités offertes par les GAN et à appliquer ces techniques à d'autres domaines. Bonne chance dans vos prochains projets !

Liens associés

De bruit à chiffre : Construire un DCGAN pour générer des chiffres MNIST avec PyTorch | Articles tendance | HyperAI