Pytorch 使用DCGAN实现二次元人物头像生成(实现代码+公式推导)
GAN介绍
算法主体
推导证明(之后将补全完整过程)
随机梯度下降训练D,G
DCGAN介绍及相关原理
Pytorch实现二次元人物头像生成
如何使用GAN生成二次元头像
数据准备
代码实现
判别、生成模型均一轮迭代
判别每一轮迭代,生成模型每五轮迭代
图片生成
总结
本篇文章主要是关于李宏毅教授授课视频中的作业进行介绍,小白博主所作工作只是将现有的知识内容结合网路上一些优秀作者的总结以博文的形式加上自己的理解复述一遍。本文主要还是我的学习总结,因为网上的一些知识分布比较零散故作整理叙述。如果有不对的地方,还请帮忙指正,如有出现禁止转载的图片,文字内容请联系我修改。
相关参考:
李宏毅2020机器学习深度学习(完整版)国语:链接: link.
何之源:GAN学习指南:从原理入门到制作生成Demo链接: link
张先生-您好.Pytorch实现GAN 生成动漫头像 链接: link.
Dean0Winchester.深度学习—图像卷积与反卷积(最完美的解释)链接: link.
GAN介绍
生成对抗网络( G A N GAN GAN, G e n e r a t i v e A d v e r s a r i a l N e t w o r k s Generative Adversarial Networks GenerativeAdversarialNetworks )是深度学习中一种无监督(即不需要给样本数据打标签)的学习方法, G A N GAN GAN的核心思想源自博弈论中的纳什均衡,博弈的双方分别是 G e n e r a t o Generato Generator(负责生成图片的生成器 G G G)和 D i s c r i m i n a t o r Discriminator Discriminator(负责判断图片真假的判别器 D D D)。 D D D的目的在于揪出由 G G G “伪造”的“假”图片给它打低分, G G G的目的在于尽最大可能地模仿真图片从而“欺骗” D D D获取高分。
参与这场游戏双方再不断地较量中完成自身地优化,从而实现了各自判别能力和生成能力的提升,直到双方达到一种动态的平衡。
如上图所示,蝴蝶扮演 G A N GAN GAN中的生成器,而波波鸟则扮演判别器,蝴蝶为了逃避波波鸟(判别器)的捕食(识别)需要不断的朝着树叶(真样本)进化,而波波鸟为了能够捕食(识别)出蝴蝶(用假样本伪装自己的生成器)也需要不断进化,比方说,最开始波波鸟理解的叶子(真样本)只停留在不是彩色这一层面上,随着训练,波波鸟的认知开始进化,从不是彩色转向棕色是叶子(真样本),而蝴蝶得到反馈之后为了继续欺骗波波鸟开始学会让生成的翅膀是棕色。
这个过程将反复进行下去,最后可以达到,波波鸟可以真正认出叶子,蝴蝶可以让生成的翅膀(假样本)与叶子(真样本)近乎一致为止。
算法主体
算法总流程:
G A N GAN GAN算法简单来说,就是固定生成器,训练判别器;然后固定训练好的判别器,再训练生成器的反复过程。
逐条解读算法流程:
首先初始化 D D D, G G G的参数,先固定生成器,进入判别器的学习过程。
判别器学习过程
-
采样 :从数据集中抽样出 m m m张样本,同时借助某种分布(通常使用正态分布)生成 m m m个 n n n维噪声样本。
-
获取假样本:将噪声样本作为输入,得到生成器输出的假样本。
-
判别器D的目标函数 :直观上来看,我们要达到的目的,就是让判别器对生成器生成的假样本尽可能地严格,对数据集抽样出来的真样本尽可能地宽松,那么我们可以构建这样一个目标函数,让判别器给真样本尽可能高的分数,给假样本尽可能低的分数。
m a x D max_D maxD v ∗ v^* v∗ = 1 m \dfrac{1}{m} m1 ∑ i = 1 m \sum_{i=1}^{m} ∑i=1m l o g log log( D D D( x i x^i xi)) + + + 1 m \dfrac{1}{m} m1 ∑ i = 1 m \sum_{i=1}^{m} ∑i=1m l o g log log( D D D(1 − - − x ∗ i x*^i x∗i))
D D D( x x x)代表 x x x为真实图片的概率,如果为 1 1 1,就代表100%是真实的图片,而输出为 0 0 0,就代表不可能是真实的图片。代码实现中通常借由 s i g m o i d sigmoid sigmoid函数来表达
要让 l o g log log( D D D( x ∗ i x*^i x∗i))尽可能小,等效于让 l o g log log( D D D(1 − - − x ∗ i x*^i x∗i))尽可能大。以此为我们的目的函数进行求导做梯度上升(亦可加负号求 m i n min min做梯度下降)从而更新判别器参数。
生成器学习过程 -
噪声采样 :借助同种分布(通常使用正态分布)生成另外 m m m个 n n n维噪声样本。
-
生成器G的目标函数:
v ∗ v^* v∗ = 1 m \dfrac{1}{m} m