本文将介绍如何使用 PyTorch 框架来构建和训练生成对抗网络(GAN)。GAN 是一种深度学习模型,用于生成与真实数据分布相似的样本。

GAN 简介

生成对抗网络(GAN)由 Ian Goodfellow 等人于 2014 年提出。它由两个神经网络组成:生成器(Generator)和判别器(Discriminator)。生成器的目标是生成与真实数据分布相似的样本,而判别器的目标是区分真实样本和生成样本。

安装 PyTorch

在开始之前,请确保你已经安装了 PyTorch。你可以通过以下命令进行安装:

pip install torch torchvision

创建生成器和判别器

以下是一个简单的生成器和判别器示例:

import torch
import torch.nn as nn

class Generator(nn.Module):
    def __init__(self):
        super(Generator, self).__init__()
        self.model = nn.Sequential(
            nn.Linear(100, 256),
            nn.ReLU(True),
            nn.Linear(256, 512),
            nn.ReLU(True),
            nn.Linear(512, 1024),
            nn.ReLU(True),
            nn.Linear(1024, 784),
            nn.Tanh()
        )

    def forward(self, x):
        return self.model(x)

class Discriminator(nn.Module):
    def __init__(self):
        super(Discriminator, self).__init__()
        self.model = nn.Sequential(
            nn.Linear(784, 1024),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(1024, 512),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(512, 256),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(256, 1),
            nn.Sigmoid()
        )

    def forward(self, x):
        return self.model(x).view(-1, 1).squeeze(1)

训练 GAN

# 初始化生成器和判别器
generator = Generator()
discriminator = Discriminator()

# 损失函数
criterion = nn.BCELoss()

# 优化器
optimizer_G = torch.optim.Adam(generator.parameters(), lr=0.0002, betas=(0.5, 0.999))
optimizer_D = torch.optim.Adam(discriminator.parameters(), lr=0.0002, betas=(0.5, 0.999))

# 训练循环
for epoch in range(epochs):
    for i, (imgs, _) in enumerate(dataloader):
        batch_size = imgs.size(0)

        # 训练判别器
        optimizer_D.zero_grad()
        real_imgs = imgs.type(torch.float)
        real_labels = torch.ones(batch_size, 1).to(device)
        fake_labels = torch.zeros(batch_size, 1).to(device)

        real_loss = criterion(discriminator(real_imgs), real_labels)
        fake_loss = criterion(discriminator(generator(z)), fake_labels)
        d_loss = real_loss + fake_loss
        d_loss.backward()
        optimizer_D.step()

        # 训练生成器
        optimizer_G.zero_grad()
        fake_loss = criterion(discriminator(generator(z)), real_labels)
        g_loss = fake_loss
        g_loss.backward()
        optimizer_G.step()

        # 打印信息
        if i % 100 == 0:
            print(f"[{epoch}/{epochs}] [{i}/{len(dataloader)}] D_loss: {d_loss.item()}, G_loss: {g_loss.item()}")

总结

本文介绍了如何使用 PyTorch 框架来构建和训练 GAN。GAN 是一种强大的深度学习模型,可以用于生成与真实数据分布相似的样本。希望这篇文章能帮助你更好地理解 GAN 的原理和应用。

更多 PyTorch 深度学习教程