diff --git a/contrib/chapter_generative_adversarial_networks/GAN.md b/contrib/chapter_generative_adversarial_networks/GAN.md index 9501b5d0d..81cfeb076 100644 --- a/contrib/chapter_generative_adversarial_networks/GAN.md +++ b/contrib/chapter_generative_adversarial_networks/GAN.md @@ -1,11 +1,11 @@ -# 生成对抗网路 GAN # +# 生成对抗网络 GAN # 这几年深度学习的流行除了卷积神经网络(Convolutional Neural Networks)外,再来有意思的就是生成对抗网路GAN(Generative Adversarial Network),由Ian Goodfellow在2014年提出GAN概念的[[1]](https://arxiv.org/abs/1406.2661),我们甚至可以用两个不同的**成语**来描述机器学习的两个重要分支判断模型以及生成模型: #### 化繁为简(判断模型): -在电脑视觉里面的分类问题中,我们想要让电脑知道这张图片是鸟,我们会收集许多关于鸟的资料,例如不同种类的鸟..等,并透过卷积神经网络(Convolutional Neural Networks)让电脑来训练、学习,之后电脑就会分辨出这张图片是不是 “鸟”。 +在电脑视觉里面的分类问题中,我们想要让电脑知道这张图片是鸟,我们会收集许多关于鸟的资料,例如不同种类的鸟..等,并通过卷积神经网络(Convolutional Neural Networks)让电脑来训练、学习,之后电脑就会分辨出这张图片是不是 “鸟”。 **电脑会看了许许多多关于鸟的图片,并归纳出一些规则,来分辨这张图片是不是鸟。** @@ -20,19 +20,19 @@ #### 无中生有(生成模型): -人类可以听到一些关键字,脑海产生对应关键字的图像,所以我们是不是也能让电脑听到关于**猫**这个字,他就会产生猫的影像呢?答案是可以的,透过生成模型我们可以让电脑产生相对应的图像。 +人类可以听到一些关键字,脑海产生对应关键字的图像,所以我们是不是也能让电脑听到关于**猫**这个字,他就会产生猫的影像呢?答案是肯定的,透过生成模型我们可以让电脑产生相对应的图像。 -**可能电脑没有看过我家的小猫长怎样,可是既然是猫,所以他应该要有4只脚,一身毛茸茸的毛发......等。** +**可能电脑没有看过我家的小猫长啥样,可是既然是猫,所以他应该要有4只脚,一身毛茸茸的毛发......等。** ![](../img/generate_cat.PNG) -## 生层对抗网路是什么 -上面的例子示范出我们可以让电脑生成我们感兴趣的图像,可是我们到底要怎么知道这些生成出来的图像是猫而不是老虎呢?所以Ian Goodfellow就提出了除了生成外我们还要给你一个对抗网路。 +## 生成对抗网络是什么 +上面的例子示范出我们可以让电脑生成我们感兴趣的图像,可是我们到底要怎么知道这些生成出来的图像是猫而不是老虎呢?所以Ian Goodfellow就提出了除了生成外我们还要给你一个对抗网络。 -**什么是对抗网路?** -对抗网路换句话说就是想要知道你生成的图像到底像不像猫?如果这个网路在古代就出现的话,指鹿为马这句成语大概就不会传下来了吧...**也难怪Yann LeCun曾说:“生成对抗网路是机器学习这十年来最有趣的主意”** +**什么是对抗网络?** +对抗网络换句话说就是想要知道你生成的图像到底像不像猫?如果这个网络在古代就出现的话,指鹿为马这句成语大概就不会传下来了吧...**也难怪Yann LeCun曾说:“生成对抗网络是机器学习这十年来最有趣的主意”** 原论文也有提出一个有趣的例子,有一个小偷(生成器)要努力印刷出可以骗过警察(判断器)的钞票,而警察(判断器)也要努力学习尽管小偷(生成器)的印刷技术越来越高明,他也要分辨得出来。 @@ -49,7 +49,7 @@ -如此一来这样这样的训练方法可以让双方学得越来越好,我们可以不要让网路那么的GAN(GANG)让他更PEACE一点,大概是生物课本里面的互益共生。 +如此一来这样这样的训练方法可以让双方学得越来越好,我们可以不要让网络那么的GAN(GANG)让他更PEACE一点,大概是生物课本里面的互益共生。 ## 准备资料集 @@ -128,15 +128,15 @@ for i in range(4): visualize(img_list[i + 10][0]) plt.show() ``` -## 定义网路架构 -DCGAN的架构核心就是由卷积神经网络(Convolutional Neural Networks)来组成,判断器会经过卷积神经网络不断的缩小特征图的大小,并判断输入的图像是真实图像还是生成的图像。而生成网路会经过upconvolutions,所以特征图会变得越来越大,如此一来可以从低维度的向量变成高维度的的图片。 +## 定义网络架构 +DCGAN的架构核心就是由卷积神经网络(Convolutional Neural Networks)来组成,判断器会经过卷积神经网络不断的缩小特征图的大小,并判断输入的图像是真实图像还是生成的图像。而生成网络会经过upconvolutions,所以特征图会变得越来越大,如此一来可以从低维度的向量变成高维度的的图片。 而在DCGAN这篇论文中又提出**几个重点**: -1。**取消原有的池化层**,而在判断器中改用跨步卷积,在生成器中使用微步卷积 +1.**取消原有的池化层**,而在判断器中改用跨步卷积,在生成器中使用微步卷积 2.在判断器和生成器中**均使用批量标准化(batch normalization)** -3.在判断器**取消全连接層(fully connected)** 以获得更深的网络结构 -4.在生成器中,除了输出层使用Tanh当激活函数(**这里会用tanh主要是因为我们一开始把图像归一化到[-1,1]之间,如果想要是图像归一化到[0,1]之间可以用(sigmoid)替代**),**其余层均使用RELU激活,在判断器的所有层中均使用LeakyReLu激活**。 +3.在判断器**取消全连接层(fully connected)** 以获得更深的网络结构 +4.在生成器中,除了输出层使用Tanh作为激活函数(**这里会用tanh主要是因为我们一开始把图像归一化到[-1,1]之间,如果想要是图像归一化到[0,1]之间可以用(sigmoid)替代**),**其余层均使用RELU激活,在判断器的所有层中均使用LeakyReLu激活**。 ![](../img/DCGAN.PNG) @@ -191,7 +191,7 @@ with netD.name_scope(): ``` ## 设定损失函数及优化 -这边利用二元交叉熵当成损失函数,并利用adam演算法来进行优化,我们利用常态分布来初始化网路参数 +这边利用二元交叉熵当成损失函数,并利用adam演算法来进行优化,我们利用常态分布来初始化网络参数 ```python # 损失函数 loss = gluon.loss.SigmoidBinaryCrossEntropyLoss() @@ -213,7 +213,7 @@ netD_filename='discriminator.params' ``` -## 训练网路 +## 训练网络 可以看到我们的生成器慢慢地产生出像脸的影像。 **训练分成训练判断器及生成器两个部分** @@ -322,12 +322,12 @@ plt.show() ## 小结 -- 使用生成对抗网路来生成图像 +- 使用生成对抗网络来生成图像 ## 练习 -- 生成对抗网路有一个缺点就是输出的影像很模糊,能不能设计好的生成器或判别器来提升生成影像的解析度。 +- 生成对抗网络有一个缺点就是输出的影像很模糊,能不能设计好的生成器或判别器来提升生成影像的解析度。 - 改变损失函数的设计,例如参考wgan或者lsgan的设计。 ## 参考