赞
踩
Generative Adversarial Network
输入一个vector 可以生成你想要的,输入的一个vector变成了一张张照片
当然vector也会影响输出,从而输出不一样的人物
如果第一个数代表头发的长度,倒数第二个个数代表头发蓝色的程度,最后一个代表是否张开嘴,那么数值变换就会有如下的变换
GAN的神奇之处,不止训练上述的生成器(generator),还训练了一个分辨器(discriminator),它的输入是你想要生成的东西,输出是一个数值,数值越大输入图片就越真实
一开始generator网络参数是随机的,它也不知道怎么产生二次元的头像,所以往往生成噪声图片,然后就把生成结果交给discriminator判断是真实的图片还是由discriminator生成的图片
接下来generator会想办法骗过第一代的discriminator,第一代的discriminator能分辨第一代的generator(比如真实图片颜色),所以第二代产生颜色来骗第一代discriminator,但是discriminator也会进化,通过比较二代generator生成的与真实图片的差异(比如真实图片有嘴巴)
所以最后generator和discriminator都越来越强,关系是一种对抗关系
会有两组图片,一组是database中真实图片采样出来的样本,另一组是generator生成的,接下来就要去调整discriminator参数来训练,怎么调呢?如果是真的就给高分数,如果是假的就给低分,也就是第一组真的丢进去要离1越近越好,而第二组假的离0越近越好
现将vector丢入generator,产生一张图片,再给discriminator,之后会给出分数,我们希望输出分数越大越好
这个流程,虽然组成了一个连起来的大网络,但是在训练的时候要将后面的网络参数固定,只调整前面的(generator)的参数,同样我们需要分数越大越好所以使用梯度上升(这个与梯度下降只有一个正负号的区别)
反复执行下面的算法
可以自己学,用手写数字识别举例
传统的监督学习,就是输入vector,输出图片,在网络训练
我们将vector和图片做成一个pair也就是带有标签的database进行训练网络
训练完成之后,输入一个vector丢入网络中输出一个图片要和1越接近越好
(注:其实手写数字识别,输入图片输出类别就是上面的反流程,如下图)
问题是怎么产生这些vector,如果随机产生,会很难训练
采取相似图片,vector也要有相似之处,但是这样的vector怎么产生,我们可以训练一个产生vector的encoder
这个技术可以采用auto encoder(可以给一张图片变成code),但是encoder不能自己训练,必须需要decoder(给一个code变成一张图片)
训练的时候给encoder图片,encoder把图片变成code,code再给decoder,它会写回原来的图片,其实这里的dencoder就是generator的作用
这个decoder输入某个vector的输出是固定的了,当我们输如一系列的vector发生下面右图的神奇现象数字连续的变化,比如越往左越与圈圈有关,越右越与棍子有关,纵轴与歪的方向有关
但是这样的方法有什么缺陷呢
因为训练数据有限,所以可能会遇到一些无法产生的理想中的图片
这个也可以用variational auto encoder 解决
这里encoder不止产生一个vector(m),它还会产生每一个维度的variance(
σ
\sigma
σ),并从normal 分布sample出一些noise(e),e和
σ
\sigma
σ相乘 后与vetcor(m)相加,最后将有noise的vector丢入decoder产生原来的数字。
这样机器就不知看到某个vector产生数字,也要看到vector加一些noise也要产生数字,这样decoder更加稳定,这样以后输入训练没见过的,就不会奇怪了
那我们还有什么缺陷呢?我们输出的图片需要和某张图片越像越好,也就是计算两种图片像素的差距,也就是需要这个差距越小越好
但是事实上generator完全复制,但是在训练的时候会犯一些错,他会在某些地方不一样,但是选择在某些地方变就非常重要,比如下面产生了心四张图片,前两个差1个像素,后两个差6个像素
但是第二幅图虽然只有一个像素差但是感觉比6个像素的不好,也就是单纯越像越好,可能就会犯错,并且每个组件之间是很难配合的,如果要把相联度考虑进去,可能需要更深的网络,也就是说用auto encoder 做生成比GAN做生成需要层次更深
输出是蓝色的,绿色是学习的目标,我们需要generator生成绿色,学习下去之后,我们最好也就产生蓝色的点,因为我们考虑像素的差距,我们不太容易学到几个绿色的分布之间是由间隙的
它可以自己产生
generator是每一个component独立去产生的,要考虑component之间的关系是困难的,但对discriminator来说是容易的,因为输入是一张完整的图片,由discriminator评价,discriminator能够轻易告诉图片的好坏
怎么做到的呢因为,discriminator是CNN的话,它可能有这样一个filter,一个像素店旁边上面像素都没有的,如果图片有这种就给低分,所以检查就很容易,这就是discriminator的优势
那么怎么产生呢?用下面的方法,穷举所有可能的x,丢入discriminator里面,看哪一个可以产生很高的分数,高分的就是理想的图片
discriminator擅长的是批评,让他想一个好的东西是很痛苦的,那我们假设他可以想出一个,那么我们怎么训练呢?
我们可以用一些好的二次元图片和不好的二次元图像,但是不好似乎没有数据,这样都用好的就会导致模型看到什么图片都是好的。
有什么办法找好的不好的图片呢?哈哈哈,似乎还没有很好的方法,但是,我们可以用下面的方法
我们有一堆好的画和一些noise坏的话,然后给这些打分真的打高分,假的打低分,之后我们使用discriminator产生一些图片,使得这些图片图片的分数足够高,之后下一次迭代,我们用上一次迭代的图片代替noise图片,之后反复循环
但是也会有问题,我们如果有些真实图片没有涉及到,那么就会使得这些没有涉及到的真实图片认为是差的(Dx是真图片的分布)最后discriminator只认为训练集上设计到高分
generator | discriminator |
---|---|
生成快 | 能考虑到大局 |
无法考虑到component的关系,学不到全局 | 但是去生成困难 |
所以argmax就用generator来代替,来解argmaxD(x)的问题
这样两种的优点就互补了
对于discriminator来说,使用generator产生坏的图片
对于generator来说,虽然仍然component by component的产生图片,但是通过discriminator学习全局信息
稳但不好
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。