(因为找不到Inception的合适翻译,就保留原文吧……)
文章目录
动机
Inception网络的原始动机可能是“我全都要”,因为在普通的CNN中每次我们要么用一堆同样大小的过滤器,或者加一个池化层,而Inception模块则是想要在一层的运算中集合这几种运算:
在上图中,分别使用
1
×
1
,
3
×
3
,
5
×
5
1\times 1,3\times 3,5\times 5
1×1,3×3,5×5的过滤器做等大卷积,之后用最大池化并填充,获得四个相同高和宽的矩阵,将它们的通道维度叠加在一起完成了运算。这就是最基本的Inception操作,它将多种过滤器以及池化合并在一起,输出一个信息更加多样的矩阵。其中运算的参数(包括过滤器的大小)都可以作为深度学习的内容。
优化计算
在一层中加入这么多操作,随之而来的就是计算量大大上升。对于32个
5
×
5
×
192
5\times 5\times 192
5×5×192的过滤器来说,输出矩阵中的每一个元素都要进行
5
×
5
×
192
5\times 5\times 192
5×5×192次乘法,而输出矩阵共有
28
×
28
×
32
28\times 28\times 32
28×28×32个元素,也就是说一共要进行
5
×
5
×
192
×
28
×
28
×
32
=
120
,
422
,
400
5\times 5\times 192\times 28\times 28\times 32=120,422,400
5×5×192×28×28×32=120,422,400即1.2亿次乘法,这还仅仅是一层运算中的一部分。所以为了减少计算量,我们在Inception模块中加入了“瓶颈层”来约束矩阵的大小。
瓶颈层事实上是一层
1
×
1
1\times 1
1×1的过滤器卷积,通过32个
1
×
1
×
192
1\times 1\times 192
1×1×192的过滤器将矩阵维度缩减到
28
×
28
×
32
28\times 28\times 32
28×28×32,这样再进行
5
×
5
5\times 5
5×5的过滤器卷积,就只消耗
28
×
28
×
16
×
192
+
28
×
28
×
32
×
5
×
5
×
16
=
12
,
443
,
648
28\times 28\times 16\times 192+28\times 28\times 32\times 5\times 5\times 16=12,443,648
28×28×16×192+28×28×32×5×5×16=12,443,648次运算,减少了约
90
%
90\%
90%的计算量。
只要合理地实现瓶颈层,就可以既缩小输入矩阵的大小,又不影响整体性能。
搭建Inception网络
有了上面的基本操作,我们就可以先搭建一个Inception模块:
对于
3
×
3
3\times 3
3×3和
5
×
5
5\times 5
5×5的过滤器,我们都先加一个瓶颈层来优化计算。同时,因为填充池化后,通道数跟输入矩阵是一样的,为了减少一些通道数目,在池化过后接一个
1
×
1
1\times 1
1×1过滤器减少通道数。最后,将四条路经的输出通过通道连接组件组合在一起,构成一个完整的Inception模块。
在下图中,就展示了一个完整的Inception网络:
网络中有大量重复的Inception模块,以及池化层调整激励的大小。
还有一点,除了最右侧的输出单元,还有两个输出单元,从网络的中段和后段引出。这两个输出用来保证即使是在稍浅的网络中,该模型的预测结果也不会太差,类似一种正则化,可以防止模型过拟合。
最后,还有当时论文中引用的梗,表达了当时研究人员提出Inception的初始动机😂:
图源:https://knowyourmeme.com/memes/we-need-to-go-deeper