基于生成对抗网络(GAN)人脸图像生成
创作时间:
作者:
@小白创作中心
基于生成对抗网络(GAN)人脸图像生成
引用
CSDN
1.
https://blog.csdn.net/tjl521314_21/article/details/143337209
基于生成对抗网络(GAN)人脸图像生成
这周将构建并训练一个生成对抗网络(GAN)来生成人脸图像。
GAN 原理概述
生成对抗网络通过两个神经网络的对抗性结构来实现目标:
- 生成器(G):输入随机噪声,通过学习数据的分布模式生成类似真实图像的输出。
- 判别器(D):用来判断输入的图像是真实的还是生成器生成的。
训练过程中,生成器尝试欺骗判别器,生成逼真的图像,而判别器则不断优化,以区分真实图像与生成图像。这种对抗过程最终使生成器的生成能力逐渐逼近真实图像。
环境准备
首先导入相关库并设置随机种子以确保结果的可复现性。
import random
import os
import torch
import torch.nn as nn
import torch.optim as optim
import torch.utils.data
import torchvision.datasets as dset
import torchvision.transforms as transforms
import torchvision.utils as vutils
import matplotlib.pyplot as plt
import numpy as np
超参数设置
在训练GAN之前,首先定义一些关键的超参数:
- batch_size:每个批次的样本数。
- image_size:图像的大小,用于调整输入数据的尺寸。
- nz:潜在向量大小,即生成器的输入维度。
- ngf和ndf:分别控制生成器和判别器中的特征图数量。
- num_epochs:训练的总轮数。
- lr:学习率。
batch_size = 128
image_size = 64
nz = 100
ngf = 64
ndf = 64
num_epochs = 50
lr = 0.0002
beta1 = 0.5
数据加载
通过torchvision.datasets.ImageFolder加载数据,并使用torch.utils.data.DataLoader进行批量处理。数据加载时,通过转换函数调整图像大小,并对其进行归一化处理。
dataroot = "data/GANdata"
dataset = dset.ImageFolder(root=dataroot,
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 = torch.utils.data.DataLoader(dataset, batch_size=batch_size, shuffle=True)
网络结构定义
1. 生成器
生成器将随机噪声(潜在向量)通过一系列转置卷积层转换为图像。每层使用ReLU激活函数,最后一层用Tanh激活函数,将输出限制在[-1, 1]。
class Generator(nn.Module):
def __init__(self):
super(Generator, self).__init__()
self.main = nn.Sequential(
nn.ConvTranspose2d(nz, ngf * 8, 4, 1, 0, bias=False),
nn.BatchNorm2d(ngf * 8),
nn.ReLU(True),
nn.ConvTranspose2d(ngf * 8, ngf * 4, 4, 2, 1, bias=False),
nn.BatchNorm2d(ngf * 4),
nn.ReLU(True),
nn.ConvTranspose2d(ngf * 4, ngf * 2, 4, 2, 1, bias=False),
nn.BatchNorm2d(ngf * 2),
nn.ReLU(True),
nn.ConvTranspose2d(ngf * 2, ngf, 4, 2, 1, bias=False),
nn.BatchNorm2d(ngf),
nn.ReLU(True),
nn.ConvTranspose2d(ngf, 3, 4, 2, 1, bias=False),
nn.Tanh()
)
def forward(self, input):
return self.main(input)
2. 判别器
判别器为卷积网络,通过一系列卷积层提取图像特征。每层使用LeakyReLU激活函数,最终输出一个值(真实为1,生成为0)。
class Discriminator(nn.Module):
def __init__(self):
super(Discriminator, self).__init__()
self.main = nn.Sequential(
nn.Conv2d(3, ndf, 4, 2, 1, bias=False),
nn.LeakyReLU(0.2, inplace=True),
nn.Conv2d(ndf, ndf * 2, 4, 2, 1, bias=False),
nn.BatchNorm2d(ndf * 2),
nn.LeakyReLU(0.2, inplace=True),
nn.Conv2d(ndf * 2, ndf * 4, 4, 2, 1, bias=False),
nn.BatchNorm2d(ndf * 4),
nn.LeakyReLU(0.2, inplace=True),
nn.Conv2d(ndf * 4, ndf * 8, 4, 2, 1, bias=False),
nn.BatchNorm2d(ndf * 8),
nn.LeakyReLU(0.2, inplace=True),
nn.Conv2d(ndf * 8, 1, 4, 1, 0, bias=False),
nn.Sigmoid()
)
def forward(self, input):
return self.main(input)
训练过程
训练分为两个部分:判别器和生成器的更新。
1. 判别器的训练
判别器首先接收真实图像样本,计算输出与真实标签的误差。然后判别器接收生成器生成的假图像,再计算输出与假标签的误差。最终判别器的损失是两者的总和。
output = netD(real_cpu).view(-1)
errD_real = criterion(output, label)
errD_real.backward()
fake = netG(noise)
output = netD(fake.detach()).view(-1)
errD_fake = criterion(output, label.fill_(fake_label))
errD_fake.backward()
2. 生成器的训练
生成器的目标是欺骗判别器,因此其损失函数基于判别器将生成图像误识为真实的概率值。
output = netD(fake).view(-1)
errG = criterion(output, label.fill_(real_label))
errG.backward()
训练监控与可视化
训练时,我们记录生成器和判别器的损失,并生成一些样本图像来查看生成器的效果。
plt.figure(figsize=(10, 5))
plt.title("Generator and Discriminator Loss During Training")
plt.plot(G_losses, label="G")
plt.plot(D_losses, label="D")
plt.xlabel("iterations")
plt.ylabel("Loss")
plt.legend()
plt.savefig('Generator and Discriminator Loss During Training.png')
结果可视化
训练结束后,我们将真实图像与生成图像对比,以检验生成器的效果。
plt.figure(figsize=(15, 15))
plt.subplot(1, 2, 1)
plt.axis("off")
plt.title("Real Images")
plt.imshow(np.transpose(vutils.make_grid(real_batch[0].to(device)[:64], padding=5, normalize=True).cpu(), (1, 2, 0)))
plt.subplot(1, 2, 2)
plt.axis("off")
plt.title("Fake Images")
plt.imshow(np.transpose(img_list[-1], (1, 2, 0)))
plt.savefig('Fake Images.png')
plt.show()
总结
这周学习构建了一个深度卷积生成对抗网络(DCGAN),用于生成逼真的人脸图像,通过这周学习对对抗网路的构建有了更深的了解与运用。
热门推荐
巴金诞辰120周年:重温《家》里的青春热血
福建桂圆获誉“南桂圆、北人参”,养生功效受追捧
深度学习优化技术全景:模型训练效率提升30%,成本降低20%
从比喻到反复:五种修辞手法让写作更生动
7款桂圆养生食谱:冬季补气血、安神助眠有妙方
新型CNN架构实现333倍参数减少,大幅提升自动驾驶性能
写好文案的四个关键:从受众分析到创意表达
恩施土家女儿城亲子游:文化与欢乐同行
桂圆养生正当时:3款简单易做的养生食谱
Meta分析实战:R语言Meta包处理二分类数据详解
蛋白质每日摄入量标准发布,这些食物帮你轻松达标
清代宫女服饰制度:从材料到图案的等级之分
天麻醒脑胶囊治疗失眠效果如何?一文读懂其成分与注意事项
调节神经功能的谷维素:使用前必知的副作用与禁忌
简阳开设青少年体重管理门诊,非药物干预助健康减重
海南旅游小贴士:畅游热带天堂避开旅游陷阱
特殊工种工龄折算标准明确:高温有毒环境工作一年算一年半
高速路上开车,保持多少跟车距离才安全?
代谢营养学:告别“一刀切”,打造专属饮食方案
深度学习核心技术解析:神经网络原理与工业应用
饮食调整,告别尴尬放屁时刻
大语言模型面临新型安全威胁:提示注入攻击与五大防范策略
打造沉浸式体验:一场走心又有趣的12岁生日庆典策划
ECharts入门示例
怎么判断安全距离?安全距离的判断标准和重要性是什么?
高速行车必知:如何判断与前车的安全距离?
灰熊来袭,如何科学逃生?
感光细胞再生研究获突破,斑马鱼为视力疾病治疗带来新希望
胶片风格朋友圈文案,让你秒变文艺达人
白砂糖可长期保存,红糖冰糖这样存放更安全