Inception v2讲解
Inception v3~v4讲解
论文地址:Going deeper with convolutions
灵感来源
- "Network in network"这篇文章说,网络中嵌套网络可以增强网络的表达能力(所以Inception v1就是一个网络中的网络)
- 使得网络性能增强的一个直观想法就是让它变宽变深,但是复杂的网络在小数据集上是非常容易过拟合的,而像ImageNet这样的大型数据集又是非常稀缺的,想要训练一个非常复杂的网络的条件并不好准备,再加上计算资源的昂贵性,这条路并不完全走得通。走得通的路就是在变宽变深的同时,保持网络结构上稀疏性,稀疏性除了仿生原理外,Provable Bounds for Learning Some Deep Representations文中也说了,稀疏性是个好同志。理论上,稀疏的数据结构所需要的计算量肯定要小,但是限于当前硬件的限制(lookup和cache miss消耗的时间太长,文末有解释),稀疏性的数据结构并没有能够使计算变的有多快(虽然理论上计算量已经降低了),所以作者提出,我们要是能用几个小的dense的数据结构来模仿稀疏性就好了。
于是乎。。。
Inception v1网络结构
文中提出了一种叫inception v1的结构,就是上面提到的Network(inception) in network(GoogLeNet),inception的结构如下
其中,(a)是原版,(b)是改良版。原版的想法很直接的,就是用多种不同大小的卷积,卷积出来的所有的feature map的大小都是一样的(当然卷积时给的padding不一样),直接拼起来,就相当于channel增多了。而改良版的好处是:
- 假设previous layer的channel数是N,1*1卷积输出的channel数是比N小的,要知道3*3,5*5卷积的开销是很大的,减少channel数目可以减小计算量,并且实践证明这样做并没有使网络性能降低(这个是主要原因)
- 还是上文提到的说稀疏性是个好同志的那篇文章说了,如果网络是稀疏的,那么这个稀疏网络的构建和训练是有技巧可循的。。。这个技巧GoogLeNet里也描述了,不过。。。我没看懂(总之改良版好就是了)
- 计算量变小之后,多堆叠几层就不会使计算量变的太大,所以比较好拓展
GoogLeNet v1结构
有了子网络的结构,总网络的结构就来了:
输入在最左边,最开始首先是普通的卷积来两个(这个文中也说了,实验发现最开始还是有两个普通卷积比较好,比直接用inception结构好,作者承认这也许说明了inception设计还不够完善),红圈部分都是inception,一共9个,绿框都是正则化和concat,上面也说过了。最后是dropout层,全连接和softmax。具体看下面的表格:
额外的设计
辅助分类器,就是说inception(4b)和inception(4e)作为中间层,把他们的输出做一个卷积和两次全连接以及softmax后,也作为网络的输出,比如进行分类任务,训练时,这里的输出也是计算loss的,不过权重只有0.3,做inference时,这里的输出是不care的,也就是说他们只在训练时用到。这个设计主要是考虑到,太深的网络反向传播的效果可能不是特别好,所以把中间结果也搞一搞计算loss帮助训练。
其它
- 按照文中说法,几块高端GPU训练这个网络应该可以在一周内训好
- GoogLeNet在分类和检测任务上都做了测试,ImageNet分类的test error是6.67%。在ILSVRC 2014检测任务的mAP是43.9%。
- 上文提到的lookup就是指查询,即从内存或者磁盘中找到并读出数据。磁盘和内存为了加速访问都是有cache(缓存区)的,cache中寸土寸金,但是读取速度确实非常快,常用的数据会被放在cache中加速读取速度。cache miss指的是在缓存中没有找到想要的数据,这也就意味着需要从整个内存中去找,cache miss也就意味着读取数据需要更长的时间