图像分类案例2
任务
Kaggle竞赛中的犬种识别挑战,比赛的网址是https://www.kaggle.com/c/dog-breed-identification在这项比赛中,我们尝试确定120种不同的狗。
首先对数据集结构进行了整理,原数据集按train、test结构,修改后在train、test下建立以类别分类的文件夹
| train_valid_test
| train
| | affenpinscher
| | | 00ca18751837cd6a22813f8e221f7819.jpg
| | | ...
| | afghan_hound
| | | 0a4f1e17d720cdff35814651402b7cf4.jpg
| | | ...
| | ...
| valid
| | affenpinscher
| | | 56af8255b46eb1fa5722f37729525405.jpg
| | | ...
| | afghan_hound
| | | 0df400016a7e7ab4abff824bf2743f02.jpg
| | | ...
| | ...
| train_valid
| | affenpinscher
| | | 00ca18751837cd6a22813f8e221f7819.jpg
| | | ...
| | afghan_hound
| | | 0a4f1e17d720cdff35814651402b7cf4.jpg
| | | ...
| | ...
| test
| | unknown
| | | 00a3edd22dc7859c487a64777fc8d093.jpg
| | | ...
模型
使用预训练的RseNet-34模型,采用微调的方法,只重新训练输出层,将输出改为120类,其他抽取特征的其他部分予以保留。
GAN
生成对抗网络,即生成器和判别器两部分网络。两者相互博弈,相互训练。
对于生成器的任务是生成以假乱真的数据,以骗过判别器。
判别器则是区分真实数据和生成器生成的假数据。
损失函数
判别器
使用交叉熵损失
min
D
{
−
y
log
D
(
x
)
−
(
1
−
y
)
log
(
1
−
D
(
x
)
)
}
,
\min_D \{ - y \log D(\mathbf x) - (1-y)\log(1-D(\mathbf x)) \},
minD{−ylogD(x)−(1−y)log(1−D(x))},
对于真实数据
y
=
1
y=1
y=1,假数据
y
=
0
y=0
y=0,训练时使两者平均损失最小。
生成器
同样使用交叉熵损失,我们希望生成的数据尽可能与真实数据相似,
D
(
G
(
z
)
)
≈
1
D( G(\mathbf z)) \approx 1
D(G(z))≈1,即在
y
=
0
y=0
y=0时最大化交叉熵损失
max
G
{
−
(
1
−
y
)
log
(
1
−
D
(
G
(
z
)
)
)
}
=
max
G
{
−
log
(
1
−
D
(
G
(
z
)
)
)
}
.
\max_G \{ - (1-y) \log(1-D(G(\mathbf z))) \} = \max_G \{ - \log(1-D(G(\mathbf z))) \}.
maxG{−(1−y)log(1−D(G(z)))}=maxG{−log(1−D(G(z)))}.
在实际应用时,如果判别器效果很好,则对于生成器的判断值接近于0,
D
(
G
(
z
)
)
≈
0
→
−
log
(
1
−
D
(
G
(
z
)
)
)
≈
−
log
1.
D( G(\mathbf z)) \approx 0 \to - \log(1-D(G(\mathbf z)))\approx - \log1.
D(G(z))≈0→−log(1−D(G(z)))≈−log1.此时梯度会非常小,不利有训练优化生成器。
所以我们将损失改为等价式
min
G
{
−
y
log
(
D
(
G
(
z
)
)
)
}
=
min
G
{
−
log
(
D
(
G
(
z
)
)
)
}
,
\min_G \{ - y \log(D(G(\mathbf z))) \} = \min_G \{ - \log(D(G(\mathbf z))) \},
minG{−ylog(D(G(z)))}=minG{−log(D(G(z)))},
能有效避免上述梯度消失。
DCGAN
任务
使用宝可梦图像数据集,生成相似的图片。
模型
使用深度卷积的生成对抗网络,和原始GANs使用相同方式,不过将多层感知机替换成卷积网络。
生成器模块架构:(卷积层+批量归一化+ReLU)*4+转置卷积层+Tanh
判别器模块架构:(卷积层+批量归一化+LeakyReLU)*4+卷积层+Sigmoid
损失函数同样使用交叉熵,与原始GANs相同
转置卷积层
又称反卷积,简单地说,相当于将卷积操作反过来,由小图转换为大图。但是经过卷积反卷积并不能得到与原来近似的矩阵
卷积
反卷积