收获 ? 在复现这个项目以前,我算是一个完全不入门的人。
? 所以,第一遍我花里很大的精力取读懂代码,第二遍根据视频去理清思路,第三遍根据tensorflow框架的学习去代码中寻找他的身影。所以,整个项目下来,写的可能水平参差不齐,我不清楚要怎么表达,怎么表达出来,更多的是这个过程的记录,你会看到各个过程的身影。
? 首先,我明白了顺序的重要性。先看论文,再看代码是一个不错的选择。这一次由于没有思路,所以先看代码,再看得论文,所以第一遍有无数疑惑在脑中,直到第二遍才理清楚。
? 其次,抵消了对tensorflow代码的恐惧。人对未知的事物总是感到不安,对我而言,以前复现代码时总是担忧着,我只是能跑出来,但这代码是什么样的?这回终于安心里,他的代码结构是这个样子,当然,掌握的还不够熟练,以后肯定需要多次温习。
? 再然后,简单学习了tensorflow框架,体会到了框架的美妙和强大,简洁的背后是巧妙地封装。
? 最后,这次并没有将整个项目代码,一行一行解读完,只重点解读了main.py和model.py这两个最重要的文件,其余文件中涉及到的函数大部分也都有说明。
? 最最后,很欣慰自己做了这件事儿,我觉得这才算我真正的Hello world!
代码思路 【DCGAN——菜鸟实现】? 感觉从代码里学了很多,虽然没有完全消化完。
? 这份代码,并不算是源代码,怎么说,整个下来一遍,个人觉得,代码里有部分删减痕迹。当然这不是坏处,因为不删减我们可能跑不了,因为可能作者写代码时,基于的是自己的电脑配置,GPU情况等。
? 整个代码最后给我的感觉是,很严谨,你会发现作者很多地方都在注意tensorflow的版本问题,即注意代码兼容性,对比以前跑过的代码,这可能是比较良心的一个了。
? 这份代码的本质并不难,就是GAN的本质。首先看G——generator,作用就是输入一个维度定好的噪声向量Z,根据反卷积,当然,是原论文的反卷积框架(PS:我看到的所有的DCGAN的代码解释,都没有说这个框架为什么这样,只是说原论文怎样,这里我没有仔细拜读,就不再解释),反卷积,就是一个上采样,通俗的说一个[1,10]大小的向量怎么变成[256,256]的图片,就是通过上采样实现的,更通俗讲就是不断让它变大,而这里用反卷积实现,它的权重参数等等都是自动学习,也就是,你需要花点功夫考虑反卷积的维度大小的设计和组合,其他的都交给框架和电脑。当然,其中还有激活函数,batch_norm等等细节就不介绍了。对于这些细节我只知道怎么用,知道他们的优点,但为什么用这个不用其他的,我也爱莫能助。最后总结一下:GAN中generotor目的就是生成图片,这里我们只不过把这个过程用反卷积实现了。
? 作者代码里另外有一个sampler(这里没有细细研究),结构甚至代码和generotor一模一样,不明白他这样设计有啥用,当然,他的作用没有体现在train里面,体现在显示里面了。换句话说,你根据已有的模型或者训练好的模型看生成图片效果,或者训练过程中看效果,它的作用就体现出来了。
? D—discriminator算是最简单的了,正常的卷积操作,最后输出结果一个(0—1)评分值。这也是GAN的原理,对于discriminator而言,输入一张图片,网络给他打分,即输出一个数,整个过程跟CNN多像。当然这里DCGAN也确实用了卷积。
? 优化,论文这里用了Adam,恕我直言,以前我只知道SGD这种东西,学习完,知道这东西还可以加冲量,作用就是穿越峡谷,避免震荡(具体自己学习吧),总的来说就是这里用起来比SGD好。当然,在这之前你要去求网络损失,代码里用交叉熵,它求了两个(GAN原理),利用D分别去给维度一样的真实图片和生成图片打分,分别和期望分值,前者为1后者为0,求交叉熵,然后构造Adma优化器优化。(这里,我尤记得学过的GAN优化是分别固定G和D的参数去优化另一个,这里用了tesnroflow框架,我着实没有看出这个效果,不过它确实有这个趋势,先优化d_loss再优化g_loss,不过细节没看出来)
? ok,你以为完了?不,你前面所有的都是在搭积木,tensorflow的静态图设计理念就是这样,先搭好积木,再去运算。
? 运算时就涉及到了数据下载,打乱,分batch,然后循环喂给run(),当然,一定循环次数下去保存模型和生成一定维度的样本图片看效果。
? 大部分过程就这样,有的我可能也没注意到,当然最主要是时间有限,不允许我再花时间再这个上了,具体代码里还有很多关于可视化,参数共享,GPU限速,版本兼容,命令行参数,数据读取,图片处理(等等),这些零碎的东西有兴趣的可以自己看,放在这里太乱了。当然不嫌弃乱的话可以去看我写的md文件——贼乱。
- 补充: 由于我都是线下写的,其他都有图片,放上来不能正常显示,只能放上这两个,而且为什么这排版会变成这样…
推荐阅读
- tensorflow|vgg16 finetune tensorflow实现
- deeplearning|ubuntu 16.04 + GTX1050安装nvidia驱动
- DCGAN——菜鸟系列 model.py
- DeepLearning|YOLO: Real-Time Object Detection
- Tensorflow之Java部署方案
- tensorflow|Bert瞎玩系列——bert的数据处理部分