您的位置:首页 > 编程语言 > Go语言

googLeNet--Inception四部曲一Going deeper with convolutions

2017-01-04 20:55 483 查看
原论文:Going deeper with convolutions

作者:Christian Szegedy,Wei Liu,Yangqing Jia,Pierre Sermanet,Scott Reed,Dragomir Anguelov,Dumitru Erhan,Vincent Vanhoucke,Andrew Rabinovich

时间:February 2012

本文的大部分观点来自于这篇论文,并且加入了一些自己的理解。该博客纯属读书笔记。

卷积神经网络

        在进入论文之前,我想先解释一下卷积神经网络的原理,这样有助于我们更深入的理解这篇论文。
        既然叫卷积神经网络,那么它的最大卖点肯定是卷积啦。网上很多介绍卷积神经网络的文章都侧重于卷积神经网络的结构,而很多的细节都没有讲到位。所以这里我再一次根据自己的理解,希望把卷积神经网络的核心思想将到位。
        首先,我先来讲讲神经网络中的卷积操作到底是什么?我认为它在这里所代表的含义可以用简单的4个字概括——滑动求和。假设我有一个3*3大小的卷积核[101;010;101],我用它对5*5的矩阵进行卷积操作,那么这个过程如图所示(图片来源于http://blog.csdn.NET/stdcoutzyx/article/details/41596663)



        整个流程就是用卷积核在矩阵中移动,每次可以移动1步,2步,也可以滑动3步(这样可以使计算的区域不重叠),每次移动完成后,将卷积核与矩阵中对应的元素相乘然后求和,例如图中第一步,卷积核与矩阵中的[111;011;001]重叠,得到4。最后经过完整的卷积操作,我们就可以得到一个新的矩阵。至于这个新的矩阵在神经网络中到底有什么用之后我再解释。所以神经网络中的卷积很简单嘛,哪有什么反转/反褶/对称?哪里用摆什么公式嘛。


     我们知道,最早的神经网络,层与层之间采用全连接的方式,假设第一层与第二层的神经元分别为n,m,那么我们需要训练的参数就有n*m个,在一些简单的分类任务中,这是可以接受的,但是如果我们要处理的是图像,那么问题就来了,假设我们要处理一张100*100的图像,那么输入神经元就是10000个,如果下一层神经元个数与输入层一样,也是10000个,那么这两层之间需要训练的参数就多达10000*10000个啦!这完全不能接受啊!所以当前的首要任务就是减少参数。
        卷积神经网络有两个特点:局部感知和参数共享。
        打个比方,我们看书不是一页一页看的,而是一个单词一个单词的看,最后再在脑子里把所有看到单词连起来并整理成更抽象的东西,看图也是一样。卷积神经网络的卷积过程也是模拟了人类的这种视图方式,用卷积核遍历整张图片,然后生成一张新的图片,这就是局部感知。而在遍历的过程中,卷积核中参数是不变的,也就是说同一个卷积核可以用在整张图片上,这就是所谓的参数共享。最后我们来看看使用卷积神经网络需要训练的参数有多少。假设我们的卷积核大小为10*10(实际应用中一般都比这个要小),那么一个卷积核就有100个参数,假设我们的图片是三通道RBG图片,那么一种卷积核需要对应同一张图片的3个通道,也就是3*100个参数,这个时候我们已经可以实现上面所说的10000*10000个参数的神经网络的功能了!参数减少了几乎10的6次方倍!如果我们想要更多的卷积核(提取更多的特征),假设我们需要100种卷积核,那么参数也仅仅是3*100*100个。
       简单的介绍了一遍卷积神经网络(只是简单说了一下参数减少的原因,并没有说它的好处),下面开始进入正题Going deeper with convolutions

Inception

没错!它的名字就叫Inception,盗梦空间的英文名,derives its name from the Network in network。

Inception有一个重大创新点就是通过几个稠密的网络结构去近似地模拟DNN最优的局部稀疏结构,简单来说就是找到一种能够更好地模拟大脑神经网络结构的方法。The main idea of the Inception architecture is based on finding out how an optimal local sparse structure in a convolutional vision
network can be approximated and covered by readily available dense components.
我们知道大脑神经网络神经元之间的连接是稀疏分布的,但是如果我们想让计算机去模拟这种稀疏分布所需要的开销是很大的,因为计算机并不擅长对稀疏矩阵的运算。所以我们需要想办法用多个比较小的稠密的矩阵去近似地模拟比较大的稀疏矩阵。因此作者提出可以用多个不同大小的卷积核去卷积图像,这样不仅能够提取到更多不同的特征,而且这种结构更符合大脑神经网络的结构。此外,考虑到池化操作也是卷积神经网络取得成功的关键,所以作者把它也一起放进来了。所以最后的结构如图1所示。


图1

选的是1*1,3*3,5*5的卷积核,这只是为了操作方便。
但是我们发现这样做有一个问题,就是参数大大增加了。根据我们之前说的卷积神经网络计算参数的方法,假设Previous layer一共有100张图片,有100种卷积核,(maxpooling参数太少不考虑),那么总的参数就是:
100*(1*1*100+3*3*100+5*5*100)=350000个,太多了。所以作者提出了一种新的方法。

前面提到卷积神经网络的参数相比于之前的神经网络,参数已经减少了很多了,但是作者仍然不满足,还有提升的空间。
作者想到的方法是使用一个 1*1convolutional layers去减少参数。不知道大家有没有注意前面说卷积神经网络的时候,提到一种卷积核对应不同的通道居然要使用不同的参数,而卷积完成后得到的这些图片还要经过线性变换合成一张图片。。。这其实很多余,因为对于同一张图片,三个通道上的像素值其实是有关联的,这句话同样适用于不同卷积核对同一张图片卷积得到的多张图片,所以作者将这个线性变换的过程提前了,先使用只有一个参数的1*1卷积核去卷积图片,然后在后边接一个 rectified
linear activation,将不同通道的图片合成一张,然后再用参数多的卷积核去进行卷积。再来看前面那个问题,现在参数变成了:
1*1*100+3*3*100+5*5*100=350个
当然,你可以用不同的1*1卷积核去卷积图片,得到多张图片,减少因为降维带来的信息损失。
模型如图2所示。


图2
文章提到,Inception只是在高层使用了这种方法,因为层数越高,通道数越多,使用这种方法效率更高;而在底层没有采用这种方法我想第一是因为通道数不多,提
9e01
升效率不高,还有就是因为使用1*1convolutional layers降维来压缩信息然后再聚合成一个整体,这或多或少会带来一些信息的损失,特别是在底层,我们提取的还是细节特征,细微的信息损失可能也会带来很大的影响。
图3是GoogLeNet的结构图。


图3

特点就是浅层还是使用传统的卷积网络,到了深层就开始使用前面说的方法。因为在训练时,神经网络太深,这样导致了梯度传递到底层是已经很小了,所以作者在中间层添加了几个额外的分类器。作者发现,在神经网络的浅层提取出来的特征已经very discriminative,所以在这些地方添加额外的分类器,可以起到增加梯度信号的作用。在训练时,可以根据分类器所在的层数,将它们的损失函数额外加上一个权值,然后合到总的损失函数上去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息