第二篇博客,讲讲图像识别中的多列深度神经网络(MCDNN)

写博客有一点好,可以自己把脑子里的思路捋捋清,当初看过一篇将可视化神经网络的, 看了个半吊子,就给别人讲,结果大半都是忽悠过去,后面再研究研究,发现跟别人讲的很多都是错的,误导了吃瓜群众,这个心里是非常的过意不去了。这次写个博客,把思路先在脑子里捋一捋,再写出来,可以加深对论文的理解。

这里我非常粗浅的看了一下论文,就来写博客,肯定有些不对的地方,我自己做个笔记,如果有错误,希望大家不吝指出,我会及时做出修改,希望不要误导别的同学学习,十分感谢。

上篇文章立了个flag,说自己要讲讲这篇Multi-column Deep Neural Networks for Image Classification

我这边参考了:https://blog.****.net/u010529217/article/details/38701703

摘要

文章是2012年CVPR上的文章,现在有1772的引用,算是牛逼闪闪的论文了。

论文提出的深度神经网络在手写体识别和交通标志识别上达到了人类识别的水准。文章采用了winner-take-all neurons这么一个策略,只有获胜的神经元才能被训练(这玩意原文中说的贼玄乎,但是我觉得好像就是max pooling)。针对同一批输入进行不同的预处理工作,用多个DNN分别进行训练。其中每一个DNN被称为一个column,这就是文章中多列的意思,其实是指多个DNN,针对多个预测结果采用average的方法,获得最后的输出,因为利用了GPU,所以训练速度加快了很多(当年GPU训练还提出没多久)。

结构

(1)作者吹了一波相比别的小型的神经网络结构,这边采用的神经元比较多(和猴子一样多)。PS:不知道五六年前号称复杂的神经网络要是看到今天动不动就成百上千层的CNN会是什么感想。

(2)有了GPU,训练速度大大加快,尽管塞数据,不需要额外的无监督预训练了。

(3)这篇文章的DNN拥有一些由赢者通吃神经元组成的的二维层,这些二维层包涵一些重叠的感受野,这些感受野对应的权重是共享的。给定输入图案,我们利用最大池化,获得最活跃的神经元,一个层的获胜者代表了一个低分辨率区域,为下一层提供输入。这个方法是从神经科学那边学来的。(文章中很多这种说明,某些采用的结构是基于生物大脑皮层的一些结构来设置的,原来深度学习是一种仿生学,以后突破估计还得指望生物学那边的突破了。)

刚刚保存的稿子不见了。得从这重新写博客,心痛。

(4)文章中的网络结构采用了2*2和3*3的最大池化,池化所采用的核的大小决定了网络的深度。

(5)只有获胜神经元才能被训练,其余神经元没办法忘记学到的东西,在每个梯度步骤之后网络的权重会被更新。

(6)接下来介绍文章主要贡献,文章训练的主要步骤如下:首先我们拥有一批训练集,我们采用设定好的预处理方法,例如本文中对mnist数据集采用了6种预处理方法,这样包括原版数据集我们获得了7个训练集,对每个训练集,采用5个DNN进行训练,在每一批样本进入DNN之前会对其进行随机的样本变换,这些变换包括旋转平移和压缩等等,因此我们利用同一批样本,能够获得不一样的DNN模型,最终我们会获取35个模型,具体的结构可以见下图:

第二篇博客,讲讲图像识别中的多列深度神经网络(MCDNN)

上图便是该模型的结构,P0-Pn-1是相同的预处理,训练时的随机变换在此图中没有显示出来

第二篇博客,讲讲图像识别中的多列深度神经网络(MCDNN)

这里的D就是随机变化,可以发现作者着重标出来这一步是属于训练过程的。

接下来的问题在于我们如何对得到的35个DNN进行组合,我脑子里第一个跳出来的思路是进行投票,事实上我手上的问题就采用了投票的方式来获取最后的分类结果,然而结果并不好看,文中提到的思路开拓了我的想法,文中将最后每一个DNN最后一层的输出进行算术平均,最后输出置信度最高的一类,我们都知道网络的最后一层输出的神经元个数等于总共的类别数,而神经元输出的值是每一类的概率,因此,我们将相同类的概率相加再做平均(其实我感觉做平均这一部可以省略),最后在得到概率值最高的那一类,确定为最终的输出类别,详细的公式如下:

第二篇博客,讲讲图像识别中的多列深度神经网络(MCDNN)

这里不再对公式做详细的解释,感兴趣的同学可以阅读原文。

这边我产生一个问题,就是文中采用算数平均,而不采用加权平均,是否是因为没有办法确定各个模型的权重,才使用更加简单的算数平均的,照理来说,加权平均比算术平均的效果应该更好一点,作者在2011年发过另一篇文章中似乎提到过这个问题,下一篇博客可以给大家分享一下。

实验

这边只介绍文章中对Mnist数据集做的实验,首先我们看一下数据集的结构:1x29x29-20C4-MP2-40C5-MP3-150N-10N,我是第一次见过这种网络结构的描述,看起来复杂,其实一眼就能看懂,输入29*29的图片,第一个卷积层采用了20个4*4的卷积核,接着是2*2的最大池化,紧接着是40个5*5的卷积核,然后是3*3的最大池化,然后是150个全连接层神经元,最后的输出是10个分类的神经元,网络结构如下:

第二篇博客,讲讲图像识别中的多列深度神经网络(MCDNN)

上古的网络结构图,不如现在的好看和直观。

总共训练这玩意花了14个小时,500个批次(每个批次800张)之后才能够看出点提升,35个DNN对于当时来说,就算有上古的GTX 5X0加速,也需要很长时间,论文中作者说如果不用GPU,训练时间可能是以年计算的,害怕.jpg。我们看一下最终测试集上的结果:

第二篇博客,讲讲图像识别中的多列深度神经网络(MCDNN)

最后一行是MCDNN的错误率,可以说是非常低了,这里我们注意一下上面的那个结果,是作者在2011年发的文章中的结果。

接下来作者讨论了一下预处理的数量对于模型的影响,我们之前说过文中采用了7种预处理(包括原版训练数据集),接下来作者尝试采用少一些的预处理方式,例如1种,2种....6种,我们看一下结果:

第二篇博客,讲讲图像识别中的多列深度神经网络(MCDNN)

最终选择的是最后一行,我们共有7种预处理的方式,如果只采用其中的1种,那我们有7种不同的MCDNN,选其中的两种组合,我们有21种(排列组合,7选2)MCDNN,以此类推,可以看出最终我们采用7种预处理组合成一个MCDNN的效果最好

那我们再增加每一个数据集得到的DNN的数量,作者将原先的7*5=35个DNN的结构扩充到了60个DNN,最后取得了0.24%错误率的结果,发现并没有提升,因此得到结论是当前的35-net比较符合要求。

我们看一下结果:

第二篇博客,讲讲图像识别中的多列深度神经网络(MCDNN)

35NN的MCDNN,很好很强大。

第二篇博客,讲讲图像识别中的多列深度神经网络(MCDNN)

上文中的训练步骤中的随机变换,即D变换。

结论

文章在多个数据集上取得了巨大的突破,至少减少了30%的错误率,可以说是相当强大的网络了,个人感觉里面包括了数据增强,模型增强(自发明词),这种思路非常常见,但是作者用的很好,论文的工作量可以看出来非常大(实验部分非常多),里面有好多可以借鉴的地方,是一篇非常优秀的文章。