【第五章:计算机视觉-项目实战之生成对抗网络实战】2.基于SRGAN的图像超分辨率实战-(2)实战1:DCGAN模型搭建

第五章:计算机视觉(Computer Vision)- 项目实战之生成对抗网络实战

第二部分:基于SRGAN的图像超分辨率实战

第二节:实战1:DCGAN模型搭建

在前面的文章里,我们已经介绍了生成对抗网络(GAN)的基本思想。今天我们要进入 GAN 家族中最经典的改进版 ------ DCGAN(Deep Convolutional GAN)。它是最早把卷积引入到 GAN 体系中的模型,大幅提升了图像生成的质量和稳定性。

本文将从 原理 → 模型结构 → PyTorch 代码实现 → 训练要点 四个方面,带你快速上手 DCGAN,为后续 超分辨率任务(SRGAN) 打好基础。


1. DCGAN 简介

DCGAN 全称 Deep Convolutional Generative Adversarial Network,由 Radford 等人于 2015 年提出。它的目标依然是让生成器(Generator, G)和判别器(Discriminator, D)互相博弈,但在架构上有了关键改进:

  • 使用 卷积层 代替全连接层,更好地捕捉图像空间特征;

  • 使用 转置卷积(ConvTranspose2d) 在生成器中逐步上采样,输出更大分辨率的图像;

  • 引入 Batch Normalization,让训练更加稳定;

  • 激活函数上:生成器使用 ReLU,判别器使用 LeakyReLU。

这些改进让 DCGAN 成为最早能够生成较为清晰人脸和自然图像的 GAN 模型之一。


2. DCGAN 的模型结构

生成器(Generator)

输入:一个随机噪声向量 z(一般服从正态分布)。

输出:一张合成图像(例如 64×64 的 RGB 图像)。

结构:

  1. 全连接层将 z 投影到高维特征空间;

  2. 通过一系列 转置卷积层(反卷积),逐步将特征图上采样;

  3. 每一层都配合 BatchNorm + ReLU 稳定训练;

  4. 最后一层用 Tanh,把输出限制到 -1, 1

判别器(Discriminator)

输入:真实图像 or 生成图像。

输出:真假概率(0 或 1)。

结构:

  1. 多层卷积逐步提取特征;

  2. 使用 LeakyReLU 激活防止梯度消失;

  3. 在最后一层使用 Sigmoid 输出真假概率。


3. PyTorch 代码实现

下面是 DCGAN 的核心代码,你可以直接运行在 CIFAR-10 或 CelebA 数据集上。

python 复制代码
import torch
import torch.nn as nn

# 生成器
class Generator(nn.Module):
    def __init__(self, z_dim=100, img_channels=3, feature_g=64):
        super(Generator, self).__init__()
        self.net = nn.Sequential(
            # 输入 Z → 4x4 特征图
            nn.ConvTranspose2d(z_dim, feature_g*8, 4, 1, 0, bias=False),
            nn.BatchNorm2d(feature_g*8),
            nn.ReLU(True),
            
            # 4x4 → 8x8
            nn.ConvTranspose2d(feature_g*8, feature_g*4, 4, 2, 1, bias=False),
            nn.BatchNorm2d(feature_g*4),
            nn.ReLU(True),
            
            # 8x8 → 16x16
            nn.ConvTranspose2d(feature_g*4, feature_g*2, 4, 2, 1, bias=False),
            nn.BatchNorm2d(feature_g*2),
            nn.ReLU(True),
            
            # 16x16 → 32x32
            nn.ConvTranspose2d(feature_g*2, feature_g, 4, 2, 1, bias=False),
            nn.BatchNorm2d(feature_g),
            nn.ReLU(True),
            
            # 32x32 → 64x64
            nn.ConvTranspose2d(feature_g, img_channels, 4, 2, 1, bias=False),
            nn.Tanh()
        )

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


# 判别器
class Discriminator(nn.Module):
    def __init__(self, img_channels=3, feature_d=64):
        super(Discriminator, self).__init__()
        self.net = nn.Sequential(
            nn.Conv2d(img_channels, feature_d, 4, 2, 1, bias=False),
            nn.LeakyReLU(0.2, inplace=True),

            nn.Conv2d(feature_d, feature_d*2, 4, 2, 1, bias=False),
            nn.BatchNorm2d(feature_d*2),
            nn.LeakyReLU(0.2, inplace=True),

            nn.Conv2d(feature_d*2, feature_d*4, 4, 2, 1, bias=False),
            nn.BatchNorm2d(feature_d*4),
            nn.LeakyReLU(0.2, inplace=True),

            nn.Conv2d(feature_d*4, feature_d*8, 4, 2, 1, bias=False),
            nn.BatchNorm2d(feature_d*8),
            nn.LeakyReLU(0.2, inplace=True),

            nn.Conv2d(feature_d*8, 1, 4, 1, 0, bias=False),
            nn.Sigmoid()
        )

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

4. 训练流程

  1. 损失函数

    • 判别器:最大化真实图像判为真,最小化生成图像判为真;

    • 生成器:最小化生成图像被判为假的概率;

    • 损失函数一般使用 BCE Loss

  2. 优化器

    • Adam(学习率 0.0002,β1=0.5,β2=0.999)。
  3. 训练步骤

    • Step 1:用真实图像训练判别器 D(标签设为 1);

    • Step 2:用生成图像训练判别器 D(标签设为 0);

    • Step 3:更新生成器 G,使得判别器把生成图像判为真(标签设为 1);

    • Step 4:循环迭代。


5. 效果展示

当训练收敛后,DCGAN 可以生成较为清晰的 人脸图像手写数字,甚至是风格化图片。相比原始 GAN,它收敛更稳定、生成质量更高。

训练过程中的效果大概如下:

  • 初始阶段:图像接近随机噪声;

  • 中期阶段:逐渐出现轮廓和形状;

  • 后期阶段:细节逐渐清晰,可见真实图像结构。


6. 总结

本文我们完成了 DCGAN 的模型搭建与 PyTorch 实现,并理解了它在 GAN 家族中的重要地位:

  • 卷积 + 反卷积 结构,让 GAN 能够生成高分辨率图像;

  • BatchNorm 和 LeakyReLU 稳定了训练过程;

  • 提供了基础架构,成为 SRGAN、StyleGAN、CycleGAN 等后续 GAN 模型的基石。

相关推荐
海兰16 分钟前
mcporter — 安装部署及使用完全指南(二)
人工智能·agent
一拳不是超人20 分钟前
LangChain 们的丧钟?DeepSeek 把 Agent 开发变成了拼乐高
人工智能·agent
麻雀飞吧23 分钟前
零基础选量化工具,先把问题说清楚
人工智能·python
向成科技28 分钟前
新品亮相|向成电子IPCA_3588H AI边缘网关重磅发布,算力下沉,自主可控
人工智能·边缘计算·国产化·硬件·边缘网关·主板·端侧ai
段一凡-华北理工大学33 分钟前
AI推动工业智能化转型~系列文章20:工业 AI 平台架构:云-边-端协同的技术体系
人工智能·python·架构·工业平台·云-边协同
IT_陈寒36 分钟前
Python线程池吞了异常还不告诉我,这谁顶得住啊
前端·人工智能·后端
CodeBlog-star36 分钟前
Harness Engineering:Pi Agent 架构深度解析
人工智能·python·架构·harness工程
chen_zn951 小时前
《VLA 系列》Human-to-Robot Transfer | 人类视频共训练 | 跨本体涌现迁移 | 论文解析
人工智能·深度学习·transformer·具身智能·vla
恣逍信点1 小时前
《凌微经》价值论:变化即本体,价值即涌现
人工智能·科技·程序人生·蓝桥杯·业界资讯·交友·哲学
CC大煊1 小时前
从夯到拉:锐评国内向量模型选型
人工智能·ai·架构·langchain