Aller au contenu
ModelPrésentéExterne
Télécharger

Mnist Conditional Gan

Conditional Generative Adversarial Network (CGAN) for handwritten digit synthesis, trained on the MNIST dataset.

TypeOtherVersionMnist cgan generatorCClasse

Source du modèle

Type
Other
Taille du fichier
3,41 MB
Version
vMnist cgan generator
Mis à jour
20 oct. 2026
Source
Hugging Face

Description de la source

Conditional GAN — MNIST Digit Generation

Conditional Generative Adversarial Network (CGAN) for handwritten digit synthesis, trained on the MNIST dataset.

Architecture

A standard GAN framework conditioned on class labels, featuring a Generator and a Discriminator network.

ComponentDetails
DiscriminatorTakes a 1×28×28 grayscale image and a class label (0-9). Embeds the label, expands it to 1×28×28, concatenates with the image, and passes through two downsampling Conv2d blocks (with BatchNorm2d and LeakyReLU). Output is flattened and passed through a Sigmoid activation (1 output).
GeneratorTakes a 100-dimensional noise vector and a target class label (0-9). Uses embedding layers for the label, concatenates it with noise, and passes through two ConvTranspose2d upsampling blocks (with BatchNorm2d and LeakyReLU). Output uses a Tanh activation function (1×28×28).

Loss Function

The model is trained using the standard Conditional GAN Minimax objective, implemented with Binary Cross Entropy:

Loss = min_G max_D V(D, G) = E_x[log D(x|y)] + E_z[log(1 - D(G(z|y)|y))]
LossRole
Discriminator LossPenalises the Discriminator for incorrectly classifying real MNIST images as fake, or generated images as real.
Generator LossPenalises the Generator when the Discriminator successfully identifies its generated images as fake.

Training

  • Dataset: 60,000 train (MNIST dataset)
  • Input size: 28×28, normalised to [-1, 1]
  • Batch size: 32
  • Epochs: 50
  • Optimizer: Adam
  • Hyperparameter search: Optuna over learning_rate {1e-5 to 2e-3}, beta1 {0.0, 0.9}, and noise_dim {50, 100, 128}
  • Best weights: snapshot of the epoch with the lowest Generator loss and a stable Discriminator loss. Best Hyperparameters found: learning_rate = 0.000112, beta1 = 0.037, noise_dim = 100.

Data Preprocessing (train only)

Photometric: Images are converted to PyTorch tensors and normalised with a mean of 0.5 and standard deviation of 0.5, scaling the pixel values to the [-1, 1] range to match the Tanh activation of the Generator.

Usage

import torch
from torch import nn
from huggingface_hub import hf_hub_download
import matplotlib.pyplot as plt

class CGAN_Generator(nn.Module):
    def __init__(self, noise_dim=100, num_classes=10, img_size=28):
        super().__init__()
        self.init_size = img_size // 4
        self.embedding_dim = 20
        self.label_embedding = nn.Embedding(num_classes, self.embedding_dim)
        
        self.projection = nn.Sequential(
            nn.Linear(noise_dim + self.embedding_dim, 128 * self.init_size * self.init_size)
        )
        
        self.conv_blocks = nn.Sequential(
            nn.BatchNorm2d(128),
            nn.ConvTranspose2d(128, 64, kernel_size=4, stride=2, padding=1),
            nn.BatchNorm2d(64),
            nn.LeakyReLU(0.2, inplace=True),
            nn.ConvTranspose2d(64, 1, kernel_size=4, stride=2, padding=1),
            nn.Tanh()
        )

    def forward(self, noise, labels):
        label_embed = self.label_embedding(labels)
        merged_input = torch.cat((noise, label_embed), dim=1)
        out = self.projection(merged_input)
        out = out.view(out.shape[0], 128, self.init_size, self.init_size)
        img = self.conv_blocks(out)
        return img

model = CGAN_Generator(noise_dim=100)

weights_path = hf_hub_download(repo_id="VioletaR/cgan-mnist", filename="mnist_cgan_generator.pth")
model.load_state_dict(torch.load(weights_path))
model.eval()

target_label = torch.tensor([7]) 
eval_noise = torch.randn(1, noise_dim)

with torch.no_grad():
    generated_img = model(eval_noise, target_label)

generated_img = (generated_img + 1) / 2.0
img_numpy = generated_img.squeeze().cpu().numpy()

plt.imshow(img_numpy, cmap='gray')
plt.title(f"Generated Label: {target_label.item()}")
plt.axis('off')
plt.show()

Sources

1 source
Hugging FacePrincipalVersion 96672ae26c657c099dec4051567d03005dbbd7f8
huggingface.co/violetar/mnist-conditional-gan/tree/96672ae26c657c099dec4051567d03005dbbd7f8

Vérifié 20 oct.

Artefacts du modèle

1 artefact

mnist_cgan_generator.pth

pth · 3,41 MB · SHA-256 3c2dcb6cd3e4…25a3 · Hugging Face

Download file

Extraits de sources

2 extraits

--- pipeline_tag: unconditional-image-generation library_name: pytorch tags: - gan - cgan - image-generation - generative-adversarial-network license: mit datasets: - mnist language: - en --- # Conditional GAN — MNIST Digit Generation Conditional Generative Adversarial Network (CGAN) for handwritten digit synthesis, trained on the [MNIST](https://www.google.com/search?q=https://huggingface.co/datasets/mnist) dataset. ## Architecture A standard GAN framework conditioned on class labels, featuring a **Generator** and a **Discriminator** network. | Component | Details | | --- | --- | | Discriminator| Takes a 1×28×28 grayscale image and a class label (0-9). Embeds the label, expands it to 1×28×28, concatenates with the image, and passes through two downsampling `Conv2d` blocks (with `BatchNorm2d` and `LeakyReLU`). Output is flattened and passed through a `Sigmoid` activation (1 output). | | Generator | Takes a 100-dimensional noise vector and a target class label (0-9). Uses embedding layers for the label, concatenates it with noise, and passes through two `ConvTranspose2d` upsampling blocks (with `BatchNorm2d` and `LeakyReLU`). Output uses a `Tanh` activation function (1×28×28). | ## Loss Function The model is trained using the standard Conditional GAN Minimax objective, implemented with Binary Cross Entropy: ``` Loss = min_G max_D V(D, G) = E_x[log D(x|y)] + E_z[log(1 - D(G(z|y)|y))] ``` | Loss | Role | | --- | --- | | Discriminator Loss | Penalises the Discriminator for incorrectly classifying real MNIST images as fake, or generated images as real. | | Generator Loss | Penalises the Generator when the Discriminator successfully identifies its generated images as fake. | ## Training * **Dataset:** 60,000 train (MNIST dataset) * **Input size:** 28×28, normalised to [-1, 1] * **Batch size:** 32 * **Epochs:** 50 * **Optimizer:** Adam * **Hyperparameter search:** Optuna over `learning_rate` {1e-5 to 2e-3}, `beta1` {0.0, 0.9}, and `noise_dim` {50, 100, 128} * **Best weights:** snapshot of the epoch with the lowest Generator loss and a stable Discriminator loss. Best Hyperparameters found: `learning_rate` = 0.000112, `beta1` = 0.037, `noise_dim` = 100. ### Data Preprocessing (train only) **Photometric**: Images are converted to PyTorch tensors and normalised with a mean of `0.5` and standard deviation of `0.5`, scaling the pixel values to the...

Source context: 0 downloads · 0 likes · Pipeline unconditional-image-generation · Library pytorch · Repo violetar/mnist-conditional-gan