Deep Learning Note: 4-5 卷积神经网络案例分析(3)
Contents [show]
3. 1 乘 1 卷积
在进行卷积时,对于只有 1 个通道的输入,如果参与卷积的过滤器的尺寸为 1×1,则只相当于将输入乘以一个固定的系数,如图 1 所示。
而对于有 n 个通道的输入,如果参与卷积的过滤器尺寸为 1×1×n,则相当于将输入中每个位置上的 n 个值与过滤器中的 n 个值依次相乘再求和,如图 2 所示。
此时这个 1×1×n 卷积层就相当于一个神经元,它以输入数据中同一位置上各通道的 n 个值作为输入,输出一个激活值。如果有多个过滤器,则相当于有多个神经元。
像上面这样的 1×1×n 卷积有时也称为网络中的网络(Network in Network)。1×1×n 卷积可以为网络加入非线性,并且能够调整数据的通道数。
1×1×n 卷积可以缩小数据的通道数。如对于图 3 所示的 28×28×192 的数据,通过 32 个 1×1×192 的过滤器卷积,结果的大小为 28×28×32,数据的通道数从 192 缩小到 32,高度和宽度保持不变(相比之下,池化层保持通道数,缩小高度和宽度)。
如果想保留通道数,则可以使用 192 个 1×1×192 的过滤器,结果的大小与输入相同,都是 28×28×192,此时这个 1×1×n 卷积的作用是引入一些非线性,使得网络能够学习更复杂的函数。另外,使用更多的过滤器,还可以增加数据的通道数。
4. Inception 层
在设计卷积神经网络中的各层时,我们面临很多选择,例如使用什么尺寸的过滤器,使用卷积层还是池化层等等。Inception 网络通过在一层中同时使用多种结构,获得更好的性能。
图 4 展示了一个 Inception 层的结构:
在这一个 Inception 层中,输入数据的大小为 28×28×192,其中使用了:
- 64 个 1×1 过滤器,卷积结果的大小为 28×28×64,如图中绿色方块;
- 128 个 3×3 过滤器,Same Padding,卷积结果的大小为 28×28×238,如图中蓝色方块;
- 32 个 5×5 过滤器,Same Padding,卷积结果的大小为 28×28×32,如图中紫色方块;
- 一个最大池化层,Same Padding,Stride = 1,池化结果再通过一层 1×1 卷积缩小通道数,最终结果的大小为 28×28×32,如图中黄色方块。
最后将上面四层的结果拼接起来,得到该 Inception 层的输出,其大小为 28×28×256。由于这里要进行拼接操作,所以要求其中各层输出的高度和宽度要一致,如上面第 2 和 第 3 各卷积层使用了 Same Padding 保证输入和输出具有相同的高度和宽度;虽然池化层通常不使用 Padding,但这里为了保证池化层的输入和输出也具有相同的高度和宽度,对池化层也使用了 Same Padding,且 Stride 为 1。
Inception 层中使用了各种各样的层,并将所有结果拼接在一起,由网络通过学习自主选择要使用什么样的层及其组合,不再需要人工进行选择。但这也带来一个问题:Inception 层的计算量非常大。
以图 4 中 5×5 的卷积层为例,如图 5 所示:
图 5 中卷积层的输入大小为 28×28×192,使用 32 个 5×5×192 的过滤器进行卷积,输出大小为 28×28×32。对每个输出,要计算 5×5×192 次乘法,则总共要计算的乘法次数为(加法次数相比乘法次数非常少,这里只统计乘法次数):
28×28×32×5×5×192=120422400≈1.2亿
虽然从现代的计算能力来看,1.2 亿次计算并不是无法接受,但这还只是图 4 所示的 Inception 层中的一小部分。通过使用 1×1 卷积降低通道数,可以显著降低运算量。
还以图 5 所示的卷积层为例,现在在输入数据后增加一层 1×1 卷积,如图 6 所示:
此时 28×28×192 的输入数据通过与 16 个 1×1×192 的过滤器卷积,结果大小为 28×28×16,然后再与 32 个 5×5×16 的过滤器卷积,得到 28×28×32 的输出。现在的计算所需的乘法次数为:
28×28×16×1×1×192+28×28×32×5×5×16=2408448+10035200=12443648≈0.12亿
可见,图 6 和 图 5 中网络输出数据的大小都是 28×28×32,而图 6 中网络的计算量只有图 5 的十分之一。
另外可以注意到,在图 6 所示的网络中,中间 1×1 卷积层输出的通道数最少,因此它有时也被称为 Bottleneck 层,即先将输入数据缩小,然后再放大。虽然 Bottleneck 层大幅减少了通道数,但只要设计合理,就不对性能产生明显影响。
综上所述,Inception 层同时了使用多种层结构,不在需要人工选择,但由此也带来了巨大的计算量。通过 1×1 卷积创建一个 Bottleneck 层,可以大幅降低计算量。
5. Inception Network
Inception Network 由多个 Inception Module 组成,对于如图 4 所示的 Inception 层,其对应的 Inception Module 结构如图 7 所示。
可以看到,中间的两个卷积层都先通过 1×1 卷积降低通道数,由此降低计算量。最上面的卷积层使用 1×1 的过滤器,没有必要再在前面添加 1×1 卷积。最下面的池化层使用 Same Padding,Stride = 1,保证输出数据的高度和宽度与输入相同,然后再通过一个1×1 卷积降低通道数。最后,所有结果都拼接在一起,作为这个 Inception Module 的输出。
将多个 Inception Module 组合起来,就构成了一个 Inception Network,图 8 为原论文中给出的一种结构。
图 8 中,蓝色方块为卷积层,红色方块为池化层。网络中使用了很多相同的 Inception Module,各个 Module 之或者间直接连接,或者通过一个池化层来调整数据尺寸。
另外,可以注意到图 8 中的网络中有两个分支,如图 9 中红框所示。这些分支获取了网络中隐藏层的输出,并以此进行预测。这样做是为了确保网络中间的一些特征也足以进行一定程度的预测,可以起到正则化的效果。
自提出以来,Inception Network 出现了很多变种,比如 Inception V2、Inception V3、Inception V4 等等;还有的网络结合了 ResNet,在 Inception Network 使用 Skip Connection。
值得一提的是,Inception Network 的原论文中引用了 “We Need to Go Deeper” 的梗(图 9),表示要建造更深层网络,还在参考文献中给出了引用链接,Inception 的名字就由此而来。