生成式对抗网络数据集

Data Set

背景介绍

  Generative Adversarial Networks(GAN, 生成式对抗网络):是一类深度学习模型,也是计算机视觉的新晋成员,由Ian J. Goodfellow在2014年10月提出,短短5年多的时间,已经有成百上千种不同的GAN网络被提出,可以说GAN的提出受到了广泛的关注。现在的GAN不仅仅只是生成网络,而其应用更是越来越广泛,包括图像生成超分辨率提升风格迁移等等。而且GAN的使用非常有趣,可以带领我们目睹从0到1的变化趋势。

Dataset

GAN的理论

生成式对抗网络,顾名思义,在对抗中生成图像,其灵感来源于博弈论,这里不做太多的数学公式推导,只是简单描述GAN的工作机理。既然提到对抗,当然GAN网络不是一个模型,而是两个模型,其中一个称之为**Generator(生成器),负责生成图像,另一个称之为Discriminator(判别器)**,负责对生成的图像进行打分,它们两者进行对抗和博弈。

假如你是一个刚学习做饭的新手,我想做出来一道精美的饭菜,这不是天方夜谭吗?但是我有一个不嫌弃我做饭难吃的好朋友小明,他也不是一个专业的评委,他每天中午在五星大酒店吃饭,然后晚上来我家吃我做的饭,是不是一脸黑人问号?不过不用纠结小明和我之间的py交易,但是小明并不会做饭,不能够亲自知道我如何操作,而是告诉我哪里欠缺。于是乎我开始了自己的尝试。第一天小明中午吃大酒店之后,晚上来我家吃饭,他很轻松的分辨出了我做的不如酒店好吃,并且告诉我盐放多了。于是乎我下一次少放点盐。第二天小明中午吃了大酒店之后,晚上来我家,也很轻松的分辨出了我做的不好吃,并且告诉我这次油放少了。于是乎我下一次多放一点油。第三天,第四天。。。一直到一年以后,我做饭的技术越来越好,小明很难从中发现问题,认为我做的和大酒店做的很像,小明越来越认真的区分我做的和酒店之间的差距,他的目标是将酒店做的都全部分成一类,将我做的菜都分成一类,而我越来越认真的对自己的厨艺进行改进,我的目标是让小明将我做的菜分成酒店那一类。就这样我们在相互学习中提升自己,5年以后,我成了一名米其林厨师,而小明成为了一名美食鉴赏专家。好了,故事讲完了,GAN的理论也结束了,我在GAN中就扮演生成器的角色,而小明则是一个判别器的角色。

数据集介绍

数据集:因为GAN的任务很多,包括图像生成,包括分辨率提升,风格迁移等等,为了方便模型调试的方便,在我的博客中使用到了三个数据集。

第一个是大家的老朋友,也是入门深度学习一定会接触的mnist手写数字数据集,带我们见证如何从杂乱无章的数据生成手写数字的过程。
简单介绍一下mnist数据集,在tensorflow2.0中,不需要专门下载,已经给我们提供了手写数字的函数,位于tf.keras.datasets.mnist.load_data(),返回值为两个元组,第一个为训练数据和训练标签,第二个为测试数据和测试标签。训练数据大小为60000张图像,每张图像为28x28的大小,标签为[0, 9]的稀疏表示,非one-hot编码形式。测试集大小为10000张图像,大小格式和训练集相同
mnist

第二个数据集是monet2photo数据集,用来测试SRGAN, CycleGAN的算法正确性,SRGAN是一种超分辨率算法,CycleGAN是一种风格迁移算法
简单介绍一下monet2photo数据集,monet指莫奈风格的画作,photo指拍摄的图像,用于将两张图片的风格进行迁移SRGAN使用了photo图像进行分辨率的提升。其中monet训练集包括1072张图像,位于trainA文件夹中,测试集包括121张图像,位于testA文件夹中,photo训练集包括6287张图像,位于trainB文件夹中,测试集包括751张图像,位于testB文件夹中,其中图像都是jpg文件,大小都是256x256的。
monet2photo

第三个数据集是edges2shoes数据集,用来测试DiscoGAN和pix2pix的算法正确性,其中DiscoGAN和pix2pix都是风格迁移算法,由于损失函数的计算和CycleGAN不同,因此需要的数据集也不同
也简单介绍一下edges2shoes数据集,edges指鞋子的轮廓,shoes指鞋子的图像,其中用于将两张图片的风格进行迁移,特点是相同的图像,只是风格不同,两张图像存放于一个文件中,左边是风格A,右边是风格B,而monet2photo两张图像不但风格不同,而且图像本身也不同,每个图像文件只保存一张图像,其中edges2shoes训练集包括49825张图像,位于train文件夹中,测试集包括200张图像,位于val文件夹中,其中图像都是jpg文件,大小都是512x256的。
edges2shoes

一些说明

  1. 在学习的时候,小伙伴可能会遇到一些代码上的困难,如tensorflownumpyopencv的用法,可以查看我的深度学习框架和Python常用库相关文章,里面会有一些简单的介绍,小伙伴们可以进行学习,最好是手动敲一敲,看一看。
  2. 因为这个博客是对学习的一些总结和记录,意在和学习者探讨和交流,并且给准备入门的同学一些手把手的教学,因此关于生成式对抗网络的算法参数设计,我都是自己尝试的,不是针对于这个数据集最优的参数,大家可以根据自己的实际需要修改网络结构,但是生成式对抗网络是非常sensitive的,可能调整了一些参数以后,网络模型不收敛,得到完全超出预料的结果,这都是正常的,因此这也需要小伙伴们具有非常丰富的实战经验
  3. 实际的工程应用中,常常还需要对数据集进行大小调整和增强,在这里为了简单起见,没有进行复杂的操作,小伙伴们应用中要记得根据自己的需要,对图像进行resize或者padding,然后旋转对比度增强仿射运算等等操作,增加模型的鲁棒性,并且实际中的图像不一定按照顺序命名的,因此应用中也要注意图像读取的文件名。
  4. 为了让学习者看的方便和清晰,我没有使用多个文件对程序进行封装,因为我在刚开始学习模型的时候,查看GitHub代码,一个模型可能需要好几个文件夹,每个文件夹里面又有很多的代码文件,其中很多文件互相调用。虽然这样的工程项目是非常好管理和运行的,但是给初学者一种丈二和尚摸不着头脑的感觉,对此我深有体会。所以我就使用一个.py文件来封装,因此代码可能会有几百行,但是其中的各个函数和类都有自己的名字,可以保证学习者不会被纸老虎吓住。
  5. 在生成式对抗网络学习中,我会列举出一些经典的生成式对抗网络模型,因为模型太多,并且仍在不断的更新进步之中,所以大家可以联系我,和我进行沟通和交流,或者推荐给我一些优秀的模型。
  6. 关于问题的交流,图像的数据,需要的同学可以到主页查看我的QQ或者邮箱,我会非常荣幸的提供力所能及的帮助,小伙伴加好友的时候一定要记得备注,不然我可能会忽视一些粗心的小伙伴。

小结

  生成式对抗网络是计算机视觉的新晋成员,也是非常具有前景的任务之一,而且现在的网络模型的功能也越来越多,不仅仅是用于图像生成,而是运用于各种实际工程应用之中。自从深度学习的时代到来,各种神经网络结构百花齐放,很难说出最好的生成式对抗网络模型,可能一个模型适用于很多数据,但也不能说明某一个算法一定优于另一个算法,我们要做的就是尽可能多的学习各种各样的深度学习模型,然后吸取这些模型成功的原因,投入到自己的工程应用之中。

-------------本文结束感谢您的阅读-------------
0%