G2 - 人脸图像生成(DCGAN)



理论知识

DCGAN(Deep Convolutional Generative Adversarial Networks,深度卷积生成对抗网络)是结合了卷积神经网络(Convlutional Nerual Networks,简称CNN)和生成对抗网络(Generative Adversarial Networks,简称GAN)的思想,用来生成图像。

DCGAN原理

DCGAN将卷积运算引入生成式模型,用来做无监督训练,可以使用卷积网络强大的特征提取能力来提高生成网络的学习效果。DCGAN具有以下特点:

  • 判别器模型使用卷积步长取代空间池化,生成器模型中使用反卷积操作扩大数据维度
  • 除了生成器模型的输出层和判别器模型的输入层,在整个对抗网络的其他层都使用了Batch Normalization(稍后的实验将证明它有多么的重要),Batch Normalization可以稳定学习,有助于优化初始化参数值不良而导致的训练问题。
  • 整个网络去除了全连接层,直接使用卷积层连接生成器和判别器的输入层以及输出层。
  • 在生成器的输出层使用Tanh激活函数以控制输出范围,而在其它层中均使用了ReLU激活函数;在判别器上全使用的LeakyReLU激活函数。

模型结构

逻辑结构

逻辑结构图
如图中所示,DCGAN模型主要包括了一个生成网络G和一个判别网络D

生成网络G负责生成图像,它接受一个随机的噪声z,通过该噪声来生成图像,将生成的图像记为G(z)

判别网络D负责判断一张图像是否为真实的,它的输入为图像x,输出为D(x)表示x为真实图像的概率。

实际上,判别网络D是对数据的来源进行判别:究竟这个数据是来自于真实的分布 P d ( x ) P_{d(x)} Pd(x)(判别为1),还是来自于一个生成网络G所产生的数据分布 P g ( z ) P_{g(z)} Pg(z)(判别为0)。所以在整个训练的过程中,生成网络G的目标是生成可以以假乱真的图像G(z),当判别网络D无法区分(也就是D(G(z)) = 0.5时),便以为生成网络已经收敛,贴近了真实图像的分布。这时的生成网络G生成的图像,还可以用来生成图像的数据集的扩充数据集。

物理结构

物理结构图
在物理上生成网络有4个转置卷积层,对应的判别网络有4个卷积层。其中4*4*512代表这一层共有512个大小为4*4的特征图。BN和ReLU分别在卷积层之前和卷积层之后使用。Tanh和LeakyReLU分别表示双正切激活函数和弱修正线性激活函数。

模型实现

前期准备

环境:
Pytorch 2.2.0+cu121
GTX4090
Python 3.11
Jupyter lab

1. 导入第三方库

import torch, random, os
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms, utils
from torch.utils.data import DataLoader
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from IPython.display import HTML

2. 修改随机种子(相同的随机种子,第i次随机的结果是固定的)

manual_seed = 999
print("Random seed: ", manual_seed)
random.seed(manual_seed)
torch.manual_seed(manual_seed)
torch.use_deterministic_algorithms(True)

输出

Random seed:  999

3. 设置超参数

# 数据的路径
data_root = 'GAN-Data/'
# 训练批次大小
batch_size = 128
# 图像尺寸
image_size = 64
# z的向量大小,生成器的输入尺寸
nz = 100
# 生成器的特征图大小
ngf = 100
# 判别器的特征图大小
ndf = 100
# 训练的总轮数
num_epochs = 50
# 学习率
lr = 0.0002
# Adam优化器超参数
beta1 = 0.5

4. 导入数据

# 创建数据集
dataset = datasets.ImageFolder(
	root=data_root,
	transform=transforms.Compose([
		transforms.Resize(image_size),
		transforms.CenterCrop(image_size),
		transforms.ToTensor(),
		transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]),
	])
)

# 创建数据加载器
dataloader = DataLoader(dataset,
	batch_size=batch_size,
	shuffle=True,
	num_workers=5 # 使用多线程来处理数据
)

# 选择要在哪个设备上运行代码
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print('使用的设备是:', device)

# 查看一些训练的图像
real_batch = next(iter(dataloader))
plt.figure(figsize=(8, 8))
plt.axis('off')
plt.title('Training Images')
plt.imshow(np.transpose(utils.make_grid(real_batch[0][:24], padding=2, normalize=True)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值