【Pytorch】Cycle GAN实战(一):风格转换--真实风景图像转换为VanGogh风格
文章目录
- 一、Cycle GAN(CGAN)原理
- 1.1Conditional GAN
- 1.2Unsupervised Conditional GAN
- No.1 Direct Transformation,直接转换
- No.2 Projection to Common Spcae,先编码出抽象特征,在解码转换为图像
- 二、代码部分
- 2.1超参数
- 2.2数据预处理
- 2.3网络
- 2.4优化器和损失函数
- 三、运行结果
- 3.1CUDA占满问题
- 3.2训练过程
- (1)Epoch:10
- (2)Epoch:20
- (3)Epoch:50
- (4)Epoch:100
- (5)Epoch:200
- (6)汇总
- 四、小结
- 五、相关代码及参考资料
一、Cycle GAN(CGAN)原理
CycleGAN来自于uncongditional GAN,首先介绍一下conditional GAN和unconditional GAN。
1.1Conditional GAN
(图片截取自李宏毅老师机器学习课程) Conditional GAN中generator的输入是成对的数据,(条件标签,噪声z),generator的作用是生成对应条件标签的图片,而Discriminator的作用则由原来的一个(判断生成的数据是否为真)变为两个(判断生成的数据是否为真+生成数据是否与对应的条件标签相匹配)。
所以Dixcriminator判断为真的可能是:真实的图片+对应的标签;而判断为假的可能是:真实的图片+错误的条件标签,生成的图片+条件标签。
由此我们可以得到损失函数:
对于D来说:(就是从原来的两项变为了三项)当当当!
Ⅰ:从真实数据集中抽样出数据对(label,image)也就是{(c1,x1),(c2,x2),...,(cm,xm)}\left\{ \left( c^1,x^1 \right) ,\left( c^2,x^2 \right) ,...,\left( c^m,x^m \right) \right\}{(c1,x1),(c2,x2),...,(cm,xm)}
得到:1m∑i=1mlogD(ci,xi)\frac{1}{m}\sum\nolimits_{i=1}^m{\log D\left( c^i,x^i \right)}m1∑i=1mlogD(ci,xi)
Ⅱ:从真实数据集中抽样出数据{x^1,x^2,...,x^m}\left\{ \hat{x}^1,\hat{x}^2,...,\hat{x}^m \right\}{x^1,x^2,...,x^m}
得到:1m∑i=1mlog(1−D(ci,x^i))\frac{1}{m}\sum\nolimits_{i=1}^m{\log \left( 1-D\left( c^i,\hat{x}^i \right) \right)}m1∑i=1mlog(1−D(ci,x^i))
Ⅲ:由条件标签和噪声生成的fake数据{x~1,x~2,...,x~m},x~i=G(ci,zi)\left\{ \tilde{x}^1,\tilde{x}^2,...,\tilde{x}^m \right\} ,\tilde{x}^i=G\left( c^i,z^i \right){x~1,x~2,...,x~m},x~i=G(ci,zi)
得到:1m∑i=1mlog(1−D(ci,x~i))\frac{1}{m}\sum\nolimits_{i=1}^m{\log \left( 1-D\left( c^i,\tilde{x}^i \right) \right)}m1∑i=1mlog(1−D(ci,x~i))
所以:
V~=1m∑i=1mlogD(ci,xi)+1m∑i=1mlog(1−D(ci,x^i))+1m∑i=1mlog(1−D(ci,x~i))\tilde{V}=\frac{1}{m}\sum\nolimits_{i=1}^m{\log D\left( c^i,x^i \right)}+\frac{1}{m}\sum\nolimits_{i=1}^m{\log \left( 1-D\left( c^i,\hat{x}^i \right) \right)}+\frac{1}{m}\sum\nolimits_{i=1}^m{\log \left( 1-D\left( c^i,\tilde{x}^i \right) \right)}V~=m1∑i=1mlogD(ci,xi)+m1∑i=1mlog(1−D(ci,x^i))+m1∑i=1mlog(1−D(ci,x~i))θd←θd+η∇V~(θd)\theta _d\gets \theta _d+\eta \nabla \tilde{V}\left( \theta _d \right)θd←θd+η∇V~(θd)
那么对于G来说呢:
Ⅰ:噪声{z1,z2,...,zm}\left\{ z^1,z^2,...,z^m \right\}{z1,z2,...,zm},条件标签{c1,c2,...,cm}\left\{ c^1,c^2,...,c^m \right\}{c1,c2,...,cm} V~=1m∑i=1mlog(D(G(ci,zi))),θg←θg−η∇V~(θg)\tilde{V}=\frac{1}{m}\sum\nolimits_{i=1}^m{\log \left( D\left( G\left( c^i,z^i \right) \right) \right)},\theta _g\gets \theta _g-\eta \nabla \tilde{V}\left( \theta _g \right) V~=m1∑i=1mlog(D(G(ci,zi))),θg←θg−η∇V~(θg)
在这里稍微补充一下,我们刚刚说到了D的作用有两个分别是判断是否为真以及判断数据与条件标签是否匹配,但是还有一种观点是:
单独判断数据是否为真,以及再判断数据与条件是否匹配。李宏毅老师觉得这样更合理(我也这样想觉得哈哈哈哈)
Conditional GAN应用的情况是:给出文本,生成对应文本的图片text-to-image)、色彩图到实物图、轮廓图到实物图(image-to-image)、去除噪声。
1.2Unsupervised Conditional GAN
我这次尝试的是风格转换,是将一种风格A的图片转换成另一种风格B。一种风格的图片会有很多类,如果按照conditionalGAN的思想那么数据对则是对应类别的风格B的图片,但是显然如果我要将真实的图片转换为梵高大师的风格(在这里膜拜一下大师),不一定能在梵高大师的画作里找到我们对应的图片,而且你也不可能请梵高大师为你作画一幅是不是,除非你自己会画[狗头](天啊某大学生为学习深度学习亲自作画简直令闻者感动听者落泪啊)
Ok说到这里呢,其实就是conditionalGAN已经不适用这种情况啦,那可如何是好呢?其实刚才纠结的点就是类别的问题,我们找不到对应类别的目标风格的照片,所以我们能不能不要标签呢,让机器自己学会目标风格的数据分布。啊这,这不就是无监督学习做擅长干的事情嘛!对,所以就有聪明的前辈们,利用高级生物的智慧让机器进行unsupervised conditional generation,期间呢就创造出大大小小,多多少少好多种GAN,主要是两种思路。
No.1 Direct Transformation,直接转换
第一种思路最有名的就是我们今天要隆重介绍的cycleGAN啦!!整个网络的设计呢是这样滴:
整个网络设计了2个Generators,2个Discriminators。我们已有的图片数据分布为DomainX,想要转换的目标风格的数据分布为DomainY。
对于已有数据来说,2个Generators,GX→YG_{X\rightarrow Y}GX→Y将目标风格图像转换为已有数据分布,GX→YG_{X\rightarrow Y}GX→Y将生成的fake图像再转换为原来的图像,我们想要的是和原来目标风格的图像越接近越好。DXD_XDX判断生成的fake图像是否属于X分布。
我们先来说明一下各个数据符号表示及意义:
XXX:已有的数据分布,xix^ixi:已有的数据样本
YYY:目标风格数据分布,yiy^iyi:已有的目标风格的数据样本
GX→YG_{X\rightarrow Y}GX→Y:将XXX分布的数据生成YYY分布的数据,y~i\tilde{y}^iy~i:GX→YG_{X\rightarrow Y}GX→Y生成的YYY分布的数据,x~i\tilde{x}^ix~i:y~i\tilde{y}^iy~i又经GY→XG_{Y\rightarrow X}GY→X生成的XXX分布的数据
GY→XG_{Y\rightarrow X}GY→X:将YYY分布的数据生成XXX分布的数据,x~i\tilde{x}^ix~i:GY→XG_{Y\rightarrow X}GY→X生成的XXX分布的数据,y~i\tilde{y}^iy~i:x~i\tilde{x}^ix~i又经GX→YG_{X\rightarrow Y}GX→Y生成的YYY分布的数据
DYD_YDY:判断是否属于YYY分布的数据
DXD_XDX:判断是否属于XXX分布的数据
由此我们可以得到损失函数:
对于D来说:
Ⅰ:从已有数据集XXXdomain抽取 {x1,x2,...,xm}\left\{ x^1,x^2,...,x^m \right\}{x1,x2,...,xm},从目标风格数据集YYYdomain抽取{y1,y2,...,ym}\left\{ y^1,y^2,...,y^m \right\}{y1,y2,...,ym},对应生成的生成的fake数据{y~1,y~2,...,y~m},y~i=GX→Y(xi)\left\{ \tilde{y}^1,\tilde{y}^2,...,\tilde{y}^m \right\} ,\tilde{y}^i=G_{X\rightarrow Y}\left( x^i \right){y~1,y~2,...,y~m},y~i=GX→Y(xi)和{x~1,x~2,...,x~m},x~i=GY→X(yi)\left\{ \tilde{x}^1,\tilde{x}^2,...,\tilde{x}^m \right\} ,\tilde{x}^i=G_{Y\rightarrow X}\left( y^i \right){x~1,x~2,...,x~m},x~i=GY→X(yi)得到:LGAN_D(G,D,X,Y)=LGAN(GX→Y,DY,X,Y)+LGAN(GY→X,DX,X,Y)=[1m∑i=1mlogDY(yi)+1m∑i=1mlog(1−DY(GX→Y(xi)))]+[1m∑i=1mlogDX(xi)+1m∑i=1mlog(1−DX(GY→X(yi)))]L_{GAN\_D}\left( G,D,X,Y \right) =L_{GAN}\left( G_{X\rightarrow Y},D_Y,X,Y \right) +L_{GAN}\left( G_{Y\rightarrow X},D_X,X,Y \right) \\ =\left[ \frac{1}{m}\sum\nolimits_{i=1}^m{\log D_Y\left( y^i \right)}+\frac{1}{m}\sum\nolimits_{i=1}^m{\log \left( 1-D_Y\left( G_{X\rightarrow Y}\left( x^i \right) \right) \right)} \right] \\ +\left[ \frac{1}{m}\sum\nolimits_{i=1}^m{\log D_X\left( x^i \right)}+\frac{1}{m}\sum\nolimits_{i=1}^m{\log \left( 1-D_X\left( G_{Y\rightarrow X}\left( y^i \right) \right) \right)} \right] LGAN_D(G,D,X,Y)=LGAN(GX→Y,DY,X,Y)+LGAN(GY→X,DX,X,Y)=[m1∑i=1mlogDY(yi)+m1∑i=1mlog(1−DY(GX→Y(xi)))]+[m1∑i=1mlogDX(xi)+m1∑i=1mlog(1−DX(GY→X(yi)))] 所以:V~=LGAN_G(G,D,X,Y),θd←θd+η∇V~(θd)\tilde{V}=L_{GAN\_G}\left( G,D,X,Y \right),\theta _d\gets \theta _d+\eta \nabla \tilde{V}\left( \theta _d \right)V~=LGAN_G(G,D,X,Y),θd←θd+η∇V~(θd) 对于G来说:
Ⅰ:从已有数据集XXXdomain抽取{x1,x2,...,xm}\left\{ x^1,x^2,...,x^m \right\}{x1,x2,...,xm},从目标风格数据集YYYdomain抽取{y1,y2,...,ym}\left\{ y^1,y^2,...,y^m \right\}{y1,y2,...,ym},以及对应生成的各自的fake数据{y~1,y~2,...,y~m},y~i=GX→Y(xi)\left\{ \tilde{y}^1,\tilde{y}^2,...,\tilde{y}^m \right\} ,\tilde{y}^i=G_{X\rightarrow Y}\left( x^i \right){y~1,y~2,...,y~m},y~i=GX→Y(xi)和{x~1,x~2,...,x~m},x~i=GY→X(yi)\left\{ \tilde{x}^1,\tilde{x}^2,...,\tilde{x}^m \right\} ,\tilde{x}^i=G_{Y\rightarrow X}\left( y^i \right){x~1,x~2,...,x~m},x~i=GY→X(yi),得到:LGAN_G(G,D,X,Y)=LGAN(GX→Y,DY,X)+LGAN(GY→X,DX,Y)=1m∑i=1mlogDY(GX→Y(xi))+1m∑i=1mlogDX(GY→X(yi))L_{GAN\_G}\left( G,D,X,Y \right) =L_{GAN}\left( G_{X\rightarrow Y},D_Y,X \right) +L_{GAN}\left( G_{Y\rightarrow X},D_X,Y \right) \\ =\frac{1}{m}\sum\nolimits_{i=1}^m{\log D_Y\left( G_{X\rightarrow Y}\left( x^i \right) \right)}+\frac{1}{m}\sum\nolimits_{i=1}^m{\log D_X\left( G_{Y\rightarrow X}\left( y^i \right) \right)} LGAN_G(G,D,X,Y)=LGAN(GX→Y,DY,X)+LGAN(GY→X,DX,Y)=m1∑i=1mlogDY(GX→Y(xi))+m1∑i=1mlogDX(GY→X(yi)) Ⅱ:从已有数据集XXXdomain抽取{x1,x2,...,xm}\left\{ x^1,x^2,...,x^m \right\}{x1,x2,...,xm},从目标风格数据集YYYdomain抽取{y1,y2,...,ym}\left\{ y^1,y^2,...,y^m \right\}{y1,y2,...,ym},以及最后reconstruct的fake数据{x~1,x~2,...,x~m},x~i=GY→X(GX→Y(xi))\left\{ \tilde{x}^1,\tilde{x}^2,...,\tilde{x}^m \right\} ,\tilde{x}^i=G_{Y\rightarrow X}\left( G_{X\rightarrow Y}\left( x^i \right) \right){x~1,x~2,...,x~m},x~i=GY→X(GX→Y(xi))和{y~1,y~2,...,y~m},y~i=GX→Y(GY→X(yi))\left\{ \tilde{y}^1,\tilde{y}^2,...,\tilde{y}^m \right\} ,\tilde{y}^i=G_{X\rightarrow Y}\left( G_{Y\rightarrow X}\left( y^i \right) \right){y~1,y~2,...,y~m},y~i=GX→Y(GY→X(yi)),得到:Lcycle(GX→Y,GY→X,X,Y)=Lcycle(GX→Y,GY→X,X)+Lcycle(GX→Y,GY→X,Y)=1m∑i=1m∥GY→X(GX→Y(xi))−xi∥L1+1m∑i=1m∥GX→Y(GY→X(yi))−yi∥L1L_{cycle}\left( G_{X\rightarrow Y},G_{Y\rightarrow X},X,Y \right) =L_{cycle}\left( G_{X\rightarrow Y},G_{Y\rightarrow X},X \right) +L_{cycle}\left( G_{X\rightarrow Y},G_{Y\rightarrow X},Y \right) \\ =\frac{1}{m}\sum\nolimits_{i=1}^m{\left\| G_{Y\rightarrow X}\left( G_{X\rightarrow Y}\left( x^i \right) \right) -x^i \right\| _{L1}+}\frac{1}{m}\sum\nolimits_{i=1}^m{\left\| G_{X\rightarrow Y}\left( G_{Y\rightarrow X}\left( y^i \right) \right) -y^i \right\| _{L1}} Lcycle(GX→Y,GY→X,X,Y)=Lcycle(GX→Y,GY→X,X)+Lcycle(GX→Y,GY→X,Y)=m1∑i=1m∥∥GY→X(GX→Y(xi))−xi∥∥L1+m1∑i=1m∥∥GX→Y(GY→X(yi))−yi∥∥L1 从已有数据集XXXdomain抽取{x1,x2,...,xm}\left\{ x^1,x^2,...,x^m \right\}{x1,x2,...,xm},从目标风格数据集YYYdomain抽取{y1,y2,...,ym}\left\{ y^1,y^2,...,y^m \right\}{y1,y2,...,ym},以及对应生成的各自的fake数据{y~1,y~2,...,y~m},y~i=GX→Y(xi)\left\{ \tilde{y}^1,\tilde{y}^2,...,\tilde{y}^m \right\} ,\tilde{y}^i=G_{X\rightarrow Y}\left( x^i \right){y~1,y~2,...,y~m},y~i=GX→Y(xi)和{x~1,x~2,...,x~m},x~i=GY→X(yi)\left\{ \tilde{x}^1,\tilde{x}^2,...,\tilde{x}^m \right\} ,\tilde{x}^i=G_{Y\rightarrow X}\left( y^i \right){x~1,x~2,...,x~m},x~i=GY→X(yi),得到:Lidentity(GX→Y,GY→X,X,Y)=Lidentity(GX→Y,X)+Lidentity(GY→X,Y)=1m∑i=1m∥GX→Y(xi)−xi∥L1+1m∑i=1m∥GY→X(yi)−yi∥L1L_{identity}\left( G_{X\rightarrow Y},G_{Y\rightarrow X},X,Y \right) =L_{identity}\left( G_{X\rightarrow Y},X \right) +L_{identity}\left( G_{Y\rightarrow X},Y \right) \\ =\frac{1}{m}\sum\nolimits_{i=1}^m{\left\| G_{X\rightarrow Y}\left( x^i \right) -x^i \right\|}_{L1}+\frac{1}{m}\sum\nolimits_{i=1}^m{\left\| G_{Y\rightarrow X}\left( y^i \right) -y^i \right\|}_{L1} Lidentity(GX→Y,GY→X,X,Y)=Lidentity(GX→Y,X)+Lidentity(GY→X,Y)=m1∑i=1m∥∥GX→Y(xi)−xi∥∥L1+m1∑i=1m∥∥GY→X(yi)−yi∥∥L1 所以:V~=LGAN_G(G,D,X,Y)+Lcycle(GX→Y,GY→X,X,Y)+Lidentity(GX→Y,GY→X,X,Y)\tilde{V}=L_{GAN\_G}\left( G,D,X,Y \right) +L_{cycle}\left( G_{X\rightarrow Y},G_{Y\rightarrow X},X,Y \right) +L_{identity}\left( G_{X\rightarrow Y},G_{Y\rightarrow X},X,Y \right) V~=LGAN_G(G,D,X,Y)+Lcycle(GX→Y,GY→X,X,Y)+Lidentity(GX→Y,GY→X,X,Y)θg←θg−η∇V~(θg)\theta _g\gets \theta _g-\eta \nabla \tilde{V}\left( \theta _g \right) θg←θg−η∇V~(θg)
当然啦,任何网络都不是绝对完美的,同样的cycleGAN也存在着问题stenography,有人发现呢cycleGAN会把input的内容藏起来,output时再把内容呈现出来。以xi→y^i→x^ix^i\rightarrow \hat{y}^i\rightarrow \hat{x}^ixi→y^i→x^i为例,在生成中间的y^i\hat{y}^iy^i时,GX→YG_{X\rightarrow Y}GX→Y有很强的能力把信息藏在人看不到的地方,在恢复的时候GY→XG_{Y\rightarrow X}GY→X再把x^i\hat{x}^ix^i呈现出来。这样的话cycle consistency可能就没有意义,因为尽管xix^ixi与xix^ixi相似,但中间真正传入DYD_YDY的y^i\hat{y}^iy^i可能已经很不同了。
No.2 Projection to Common Spcae,先编码出抽象特征,在解码转换为图像
第二种也有很多的方法,在这里就不介绍啦。
二、代码部分
原理部分已分析完,我们来看看程序部分是怎么实现的呢
我现在已经看过并处理过几个完整的深度学习的神经网络啦,每次看的时候都会学到很多很多,除了基本的框架呢,有时候能感觉到作者的巧思,一些细节有花心思在上面,很让人惊叹!!而且在这个过程中,面对自己不懂的函数还有编程的思路呢,一点点分析就会有抽丝剥茧,按图索骥,最后恍然大悟的感觉!都说兴趣是最好的老师,我现在深以为然,之前我总觉得凡事都要系统的学习,但事实上现在的知识更多的是要靠自己呢由点及面逐步探索,而且在这个过程中,发现了数学思想带来的美妙,真的觉得很神奇!好啦说回程序部分吧。
2.1超参数
我此次参考的程序是论文提供的代码(忍不住惊叹:真的是写得很好呢!)和上次实现的DCGAN生成二次元头像的思路是一样的,也是将超参数写进类中,但是论文代码不是自定义类,而是调用argparse库进行初始化。
2.2数据预处理
是在__getitem__()函数里进行了改写,区分出了XXXdomain和YYYdomain的数据,返回字典X,YX,YX,Y作为键名。
2.3网络
网络这部分也是我觉得很新奇的写法。参考代码没有按照常规的一层一层列在Sequential()中,而是把一块一块放在blocklist中赋予一个变量model,有的块要好几次,就放在for循环里,model+=blocklist延长modellist,最后执行Sequential(*model)
另写了函数def Create_nets(),是不是看名字就知道啦!对吧,就是在这里把Generator和Discriminator实例化。
可能是我孤陋寡闻了,但是看到这里真的挺兴奋的,就觉得咦还能这样写!真的是简洁易懂。
2.4优化器和损失函数
还有这里!和def Create_nets()的想法一样,优化器和损失函数单独写了函数进行实例化。参考代码还写了更新学习率的函数,之前看的代码没有这一步呢。
参考代码有一个utils的py文件,给人感觉像是小工具包哈哈哈,一些绘图等函数就放在这里。这个作者很精致呢,小东西也不乱放收拾得整整齐齐哈,我后来写的绘制Loss图像的的函数也放在这里啦!
三、运行结果
3.1CUDA占满问题
OK这下我们代码部分也分析完啦,那么程序运行后的结果怎么样呢?
首先是!!在我的电脑上是根本跑不通滴,但然我很震惊的是601服务器上也跑不了!但是我一看它的batch只有1呀,后来想Discriminator和Generator翻了两倍,而且生成的图片是256*256[震惊脸],那参数量可就太多了,而且Discriminator和Generator都有好多层,之前的DCGAN是没法比的。于是果断修改生成图片的size。
下面是我记录的不同size下占用GPU,以及训练速度
后来我选用的是batch:45
3.2训练过程
在这里说明一下Loss图中的第二个子图画的是Loss_GAN,Loss_cycle,Loss_identity,子图上的title忘记修改了呜呜。
生成的图片8x4,一行4个是抽取4个样例,一列从上往下是:
yi(yi_Y)y^i\left( y^i\_Y \right)yi(yi_Y)
x~i(yi_X)=GY→X(yi)\tilde{x}^i\left( y^i\_X \right) =G_{Y\rightarrow X}\left( y^i \right)x~i(yi_X)=GY→X(yi)
y~i(yi_RY)=GX→Y(GY→X(yi))\tilde{y}^i\left( y^i\_RY \right) =G_{X\rightarrow Y}\left( G_{Y\rightarrow X}\left( y^i \right) \right)y~i(yi_RY)=GX→Y(GY→X(yi))
x^i(xi_X)=GY→X(xi)\hat{x}^i\left( x^i\_X \right) =G_{Y\rightarrow X}\left( x^i \right)x^i(xi_X)=GY→X(xi)
xi(xi_X)x^i\left( x^i\_X \right)xi(xi_X)
y~i(xi_Y)=GX→Y(xi)\tilde{y}^i\left( x^i\_Y \right) =G_{X\rightarrow Y}\left( x^i \right)y~i(xi_Y)=GX→Y(xi)
x~i(xi_RX)=GY→X(GX→Y(xi))\tilde{x}^i\left( x^i\_RX \right) =G_{Y\rightarrow X}\left( G_{X\rightarrow Y}\left( x^i \right) \right)x~i(xi_RX)=GY→X(GX→Y(xi))
y^i(yi_Y)=GX→Y(yi)\hat{y}^i\left( y^i\_Y \right) =G_{X\rightarrow Y}\left( y^i \right)y^i(yi_Y)=GX→Y(yi)
(1)Epoch:10
(2)Epoch:20
(3)Epoch:50
(4)Epoch:100
(5)Epoch:200
(6)汇总
Epoch | LD_LG和LG_Lcycle_Lidentity | Real_Fake |
---|---|---|
10 | ||
20 | ||
50 | ||
100 | ||
200 |
这次试验,也是复现代码,没有进行调参的工作。可以看到随着训练测试的增多,风格迁移的效果越来越好。而且Loss也是在按照期望的在减小,但训练到100epoch和200epoch的时候Loss有上升的趋势,此时应该是模型训练到一定程度之后出现的不稳定,不再随着梯度更新而进行减小。
四、小结
从最开始实习对GAN一知半解,到现在比较清楚GAN的网络结构以及原理,而GAN的两大应用分类以及生成数据也都进行了尝试(不知道这里说的对不对嘻嘻)收获很多很多。而且最最开始,自己算是野路子对深度学习的尝试东一榔头西一棒槌,不成体系,现在回过头看自己也是走了一些弯路哦哈哈哈,不过现在呢,已经慢慢知道如果之后还继续学习深度学习的内容应该要怎么做啦!!这一阶段的学习我准备暂告一段落,之后还会带着浓厚的兴趣继续学习下去!
五、相关代码及参考资料
论文代码:https://codechina.csdn.net/mirrors/junyanz/pytorch-cyclegan-and-pix2pix?utm_source=csdn_github_accelerator
论文数据集:https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/datasets/
论文:https://arxiv.org/pdf/1508.06576.pdf
【Pytorch】Cycle GAN实战(一):风格转换--真实风景图像转换为VanGogh风格相关推荐
- PyTorch进行神经风格转换/迁移(Neural-Transfer:图像风格迁移)
前言 文章目录 前言 1.介绍 2. 基本原理 3 准备工作 4 加载素材 1.介绍 本教程主要讲解如何实现由Leon A. Gatys,Alexander S. Ecker和Matthias Bet ...
- 实战| 一行命令对你的图像视频进行风格迁移
1.项目介绍 今天我们要做的是一个快速图像风格迁移的程序. 那么,什么是图像风格迁移?图像风格迁移就是把一种图像风格转变为另一种图像风格.例如,原图为: 加上不同风格的图像可以得到如下不同的结果: 2 ...
- Matlab实现将图像转换为素描风格
代码分为两个部分:colorgrad.m和demo.m colorgrad.m function [VG, A, PPG] = colorgrad(f, T) if (ndims(f)~=3) || ...
- pytorch训练GAN的代码(基于MNIST数据集)
论文:Generative Adversarial Networks 作者:Ian J. Goodfellow 年份:2014年 从2020年3月多开始看网络,这是我第一篇看并且可以跑通代码的论文,简 ...
- 吴恩达【深度学习工程师】 04.卷积神经网络 第四周特殊应用(2)神经风格转换...
该笔记介绍的是<卷积神经网络>系列第四周:特殊应用(2)神经风格转换 主要内容有: 1.神经风格转换 2.卷积网络隐藏单元可视化显示 3.神经风格转换代价函数 4.内容代价函数 5.风格代 ...
- ++库 照片风格转换风格_如何用神经网络实现照片的风格转换
前言 在今天的文章中,我们将实现风格转换效果.为了做到这一点,我们必须更深入地理解卷积神经网络及其各层是如何工作的.在本文的最后,您将能够创建并运行一个风格转换程序. 什么是风格转换 在我们开始我们的 ...
- (二)快速图像风格转换
快速图像风格迁移是在"原始"图像风格迁移基础上的一种"高效"转换方案. [github传送门]https://github.com/hzy46/fast-neu ...
- pytorch 音频分类_Pytorch中音频的神经风格转换
pytorch 音频分类 They've been some really interesting applications of style transfer. It basically aims ...
- 《深度学习之pytorch实战计算机视觉》第8章 图像风格迁移实战(代码可跑通)
上一章<深度学习之pytorch实战计算机视觉>第7章 迁移学习(代码可跑通)介绍了迁移学习.本章将完成一个有趣的应用,基于卷积神经网络实现图像风格迁移(Style Transfer).和 ...
最新文章
- Python自动化测试框架之Pytest教程【让你小鸡变老鹰】
- 你在网上看到的0失误游戏视频,可以是用AI生成的丨Demo在线可玩
- [笔记]modelsim前仿后仿各种问题
- php去掉内部空格_php中去掉头尾空格3种方法
- apache rewrite机制
- Stream进阶篇-消费组实现验证
- 2021海口高考调研成绩查询,2021海口市地区高考成绩排名查询,海口市高考各高中成绩喜报榜单...
- 【转载】微信小程序中引入iconfont阿里矢量图库
- C# 实现自动ADSL拨号
- Http协议是无状态的 作者:cp_insist
- Excel学习1:图表配色
- 2020中山大学计算机学院保研,我校举行中山大学2020级研究生招生宣讲会
- 盒子鱼 android4.2.2,BOXFiSH盒子鱼家长
- 安利一波软件、插件及其他
- 计算机中十六乘十六进制怎么算,16进制的乘法怎么算
- SEO系列三:周珍谈新手如何快速入门
- PDF复制乱码 -- 原因及解决方案
- paper_summary
- Python 画图,点线图
- 飞思卡尔杯全国大学生智能车竞赛回忆录(双车追逐组)