对抗式生成网络---验证码的生成

最近看生成式对抗网络,做了一点有意思的事情,发现这个东西用于生成验证码真是太爽了,当然精度还有待提高。

传送门
关于生成式对抗网络的原理,自己百度下很多博文
条件生成式对抗网络,也有很多

概述
使用的原始域图像为SVHN数据集(老外的门牌号数字),目标域图像为MINST数据集,利用生成式对抗网络可以完成下图的转换。看见这个我想起让我想起了12306的验证码,这让我觉得生成式对抗网络可能会应用于Anti-spam工作。

这里写图片描述

原工作概述
上面的工作来自于《UNSUPERVISED CROSS-DOMAIN IMAGE GENERATION》这篇论文,其原理图如下
这里写图片描述

f相当于一个编码器使用的是卷积网络,g相当于解码器使用的是反卷积网络,两者合并起来相当于G生成网络,D是用来同生成网络对抗训练的鉴别网络使用的为卷积网络,这两部分是比较原始的条件生成式对抗网络。在此基础上,又利用共享的权重对于G生成的图像再次输入到f中,计算f(g(x))和f(x)的L1损失,其中x为输入的图像。这一改进通俗的说就是无论你是什么形式的图片(SVHN还是MINIST)你经过卷积提取出的高维特征都应该是一样,因为你们本质上表达的信息都是“同一个数字”。此外,作者在这里还改进了一点就是将目标域图像也输入到G网络中那么他生成的网络应该仍然是目标域的图像。

原工作的训练

默认已经知道原始生成式对抗网络的训练过程

  • 预训练
    这篇论文说是无监督的训练,但是在f编码器使用的时候需要对其进行预训练,并且是有监督的训练。
    1)设计好f编码网络,在其最后一层加上softmax层用于输入“0-9”的结果
    2)使用原始域(SVHN数据集)并且带有标签的,对1)中的网络进行有监督的分类训练
    3)将最后一层softmax层去除,连接g解码网络

  • 对抗网络的损失
    只要是生成网络生成的图像都是负样本,目标域图像是正样本,使用的是crossentropy损失函数

  • 生成网络的损失
    1)来自对抗网络的鉴别损失;2)两个f编码器的L1损失,3)输入目标域图像与生成的目标域的L1损失

  • 总结
    使用了原论文的设计跑出来的效果还算可以,但是预训练是有监督的训练跟论文题目说的无监督有点相悖,以下我改进了一点,主要提升了转换后的准确率和清晰度

改进的网络结构
这里写图片描述

改进说明
既然原文使用的数据都是有标签的,且f编码网络使用了有监督的预训练,博主借鉴了pix2pix的思想,直接改成有监督的训练。
1)两个f编码网络最后一层L1损失,反映的最后一层损失,按此思路在其之前输出应该也同样存在着损失,所以我增加了多层之间的损失
2)既然有了真实的标签,那么转换后生成的目标域图像就能和真实的图像进行损失计算,这里使用的同样是L1的损失
3)D鉴别网络原论文使用的是简单的二分类网络,提供的损失只是真假信息,但是哪个部分真哪个部位假这些信息没有提供,于是我使用“PatchGAN”里面的鉴别网络,即使用卷积层最为D鉴别网络的输出,使用的“Patch”思想,这样做的能提高清晰度,如下图
这里写图片描述
使用“patchGAN还是有效果的”,同样的迭代清晰与非清晰对比还是比较明显的。

关于源码
只能给你们一个《UNSUPERVISED CROSS-DOMAIN IMAGE GENERATION》的传送门了,自己的源码可能不能马上公布,还有些试验要使用。
https://github.com/yunjey/domain-transfer-network

发布了49 篇原创文章 · 获赞 14 · 访问量 19万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览