Globally and Locally Consistent Image Completion 实验记录

下面是我当时在复现这篇论文是时的过程,不想看的可以直接去我的Github上看代码。

https://github.com/CoderAnn/GLCI

有问题可以留言,一定会尽全力解答。

实验过程简介:

      首先,我是基于Context Encoders:Feature Learning by Impainting(2016)复现SATOSHI IIZUKA等人在2017年发表的Globally and Locally Consistent Image Completion。2016年的这篇论文我没咋细看,大概是说把上下文编码器的思想和GAN的思想结合去做图像补全,上下文编码器就是先把图像进行编码之后再进行解码,从而学的图像的特征并生成图像待修补区域对应的预测图。GAN用来判别图像是否是虚假的。

     现在先复习一下GAN的训练过程:首先对z和x采样一个批次,获得他们的数据分布,然后通过随机梯度下降的方法先对D做k次更新,之后对G做一次更新,这样做的主要目的是保证D一直有足够的能力去分辨真假。实际在代码中我们可能会多更新几次G只更新一次D,不然D学习的太好,会导致训练前期发生梯度消失的问题。

      而我要复现的论文其实就是在这篇论文的基础上,修改了鉴别网络,把之前的单个鉴别器扩充到两个鉴别器,一个用来查看全局内容的一致性,另一个用来看局部内容的一致性。最后鉴别器的输出是将二者全连接后再Sigmoid成概率。另外这篇论文还将重构损失修改为MSE+GAN损失,这一点是为了防止GAN的不稳定性。

      具体的训练过程是先用MSE损失更新Tc次补全网络,之后再进行Td次鉴别器的更新,最后两个一起更新。先要更新补全网络是因为最开始的时候,补全网络很差,补全的效果非常明显,鉴别器很容易就能看出这是虚假图片,此时鉴别器的损失很小,几乎为0,也就是此时的鉴别器并没有发挥作用。

     网络架构如下图所示:

训练过程:

实验经过:

     整个的训练过程基本实现:首先读入数据x,之后通过生成随机点来确定mask,将(x*mask)作为补全网络的输入,该输入是缺失部分区域的图片,之后通过降低MSE损失来使补全网络生成图片,待MSE损失降低后,开始训练鉴别器(这里单独训练鉴别器可能是为了让鉴别器明白什么样的图片是真实的,什么样的图片是虚假的??先单独训练生成器的原因是由于最开始补全网络效果很差,如果直接让鉴别器去判断会一眼看出是假的,必须训练到让鉴别器不太清楚真假的时候让两者进行对抗),最后一起训练生成器和鉴别器。但是在具体的数据集当中发现鉴别器的损失非常小,这一点还得继续训练完善。

    目前训练出现的问题:鉴别器的损失不下降为定值(学习率:2e-3,数据集:500张人脸图片),下次训练学习率设置为0.5(无效,非学习率问题!)

   考虑鉴别器代码本身有误。鉴别器代码确实有误,在全连接之前少了一步reshape。

   另外,发现鉴别器最后的输出按理说应该是一个打分,也就是需要用sigmoid激活,但是参考的代码统统没有激活,直接将全连接的输出作为鉴别器的输出。这一点还需查资料。(训练GAN的技巧中说明如果最后一层不用sigmoid会让网络更加稳定)

   仔细看过代码后发现,其实最后用的全连接层是将数据全连接成一个数字了,也就是numsout=1,如果最后全连接的输出是一个数字的话,就可以不用sigmoid函数去激活成(0,1)的数字了。重点不是因为这个,而是因为sigmoid会忽视掉负值的含义,容易让梯度消失,所以最后一层用了batch_norm先归一化然后

评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值