
git clone https://github.com/eriklindernoren/PyTorch-GAN.git
下载后运行代码会自动下载MNIST数据集
IDE推荐使用 PyCharm 进行开发

对于DCGAN没有一个机制保证生成器需要生成不一样的数据,当模式崩溃即将发生时,判别器中许多相似点的梯度会指向一个相近的方向。计算判别器中某一层特征中,同一个batch各样本特征间的差异,来作为下一层的额外输入。这种方法能够快速的生成视觉上能够感知出明显差异的样本。

核心要点


编码器:使P(z|x)逼近分布P(z),比如标准正态分布,同时最小化生成器(解码器)和输入x的差距
解码器:最小化输出和输入x的差距,同时要骗过判别器
判别器:给真实样本高分,给重建样本和生成样本低分
评价指标的基本要求:

∥ μ data − μ g ∥ + tr ( Σ data + Σ g − 2 ( Σ data Σ g ) 1 2 ) \left\|\mu_{\text {data }}-\mu_g\right\|+\operatorname{tr}\left(\Sigma_{\text {data }}+\Sigma_g-2\left(\Sigma_{\text {data }} \Sigma_g\right)^{\frac{1}{2}}\right) ∥μdata −μg∥+tr(Σdata +Σg−2(Σdata Σg)21)
E x , x ′ ∼ p data [ k ( x , x ′ ) ] − 2 E x ∼ p data y ∼ p g [ k ( x , y ) ] + E y , y ′ ∼ p g [ k ( y , y ′ ) ] \mathbb{E}_{x, x^{\prime} \sim p_{\text {data }}}\left[k\left(x, x^{\prime}\right)\right]-2 \mathbb{E}_{x \sim p_{\text {data }} y \sim p_g}[k(x, y)]+\mathbb{E}_{y, y^{\prime} \sim p_g}\left[k\left(y, y^{\prime}\right)\right] Ex,x′∼pdata [k(x,x′)]−2Ex∼pdata y∼pg[k(x,y)]+Ey,y′∼pg[k(y,y′)]
SSIM ( X , Y ) = [ L M ( X , Y ) ] α M ∏ J = 1 M [ C J ( X , Y ) ] β j [ S J ( X , Y ) ] γ j \operatorname{SSIM}(X, Y)=\left[L_M(X, Y)\right]^{\alpha M} \prod_{J=1}^M\left[C_J(X, Y)\right]^{\beta_j}\left[S_J(X, Y)\right]^{\gamma_j} SSIM(X,Y)=[LM(X,Y)]αMJ=1∏M[CJ(X,Y)]βj[SJ(X,Y)]γj



Loss
G
=
−
D
(
x
′
)
\operatorname{Loss}_G=-D\left(x^{\prime}\right)
LossG=−D(x′)
G
P
=
(
∥
∇
D
(
a
x
′
+
(
1
−
a
)
x
)
)
∥
2
−
1
)
2
\left.G P=\left(\| \nabla D\left(a x^{\prime}+(1-a) x\right)\right) \|_2-1\right)^2
GP=(∥∇D(ax′+(1−a)x))∥2−1)2
Loss
D
=
−
D
(
x
)
+
D
(
x
′
)
+
λ
∗
G
P
\operatorname{Loss}_D=-D(x)+D\left(x^{\prime}\right)+\lambda * G P
LossD=−D(x)+D(x′)+λ∗GP

He (Kaiming) 初始化
目标:正向传播时,feature的方差保持不变;反向传播时,梯度的方差保持不变
适用于ReLU的初始化方法:
W
∼
N
[
0
,
2
n
i
]
适用于Leaky ReLU的初始化方法:
W
∼
N
[
0
,
2
(
1
+
α
2
)
n
^
i
]
n
^
i
=
h
i
∗
w
i
∗
d
i
使用标准正态分布来初始化权重,然后在运行阶段对权重进行缩放,缩放系数使用He初始化中求得的标准差
之所以进行动态的缩放,而不是直接使用He初始化,与当前流行的自适应随机梯度下降方法(比如Adam)中的尺度不变性相关
自适应随机梯度下降方法,会对频繁变化的参数以更小的步长进行更新,而稀疏的参数以更大的步长进行更新;比如在使用Adam时,如果某些参数的变化范围(标准差)比较大,那么它会被设置一个较小的学习速率
通过这样的动态缩放权重,在使用自适应随机梯度下降方法时,就可以确保所有权重的变化范围和学习速率都相同
希望能控制网络中的信号幅度
在生成器的每一个卷积层之后,对feature中每个像素在channel上归一化到单位长度
使用“局部响应归一化”的变体来实现
b
x
,
y
=
a
x
,
y
/
1
N
∑
j
=
0
N
−
1
(
a
x
,
y
j
)
2
+
ϵ
b_{x, y}=a_{x, y} / \sqrt{\frac{1}{N} \sum_{j=0}^{N-1}\left(a_{x, y}^j\right)^2+\epsilon}
bx,y=ax,y/N1j=0∑N−1(ax,yj)2+ϵ
这样一个非常严格的限制,不过却并没有让生成器的性能受到损失
对于大多数数据集来说,使用像素归一化后结果没有太大变化,但可以在网络的信号强度过大时进行有效抑制


生成图像的分辨率为128x128,使用轻量级网络,在训练量达到10M时停止,网络还没有完全收敛
MS-SSIM的评价使用了10000张生成图像
一开始 batch size设为 64,之后改为 16
最终版本使用了更大的网络和更长时间的训练使得网络收敛,其生成效果至少可以与SOA相比较

使用渐进式训练一方面可以提升生成质量,一方面可以减少训练的总时间
可以把渐进式的网络加深看做是一种隐式的课程学习,从而来理解生成质量的提升

