有趣的图像生成——使用DCGAN与pytorch生成动漫头像
文章目录
一、源码下载
下载地址:https://gitee.com/yang_guo123/dcgan-pytorch
数据集下载地址:链接: https://pan.baidu.com/s/1PcZ4TLyqcN52096eIfbmCA 密码: auc5
二、什么是DCGAN
生成对抗网络(GAN)是由Ian Goodfellow在2014年提出的一种生成网络,它由生成器(Generator)与判别器(Discriminator)构成。
生成器:负责伪造假图片,试图以假乱真。
判别器:负责区分图片,希望能从图片中区分真实图片与假图片
在GAN的训练过程中,生成器通过凭空捏造出一幅图片,令判别器进行打分,并通过判别器的分数进行梯度更新,而判别器可以看到真实图片与生成器的伪造图片,通过区分伪造图片与真实图片进行梯度更新。
使用通俗的话来讲,生成器好比制作假冒伪劣手机的奸商,而判别器好比鉴定专家。在一开始,奸商与鉴定专家都是新手,奸商制作的山寨手机都是随机的形状,而鉴定专家也是随机判断手机的好坏;突然有一天奸商了解到手机是长方形的,由此制作的手机能够轻松骗过鉴定专家,这样一来,鉴定专家损失惨重;由于时间的积累,鉴定专家有了一定的经验,能够判定山寨手机的一些特征,则奸商损失惨重,由此这样多轮的较量,鉴定专家能够精确的判定手机是否为赝品,而奸商也可以制作可以以假乱真的赝品手机。
在传统的GAN中,通常使用全连接神经网络,并且其难以训练,于是,在2016年Alec Radford等人提出了DCGAN(论文详见:https://arxiv.org/pdf/1511.06434.pdf),通过改进CNN的模型,将深度卷积神经网络引入GAN,并且获得了很好的效果。
由于本文主要为实践方面,理论层面就不再赘述,有兴趣的网友可以自行下载论文阅读。
三、DCGAN的实现
1、数据集的选择
本文所采用的数据集为动漫头像数据集,图像大小为96x96,由下图所示:
2、生成器的构建
DCGAN的生成器器由全卷积神经网络构成,首先在网络中输入一个长度为100的随机向量,通过多次的反卷积运算,并使用tanh激活函数输出,将随机向量变为长宽为64x64三通道图像,具体结构由下图所示:
有图可见,在每一层反卷积时,图像的通道数都会缩小一半,并在最后一层将通道数目调整为3通道,输出一张RGB图像,构建的代码由下文所示:
class Generator(nn.Module):
def __init__(self, nz, nc, ngf):
super(Generator, self).__init__()
self.net = Sequential(
nn.ConvTranspose2d(nz, ngf * 8, 4, 1, 0, bias=False),
nn.BatchNorm2d(ngf * 8),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(ngf * 8, ngf * 4, 4, 2, 1, bias=False),
nn.BatchNorm2d(ngf * 4),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(ngf * 4, ngf * 2, 4, 2, 1, bias=False),
nn.BatchNorm2d(ngf * 2),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(ngf * 2, ngf, 4, 2, 1, bias=False),
nn.BatchNorm2d(ngf),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(ngf, nc, 4, 2, 1, bias=False),
nn.Tanh()
)
def forward(self, x):
return self.net(x)
3、判别器的构建
DCGAN有趣的地方在于判别器的网络结构与生成器正好是对称的,唯一有所不同的是其激活函数换成了LeakyRelu,并且输出端使用的激活函数为sigmoid,下面是判别器的代码实现:
class Discriminator(nn.Module):
def __init__(self, nc, ndf):
super(Discriminator, self).__init__()
self.net = Sequential(
nn.Conv2d(nc, ndf, 4, 2, 1, bias=False),
nn.BatchNorm2d(ndf),
nn.LeakyReLU(0.2, inplace=True),
nn.Conv2d(ndf, ndf*2, 4, 2