声明
Inception网络是卷积神经网络发展史上重要的里程碑,在Inception提出之前,卷积神经网络的发展仅仅是在不断的堆叠、加深。
另一方面,Inception网络比较复杂,复杂在网络结构和编程实现上。为了应用Inception,通常需要一些技巧(tricks)提升网络训练速度和网络学习效果。
Inception网络也是在不断发展,下面是最常见、最受欢迎的几个版本:
论文:Going deeper with convolutions
上面三个图像的类别都是狗,但是左一显著部分占据全图,左二显著部分稍小且位于中间,左三的显著部分最小且在中间靠上。
为了使网络既能学习全局性特征,又能学习局部性特征,做了如下改进:
为了减少参数数目,降低计算量,做了如下改进:
读者可能会问,为什么有时候 1 × 1 1\times1 1×1加在前、有时候在后?
这里论文没有给出说明,但我认为,从降低计算量的角度来看, 1 × 1 1\times1 1×1应该加在前面。但是由于 3 × 3 3\times3 3×3最大池化 是无参操作,而且所以 1 × 1 1\times1 1×1放在后面也不会增加计算量(然后maybe实验表明放在后面更好)。
关于 1 × 1 1\times1 1×1卷积的作用,论文在第4章讲到:
1x1 convolutions are used to compute reductions before the expensive 3x3 and 5x5 convolutions. Besides being used as reductions, they also include the use of rectified linear activation making them dual-purpose.
运用Inception单元构造成GoogLeNet(PS: 通常说Inception网络就是指GoogLeNet),如下图所示:
为什么多了两个分类器?影响美观( ̄へ ̄)
原因有二:一是网络太深了,误差反向传递的时候对网络前端影响有限,加入的两个分类器可以防止梯度消失。二是实验表明网络中间层特征已经足够用来进行分类了,即中间分类器的分类结果可信,中间损失对参数更新有一定的指导性。
网络前端部分不能替换成Inception吗?这样直接10个Inception,毕竟你前面一直说Inception大法好。
我也不清楚,可能是Inception的局限性?只隐约知道Inception单元不要在网络一开始就用。希望路过的朋友能在评论区留下您的见解~
论文:Rethinking the Inception Architecture for Computer Vision (PS: 这篇文章特别工程化,不值得细读)
论文在一开始给出设计网络的4个原则:
论文作者指出他们要在遵循以上4个原则的前提下,压缩网络的参数,以降低网络训练时的计算量。
Inception v2提出了3中对卷积核进行因子分解(Factorization)的方法,用来减少卷积层的参数。
1. 用两个 3 × 3 3\times 3 3×3卷积替代 5 × 5 5\times 5 5×5
2. 用 n × 1 n\times 1 n×1和 1 × n 1\times n 1×n堆叠替代 n × n n\times n n×n
3. 用 n × 1 n\times 1 n×1和 1 × n 1\times n 1×n并联替代 n × n n\times n n×n
卷积核因子分解有效吗?
虽然论文中没有给出理论证明,但是从实验结果来看是有效的。
为什么用了3种Inception的结构?在其他的数据场景中,我们应该怎么用Inception v2呢?
只能说,论文就说是这样结果好,所以如果我们想在自己的场景中使用Inception,也免不了尝试不同的结构。
论文:Inception v2和v3是在同一篇论文中提出的
深度学习中,卷积通常与池化堆叠(串联),池化操作通常都会造成特征维度的骤降,违反了“避免过度降维(会导致representational bottlenecks)”原则。
在Inception v2的结构表中,有input size从 35 × 35 × 288 35\times 35 \times 288 35×35×288到 17 × 17 × 768 17\times 17 \times 768 17×17×768的变化,论文中说他们是这样做的(PS: 具体怎么个结构,论文这里说的不清不楚):
在多分类中使用的损失函数是多分类交叉熵,其中 p ( k ∣ x ) = e x p ( z k ) ∑ i = 1 K e x p ( z i ) p(k|x)=\frac {exp(z_k)}{\sum_{i=1}^K exp(z_i)} p(k∣x)=∑i=1Kexp(zi)exp(zk)。由于指数计算的存在,使这种方式下损失函数过于尖锐,可以做一下平滑。平滑的方式举个例子如下:
系统了解标签平滑正则化可以参考论文:Regularizing Neural Networks by penalizing Confident Output Distributions
论文:Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning
该文作者也意识到Inception v3结构中Inception模块过于多样,不利于迁移到其他问题上。因此,需要建立一个更具有一致性的Inception版本,同时增加更多的Inception模块构建更深的网络,进而获得更好的性能。
Inception v4并不重要,该论文的关键在于下一章介绍的Inception-ResNet。
论文:Inception v4和Inception-ResNet是提出于同一篇论文
借助ResNet实现更多的Inception堆叠,构建更深的网络
对不同的Inception单元的形成残差结构的方式是一样的,如下:
其他还有一些细节方面的改变,没有什么技术性的创新或者经验指导,就不再详述。
谷歌关于Inception的3篇论文,有意义的是提出Inception结构的第一篇,后面两篇都是建立大量实验试错下的修改。