admin管理员组文章数量:1630596
文章目录
- 一、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
所以Dixcriminator判断为真的可能是:真实的图片+对应的标签;而判断为假的可能是:真实的图片+错误的条件标签,生成的图片+条件标签。
由此我们可以得到损失函数:
对于D来说:(就是从原来的两项变为了三项)当当当!
Ⅰ:从真实数据集中抽样出数据对(label,image)也就是
{
(
c
1
,
x
1
)
,
(
c
2
,
x
2
)
,
.
.
.
,
(
c
m
,
x
m
)
}
\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)}
得到: 1 m ∑ i = 1 m log D ( c i , x i ) \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}
得到: 1 m ∑ i = 1 m log ( 1 − D ( c i , 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 ( c i , z i ) \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)
得到: 1 m ∑ i = 1 m log ( 1 − D ( c i , 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
~
=
1
m
∑
i
=
1
m
log
D
(
c
i
,
x
i
)
+
1
m
∑
i
=
1
m
log
(
1
−
D
(
c
i
,
x
^
i
)
)
+
1
m
∑
i
=
1
m
log
(
1
−
D
(
c
i
,
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来说呢:
Ⅰ:噪声
{
z
1
,
z
2
,
.
.
.
,
z
m
}
\left\{ z^1,z^2,...,z^m \right\}
{z1,z2,...,zm},条件标签
{
c
1
,
c
2
,
.
.
.
,
c
m
}
\left\{ c^1,c^2,...,c^m \right\}
{c1,c2,...,cm}
V
~
=
1
m
∑
i
=
1
m
log
(
D
(
G
(
c
i
,
z
i
)
)
)
,
θ
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,
G
X
→
Y
G_{X\rightarrow Y}
GX→Y将目标风格图像转换为已有数据分布,
G
X
→
Y
G_{X\rightarrow Y}
GX→Y将生成的fake图像再转换为原来的图像,我们想要的是和原来目标风格的图像越接近越好。
D
X
D_X
DX判断生成的fake图像是否属于X分布。
我们先来说明一下各个数据符号表示及意义:
X
X
X:已有的数据分布,
x
i
x^i
xi:已有的数据样本
Y
Y
Y:目标风格数据分布,
y
i
y^i
yi:已有的目标风格的数据样本
G
X
→
Y
G_{X\rightarrow Y}
GX→Y:将
X
X
X分布的数据生成
Y
Y
Y分布的数据,
y
~
i
\tilde{y}^i
y~i:
G
X
→
Y
G_{X\rightarrow Y}
GX→Y生成的
Y
Y
Y分布的数据,
x
~
i
\tilde{x}^i
x~i:
y
~
i
\tilde{y}^i
y~i又经
G
Y
→
X
G_{Y\rightarrow X}
GY→X生成的
X
X
X分布的数据
G
Y
→
X
G_{Y\rightarrow X}
GY→X:将
Y
Y
Y分布的数据生成
X
X
X分布的数据,
x
~
i
\tilde{x}^i
x~i:
G
Y
→
X
G_{Y\rightarrow X}
GY→X生成的
X
X
X分布的数据,
y
~
i
\tilde{y}^i
y~i:
x
~
i
\tilde{x}^i
x~i又经
G
X
→
Y
G_{X\rightarrow Y}
GX→Y生成的
Y
Y
Y分布的数据
D
Y
D_Y
DY:判断是否属于
Y
Y
Y分布的数据
D
X
D_X
DX:判断是否属于
X
X
X分布的数据
由此我们可以得到损失函数:
对于D来说:
Ⅰ:从已有数据集
X
X
Xdomain抽取
{
x
1
,
x
2
,
.
.
.
,
x
m
}
\left\{ x^1,x^2,...,x^m \right\}
{x1,x2,...,xm},从目标风格数据集
Y
Y
Ydomain抽取
{
y
1
,
y
2
,
.
.
.
,
y
m
}
\left\{ y^1,y^2,...,y^m \right\}
{y1,y2,...,ym},对应生成的生成的fake数据
{
y
~
1
,
y
~
2
,
.
.
.
,
y
~
m
}
,
y
~
i
=
G
X
→
Y
(
x
i
)
\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
=
G
Y
→
X
(
y
i
)
\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)得到:
L
G
A
N
_
D
(
G
,
D
,
X
,
Y
)
=
L
G
A
N
(
G
X
→
Y
,
D
Y
,
X
,
Y
)
+
L
G
A
N
(
G
Y
→
X
,
D
X
,
X
,
Y
)
=
[
1
m
∑
i
=
1
m
log
D
Y
(
y
i
)
+
1
m
∑
i
=
1
m
log
(
1
−
D
Y
(
G
X
→
Y
(
x
i
)
)
)
]
+
[
1
m
∑
i
=
1
m
log
D
X
(
x
i
)
+
1
m
∑
i
=
1
m
log
(
1
−
D
X
(
G
Y
→
X
(
y
i
)
)
)
]
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
~
=
L
G
A
N
_
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来说:
Ⅰ:从已有数据集
X
X
Xdomain抽取
{
x
1
,
x
2
,
.
.
.
,
x
m
}
\left\{ x^1,x^2,...,x^m \right\}
{x1,x2,...,xm},从目标风格数据集
Y
Y
Ydomain抽取
{
y
1
,
y
2
,
.
.
.
,
y
m
}
\left\{ y^1,y^2,...,y^m \right\}
{y1,y2,...,ym},以及对应生成的各自的fake数据
{
y
~
1
,
y
~
2
,
.
.
.
,
y
~
m
}
,
y
~
i
=
G
X
→
Y
(
x
i
)
\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
=
G
Y
→
X
(
y
i
)
\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),得到:
L
G
A
N
_
G
(
G
,
D
,
X
,
Y
)
=
L
G
A
N
(
G
X
→
Y
,
D
Y
,
X
)
+
L
G
A
N
(
G
Y
→
X
,
D
X
,
Y
)
=
1
m
∑
i
=
1
m
log
D
Y
(
G
X
→
Y
(
x
i
)
)
+
1
m
∑
i
=
1
m
log
D
X
(
G
Y
→
X
(
y
i
)
)
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)) Ⅱ:从已有数据集
X
X
Xdomain抽取
{
x
1
,
x
2
,
.
.
.
,
x
m
}
\left\{ x^1,x^2,...,x^m \right\}
{x1,x2,...,xm},从目标风格数据集
Y
Y
Ydomain抽取
{
y
1
,
y
2
,
.
.
.
,
y
m
}
\left\{ y^1,y^2,...,y^m \right\}
{y1,y2,...,ym},以及最后reconstruct的fake数据
{
x
~
1
,
x
~
2
,
.
.
.
,
x
~
m
}
,
x
~
i
=
G
Y
→
X
(
G
X
→
Y
(
x
i
)
)
\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
=
G
X
→
Y
(
G
Y
→
X
(
y
i
)
)
\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)),得到:
L
c
y
c
l
e
(
G
X
→
Y
,
G
Y
→
X
,
X
,
Y
)
=
L
c
y
c
l
e
(
G
X
→
Y
,
G
Y
→
X
,
X
)
+
L
c
y
c
l
e
(
G
X
→
Y
,
G
Y
→
X
,
Y
)
=
1
m
∑
i
=
1
m
∥
G
Y
→
X
(
G
X
→
Y
(
x
i
)
)
−
x
i
∥
L
1
+
1
m
∑
i
=
1
m
∥
G
X
→
Y
(
G
Y
→
X
(
y
i
)
)
−
y
i
∥
L
1
L_{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 从已有数据集
X
X
Xdomain抽取
{
x
1
,
x
2
,
.
.
.
,
x
m
}
\left\{ x^1,x^2,...,x^m \right\}
{x1,x2,...,xm},从目标风格数据集
Y
Y
Ydomain抽取
{
y
1
,
y
2
,
.
.
.
,
y
m
}
\left\{ y^1,y^2,...,y^m \right\}
{y1,y2,...,ym},以及对应生成的各自的fake数据
{
y
~
1
,
y
~
2
,
.
.
.
,
y
~
m
}
,
y
~
i
=
G
X
→
Y
(
x
i
)
\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
=
G
Y
→
X
(
y
i
)
\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),得到:
L
i
d
e
n
t
i
t
y
(
G
X
→
Y
,
G
Y
→
X
,
X
,
Y
)
=
L
i
d
e
n
t
i
t
y
(
G
X
→
Y
,
X
)
+
L
i
d
e
n
t
i
t
y
(
G
Y
→
X
,
Y
)
=
1
m
∑
i
=
1
m
∥
G
X
→
Y
(
x
i
)
−
x
i
∥
L
1
+
1
m
∑
i
=
1
m
∥
G
Y
→
X
(
y
i
)
−
y
i
∥
L
1
L_{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
~
=
L
G
A
N
_
G
(
G
,
D
,
X
,
Y
)
+
L
c
y
c
l
e
(
G
X
→
Y
,
G
Y
→
X
,
X
,
Y
)
+
L
i
d
e
n
t
i
t
y
(
G
X
→
Y
,
G
Y
→
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时再把内容呈现出来。以
x
i
→
y
^
i
→
x
^
i
x^i\rightarrow \hat{y}^i\rightarrow \hat{x}^i
xi→y^i→x^i为例,在生成中间的
y
^
i
\hat{y}^i
y^i时,
G
X
→
Y
G_{X\rightarrow Y}
GX→Y有很强的能力把信息藏在人看不到的地方,在恢复的时候
G
Y
→
X
G_{Y\rightarrow X}
GY→X再把
x
^
i
\hat{x}^i
x^i呈现出来。这样的话cycle consistency可能就没有意义,因为尽管
x
i
x^i
xi与
x
i
x^i
xi相似,但中间真正传入
D
Y
D_Y
DY的
y
^
i
\hat{y}^i
y^i可能已经很不同了。
No.2 Projection to Common Spcae,先编码出抽象特征,在解码转换为图像
第二种也有很多的方法,在这里就不介绍啦。
二、代码部分
原理部分已分析完,我们来看看程序部分是怎么实现的呢
我现在已经看过并处理过几个完整的深度学习的神经网络啦,每次看的时候都会学到很多很多,除了基本的框架呢,有时候能感觉到作者的巧思,一些细节有花心思在上面,很让人惊叹!!而且在这个过程中,面对自己不懂的函数还有编程的思路呢,一点点分析就会有抽丝剥茧,按图索骥,最后恍然大悟的感觉!都说兴趣是最好的老师,我现在深以为然,之前我总觉得凡事都要系统的学习,但事实上现在的知识更多的是要靠自己呢由点及面逐步探索,而且在这个过程中,发现了数学思想带来的美妙,真的觉得很神奇!好啦说回程序部分吧。
2.1超参数
我此次参考的程序是论文提供的代码(忍不住惊叹:真的是写得很好呢!)和上次实现的DCGAN生成二次元头像的思路是一样的,也是将超参数写进类中,但是论文代码不是自定义类,而是调用argparse库进行初始化。
2.2数据预处理
是在__getitem__()函数里进行了改写,区分出了 X X Xdomain和 Y Y Ydomain的数据,返回字典 X , Y X,Y X,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个样例,一列从上往下是:
y
i
(
y
i
_
Y
)
y^i\left( y^i\_Y \right)
yi(yi_Y)
x
~
i
(
y
i
_
X
)
=
G
Y
→
X
(
y
i
)
\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
(
y
i
_
R
Y
)
=
G
X
→
Y
(
G
Y
→
X
(
y
i
)
)
\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
(
x
i
_
X
)
=
G
Y
→
X
(
x
i
)
\hat{x}^i\left( x^i\_X \right) =G_{Y\rightarrow X}\left( x^i \right)
x^i(xi_X)=GY→X(xi)
x
i
(
x
i
_
X
)
x^i\left( x^i\_X \right)
xi(xi_X)
y
~
i
(
x
i
_
Y
)
=
G
X
→
Y
(
x
i
)
\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
(
x
i
_
R
X
)
=
G
Y
→
X
(
G
X
→
Y
(
x
i
)
)
\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
(
y
i
_
Y
)
=
G
X
→
Y
(
y
i
)
\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/mirrors/junyanz/pytorch-cyclegan-and-pix2pix?utm_source=csdn_github_accelerator
论文数据集:https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/datasets/
论文:https://arxiv/pdf/1508.06576.pdf
版权声明:本文标题:【Pytorch】Cycle GAN实战(一):风格转换--真实风景图像转换为VanGogh风格 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1729069986a1184940.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论