![v2-fda28f2bdc7b9fb85fc73d1f52e401de_1440w.jpg?source=172ae18b](http://img-02.proxy.5ce.com/view/image?&type=2&guid=68ccca11-be2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-fda28f2bdc7b9fb85fc73d1f52e401de_1440w.jpg?source=172ae18b)
引言
继上次写完 gan在 keras和 TensorFlow两个框架的入门后,这次补充一下 gan和 dcgan在 pytorch框架的代码。顺带安利一下怎么将 cpu的代码修改成使用 cuda进行加速的代码,还有怎么将运行在 cpu的模型参数保存下来接着到 gpu的环境下加载运行 (代码链接在后面,有个案例在手还是挺有用的,说不定哪天就用上了!)然后也顺带写一下怎么将运行在 gpu的模型参数保存下来到 cpu环境下加载运行 (这种情况可能较少吧,但是积累起来也不是坏事)
如果对gan还不太熟悉的,推荐看我上一篇的gan入门指南。个人认为,里面的指引对新手应该有挺大帮助的(起码有个小方向),传送门:
seven:GAN新手入门指南+keras&TensorFlow代码详解(WIN10)zhuanlan.zhihu.com![v2-ff6d2d27b293d25693ad4727d55f44dd_180x120.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=68ccca11-be2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-ff6d2d27b293d25693ad4727d55f44dd_180x120.jpg)
文章附带的代码有一个是在gpu环境下使用cuda加速的,如果不感兴趣可以略过那一个,直接使用cpu环境的代码训练就好了;如果感兴趣但还没配置pytorch+cuda+cudnn环境的童鞋可以看一下这篇环境配置的文章,传送门:
seven:Pytorch1.0+CUDA10.0+cuDNN环境配置之谈(Win 10)zhuanlan.zhihu.com![v2-3d1d89708a8ca32aed883bea0aa77f86_180x120.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=68ccca11-be2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-3d1d89708a8ca32aed883bea0aa77f86_180x120.jpg)
代码运行环境:
电脑:联想小新Air 13 pro CPU:i5 ,4G运行内存 显卡:NVIDIA GeForce 940MX,2G显存 系统:windows10 64位系统 软件:Anaconda 5.3.0 python 3.6.6 pytorch1.0(cpu) pytorch1.0(gpu)
正题
GAN代码
这次讲一下pytorch这个框架的gan。我参考的资料有:
eriklindernoren/PyTorch-GANgithub.com![v2-6da8eceac843afc93e2218a5717d511c_ipico.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=68ccca11-be2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-6da8eceac843afc93e2218a5717d511c_ipico.jpg)
![v2-2d9ceed78978badf52f685b50ced44c6_ipico.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=68ccca11-be2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-2d9ceed78978badf52f685b50ced44c6_ipico.jpg)
其中第一份是eriklindernoren关于gan的github地址,里面收集了很多pytorch写的gan和gan的一些衍生模型的代码,是很重要的一份干货。如果搜一下就会发现机器之心和量子云等都安利过这个github仓库。再附上一份我添加了一些注释的普通gan代码,应该是比较好理解的了:
Hyfred/gan-torchgithub.com![v2-19eb3194983c69ccd3e293b1377493ef_ipico.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=68ccca11-be2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-19eb3194983c69ccd3e293b1377493ef_ipico.jpg)
如果之前跟过keras和TensorFlow的框架的话,这次新上手pytorch就会发现pytorch和前两个框架还是有较大的区别的,主要就在于静态图和动态图的区别了。keras和TensorFlow就属于静态图,运行的步骤大概就是你把图架构做好,再输入到对话执行。而pytorch这种动态图就略显灵活了,因为在整个过程中,很多东西的修改和调用就方便了许多。这段话你可以看一下我之前发过的TensorFlow的gan和pytorch的gan代码就有体会了,TensorFlow里面把网络架构和损失函数等搭好,传入对话运行的代码很简洁。pytorch的话就是把网络架构搭好之后,在最后的for循环里写出来损失函数等,代码就比较多。反正就是两个框架的特点还是比较鲜明的
扯了一下我自己对pytorch和TensorFlow、keras的小感受,如果还想深入了解的可以关注一下这个问题:
PyTorch到底好用在哪里?www.zhihu.com挺多大神在里面回答的,都讲得十分到位。
DCGAN
接着主要讲一下dcgan,其实dcgan跟gan十分相近,思路不变只是框架变了。附上一份使用dcgan生成cifar的代码:
Hyfred/gan-torchgithub.com![v2-19eb3194983c69ccd3e293b1377493ef_ipico.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=68ccca11-be2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-19eb3194983c69ccd3e293b1377493ef_ipico.jpg)
注释基本都在里边,稍微强调一下读取数据集的代码:
#读取数据集
因为原数据集有50000张32*32的图片,我们使用pytorch的内置函数DataLoader按一个批次64张图片来读取,所以会有782批,最后一批不够64张,只有16张图片。由于数据集本身的结构,所以我们调用数据集的时候需要使用for循环,enumerate(dataloader)这个命令的是同时将数据集(批次)的索引和数据集(批次)输出。也就是一批一批的进行循环(除了最后一批为16张图,其他每批64张图)。数据集命名为data,它分为两部分,我们只需要第一部分(real_images),它是一个四维向量(第一维为批次数,第二维为通道数,第三维和第四维为图片的长宽,也就是64*3*32*32,最后一个批次为16*3*32*32)最后使用一个for循环:每100批保存一次原图,我们有782个批次,所以只能保存8张图片(第0,100,200...700批保存当批的图片),每一张图片是该批次的图片,nrow=8设置保存的图片格局有8个列,因为每批有64张图片,所以就是8*8=64(8行8列)的格局。
还有就是我们在扩大图像的时候有两种思路:一种是插值(上采样);另一种是反卷积。在搭建生成网络G时,我们就使用了反卷积(转置卷积)的概念,命令为“nn.ConvTranspose2d”,转置卷积的原理可以看一下:
pytorch演示卷积和反卷积运算 - qq_37879432的博客 - CSDN博客blog.csdn.net![v2-68a1b5037cd725674b3cf087a7fa7686_180x120.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=68ccca11-be2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-68a1b5037cd725674b3cf087a7fa7686_180x120.jpg)
至于最后训练模型的for循环,就跟我上一篇文章讲过的类似了,如果忘记了可以回顾一下我上一篇文章讲的内容。另外,在代码最后使用:
torch
将生成网络G和判别网络D的训练参数进行保存,命名为“generator.pth”和“discriminator.pth”。我做到这里的时候是嫌cpu环境下模型训练的太慢了,所以想着在gpu环境下继续训练模型,所以我重新改了一份可以在gpu环境下跑的代码,其实就是在源代码的基础上修改了一些命令,代码链接:
Hyfred/gan-torchgithub.com![v2-19eb3194983c69ccd3e293b1377493ef_ipico.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=68ccca11-be2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-19eb3194983c69ccd3e293b1377493ef_ipico.jpg)
其实修改成gpu版的代码并没想象的这么难,我是参考了这篇知乎然后进行修改的,如果有需要修改的话,可以看看我发的这个链接,然后看看我两份代码的修改处就ok了,倘若有些地方没修改到,你就看它第一个报错的地方,像这样
![v2-d88e24c6b71fc3d842f5386038bc6142_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=68ccca11-be2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-d88e24c6b71fc3d842f5386038bc6142_b.jpg)
![v2-35e0fb0dea91e6018d5300a5b5e9b95f_b.png](http://img-03.proxy.5ce.com/view/image?&type=2&guid=68ccca11-be2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-35e0fb0dea91e6018d5300a5b5e9b95f_b.png)
你就知道要去哪里修改:
#源代码:
全部修改完并确定可以运行gpu环境下cuda加速的代码之后,加载我们在cpu环境下保存的代码参数:
#载入cpu训练的预参数
就可以接着训练了。
在这个基础上,我补充一下:cpu训练的参数保存下来接着在cpu的环境下加载的代码:
#载入cpu训练的预参数
补充一下:gpu训练的参数保存下来接着在cpu的环境下加载的代码:
#载入gpu训练的预参数
补充一下:gpu训练的参数保存下来接着在gpu的环境下加载的代码:
#载入gpu训练的预参数
基本上你实操一遍就可以掌握了。
尾声
这次使用pytorch的框架玩了一下普通的gan和dcgan,加上之前写过的keras和TensorFlow的gan,如果你跟了一遍之后,基本上就跟深度学习最火的三个框架打了一遍交道了,也可以亲身感受一下这三个框架的区别。另外,个人认为加载参数继续训练这种小技巧还是挺有用的,希望这个案例也能当做典例储备一下哈!~