CNN多标签分类实战

图像分类已经领域,深度学习方法已经超越了人类,其中google公开的Inception模型在图像分类大赛上取得了比人类识别还要低的错误率。研究已经成功的模型对我们学习也有很大的帮助,今天我们使用Inception模型作为预训练,我做我们的多便签图片分类任务。

Inception模型

获得高质量模型最保险的做法是增加模型深度或者是其宽度,但是会出现很多缺陷:参数过多,过拟合,计算复杂度高,梯度易消失,难以优化。Inception架构的主要思想是找出如何用密集成分来近似最优的局部稀疏连接 Inception 对图加以说明:

  • 采用不同大小的卷积核,意味着不同大小的感受野,最后意味着不同尺度特征的融合
  • 之所以卷积核大小采用11,33,5*5,主要是为了方便对齐,设定stride=1之后,只要分别设定padding=0、1、2,采用same卷积可以得到相同维度的特征,然后拼接在一起
  • 文章说pooling层很有效,所以Inception里面加了pooling
  • 网络越到后面越抽象,感受野也更大,所以33,55卷积的比例也要增加

Inception的作用:代替人工确定卷积层中过滤器类型或者确定是否需要创建卷积层和池化层,都由网络自行决定,自己学习参数。

Inception的缺陷:计算成本高,使用55的卷积核仍然会带来巨大的计算量,约需要1.2亿次的计算量 inception2 为了减少计算成本,采用11卷积核来进行降维,如图 inception3 在33和55的过滤器前面、max pooling后分别加上11的卷积核,最后将他们全部以通道/厚度 为轴拼接起来,最终输出大小是2828*256,卷积的参数比原来少了4倍,得到最终的Inception模块: inception4

GoogLeNet介绍

1.googLeNet----Inception V1结构

inception5 对图做如下说明:

  • 采用了9个Inception模块化结构,共计22层,方便增添修改
  • 网络层最后采用了average pooling来替代全连接层
  • 虽然移除了全连接层,但是网络中依然使用了dropout
  • 为了避免梯度消失,网络增加了2个辅助的softmax用于向前传导梯度,文章说这两个辅助的分类器loss应该加一个衰减系数,此外,实际测试的时候,这两个额外的softmax会被去掉

2.Inception V2结构

大尺寸的卷积核可以带来更大的感受野,也意味着更多的参数,比如5*5卷积核参数是3*3卷积核的25/9=2.78倍。为此,作者提出了2个连续的3*3卷积层(stride=1)组成的小网络来代替单个5*5卷积层,这就是Inception V2结构。保持感受野范围的同时又减少了参数量(25/18)。 inception6 其实V2结构主要是学习了VGG的结构,用两个3*3的卷积代替5*5的大卷积(降低参数并减轻过拟合),还提出了著名了Batch Normalization(BN)方法。使得Inception V2在训练达到Inception V1的准确率时快了14倍,并且模型在收敛时的准确率上限更高。

3.Inception V3结构

大卷积核完全可以由一系列的3*3卷积核来替代,那能不能分解的更小一点呢,V3考虑n*1卷积核,于是,任意n*n的卷积都可以通过1*n卷积后接n*1卷积来替代,实际上,作者发现在网络前期使用这种分解效果并不好,在有中度大小的feature map上使用效果才好,所以中度大小的feature map的大小最好在12-20之间。 inception7 Inception V3主要在两方面做了改进,一是引入了Factorization into small convolutions的思想,将一个较大的二维卷积拆成两个较小的一维卷积。令一方面,Inception V3 优化了 Inception Module 的结构,现在 Inception Module 有35*35、17*17和8*8三种不同结构。这些 Inception Module 只在网络的后部出现,前部还是普通的卷积层。并且 Inception V3 除了在 Inception Module 中使用分支,还在分支中使用了分支(8*8的结构中),可以说是Network In Network In Network。最终取得 top-5 错误率 3.5%。

4.Inception V4

Inception V4 相比 V3 主要是结合了微软的 ResNet,将错误率进一步减少到 3.08%。

深度残差网络。如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络。那当前要解决的就是学习恒等映射函数了。但是直接让一些层去拟合一个潜在的恒等映射函数 $ H(x) = x $,比较困难,这可能就是深层网络难以训练的原因,但是如果把网络设计为 $ H(x) = F(x) + x $。 resNet 如图,我们可以转换为学习一个残差函数 $ F(x) = H(x) - x $,只要 $ F(x) = 0 $,就构成一个恒等映射 $ H(x) = x $。而且你和残差肯定更容易。 inception_4

多标签分类

1.数据集

数据集采用南京大学开源的数据集(http://lamda.nju.edu.cn/files/miml-image-data.rar),数据集中包含2000张图像,5类,分别为desert、mountains, sea, sunset,trees,每张图片有一个或多个标签。

2.数据处理

  • 输入: image(299*299*3) - label (ont-hot [0,1,0,0,1])
  • 拆分为 train_data, test_data, train_label, test_label
  • batch生成器,一次获取一个batch的数据

3.网络结构

我们使用Inception V3已经训练好的参数来做迁移训练 迁移训练 所有图片经过Inception V3结构,得到中间结果的2048个特征值,然后接自己设计的网络结构做图像5分类任务。网络结构如下图: mu_label1

4.损失函数

不像单分类任务,使用softmax交叉熵,这里是多标签任务,我们需要使用sigmoid交叉熵作为loss函数。原因请参考这篇:机器学习之loss

5.结果

结果

6.tensorboad

loss graph

7.代码

代码已经上传到github。 源代码

参考资料