Ismail Ben Alla

GAN Workbench

Dix variantes de GAN sur une seule boucle d’entraînement

IA générative · oct. 2026 · Terminé

Dix variantes de GAN derrière une seule boucle d’entraînement : mêmes données, même budget, mêmes métriques, seule la méthode change.

Construit avecPyTorchtorchvisionMatplotlibpytestKaggle

GAN Workbench — vue d’ensemble

Présentation

Un GAN, ce sont deux réseaux entraînés l’un contre l’autre : un générateur qui transforme du bruit en images et un discriminateur qui essaie de les distinguer des vraies. Depuis 2014, ce jeu a été rafistolé de nombreuses fois avec de nouvelles fonctions de perte, de nouveaux réseaux et de nouvelles façons de tenir le discriminateur en respect, et les articles se comparent rarement dans les mêmes conditions. Je voulais voir chaque correctif agir isolément, j’ai donc écrit dix variantes en PyTorch pur : le GAN original, DCGAN, le GAN conditionnel, ACGAN, LSGAN, WGAN, WGAN-GP, SNGAN (hinge loss avec spectral norm), pix2pix et CycleGAN.

Elles partagent une seule boucle d’entraînement, un seul pipeline de données et une seule évaluation. Une méthode est un petit objet qui définit un pas du discriminateur et un pas du générateur ; la boucle décide quand ils s’exécutent et ce qui est mesuré, si bien que changer de méthode tient en un flag et que chaque run reçoit les mêmes graines, le même ordre des données et le même nombre de mises à jour du générateur. Les réseaux sont volontairement petits (0.1-3 M paramètres) pour qu’on puisse observer chaque mécanisme sur un CPU en quelques minutes, et un notebook Kaggle/Colab fait tourner le même code plus longtemps sur GPU.

Sur MNIST, le conditionnement l’emporte (FID cGAN 29.6, ACGAN 44.1), la spectral norm avec la hinge loss est la meilleure méthode non conditionnelle (57.5), et le WGAN avec weight clipping n’arrive pas à s’entraîner dans le budget (1035.5) tant que la pénalité de gradient ne remplace pas le clipping (127.2). Sur les formes synthétiques, pix2pix apprend la conversion photo-vers-masque presque parfaitement (IoU 0.977), tandis que CycleGAN trouve le raccourci de « stéganographie » bien connu et n’atteint qu’un IoU de 0.28. Le dépôt est né de deux notebooks de cours ; leurs onze bugs, dont des optimiseurs construits pour des réseaux remplacés ensuite, sont documentés et couverts par des tests.

La question

Si dix variantes de GAN partagent les mêmes données, le même budget, la même boucle et les mêmes métriques, lesquelles de leurs différences (fonction de perte, conditionnement, contrôle de Lipschitz, convolutions) comptent vraiment sur un run à l’échelle d’un CPU ?

Fonctionnalités clés

Comment ça marche

  1. Une seule boucle

    Chaque pas exécute n_critic mises à jour du discriminateur puis une mise à jour du générateur, met éventuellement à jour une copie EMA de G, et journalise les pertes, D(x), D(G(z)) et les ratios de mise à jour. La boucle décide quand les choses s’exécutent ; la méthode décide de ce qu’elles sont.

  2. Une méthode, ce sont deux pas

    NoiseGAN, Pix2Pix et CycleGAN définissent chacun un pas de D et un pas de G à partir d’une table METHODS qui fixe les réseaux, la perte (BCE, moindres carrés, Wasserstein, hinge), le conditionnement, le contrôle de Lipschitz et les réglages d’optimiseur par défaut.

  3. Tenir D en respect

    DCGAN s’appuie sur la BatchNorm ; WGAN écrête chaque poids du critique à ±0.01 après chaque pas ; WGAN-GP pénalise la norme du gradient sur des interpolations réel/faux et supprime la BatchNorm ; SNGAN divise chaque couche de D par sa plus grande valeur singulière.

  4. Image vers image

    pix2pix utilise un générateur U-Net, un discriminateur PatchGAN qui juge des paires (entrée, sortie) et un terme L1 pondéré par 100x. CycleGAN utilise deux U-Net, deux PatchGAN, une perte aux moindres carrés et un L1 de cycle pondéré par 10x, sans aucune paire.

  5. Évaluer

    5,000 échantillons sont comparés à 5,000 images de test dans l’espace de features à 128 dimensions du petit classifieur : distance de Fréchet, un analogue de l’IS, le nombre de classes qui reçoivent au moins 1/(4K) des échantillons, et la précision des labels pour les modèles conditionnels.

Exemples

Progression de l’entraînement sur MNIST pour DCGAN, cGAN, SNGAN et WGAN-GP : le même bruit fixe (et, pour cGAN, les mêmes labels) rejoué à travers des instantanés d’un court run CPU, du gris uniforme au pas 0 jusqu’aux chiffres.
pix2pix sur des photos de formes de test non vues. Lignes : photo d’entrée, sortie du générateur et vrai masque ; la ligne du milieu passe du gris uniforme au pas 0 à des masques propres après 800 pas.
Générateurs non entraînés contre entraînés avec le même z : un générateur non entraîné produit du gris uniforme pour toute entrée, car ses poids N(0, 0.02) maintiennent le tanh final près de 0.
Générateurs non entraînés contre entraînés avec le même z : un générateur non entraîné produit du gris uniforme pour toute entrée, car ses poids N(0, 0.02) maintiennent le tanh final près de 0.
Échantillons des huit méthodes bruit-vers-image après 2,000 pas du générateur sur MNIST. Le WGAN avec weight clipping (FID 1035.5) reste gris et effondré ; cGAN (29.6) et ACGAN (44.1) dessinent le chiffre demandé.
Échantillons des huit méthodes bruit-vers-image après 2,000 pas du générateur sur MNIST. Le WGAN avec weight clipping (FID 1035.5) reste gris et effondré ; cGAN (29.6) et ACGAN (44.1) dessinent le chiffre demandé.
Aller-retour CycleGAN après 2,000 pas. Lignes : a, G_AB(a), G_BA(G_AB(a)), le vrai contour. G_AB cache la forme pleine dans un motif à peine visible que G_BA relit, si bien que l’erreur de cycle est minime (0.013) alors que l’IoU n’est que de 0.28.
Aller-retour CycleGAN après 2,000 pas. Lignes : a, G_AB(a), G_BA(G_AB(a)), le vrai contour. G_AB cache la forme pleine dans un motif à peine visible que G_BA relit, si bien que l’erreur de cycle est minime (0.013) alors que l’IoU n’est que de 0.28.

Entrée

gans-train --method cgan --dataset mnist --steps 2000 && gans-eval checkpoints/cgan/last.pt

Sortie

FID (clf) 29.64, IS (clf) 8.02, modes 10/10, label accuracy 87.5% (0.27 M / 0.04 M parameters, 9.7 min on one CPU thread)

La ligne cGAN du tableau de résultats. La FID est calculée dans l’espace de features d’un petit classifieur MNIST, pas d’Inception, et ne sert donc qu’à classer les runs au sein de ce dépôt.

Stack technique

Ce que j’ai appris

Limites

Mots-clés

GAN · réseaux antagonistes génératifs · DCGAN · GAN conditionnel · ACGAN · LSGAN · WGAN · WGAN-GP · pénalité de gradient · normalisation spectrale · hinge loss · pix2pix · CycleGAN · traduction image-vers-image · effondrement de modes · FID · MNIST · PyTorch · modèles génératifs