DCGAN

本文介绍了如何使用DCGAN和PyTorch生成动漫头像,包括源码下载、DCGAN原理、数据集选择、生成器与判别器的构建、训练过程以及生成的图像展示。
摘要由CSDN通过智能技术生成

有趣的图像生成——使用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值