摘要

Inception 网络是 CNN 分类器发展史上一个重要的里程碑。在 Inception 出现之前,大部分流行 CNN 仅仅是把卷积层堆叠得越来越多,使网络越来越深,以此希望能够得到更好的性能。但是越深的模型存在一些问题:1是在训练数据集有限的情况下,参数太多,容易过拟合。2是网络越大计算复杂度越大,难以应用。3是网络越深,梯度越往后穿越容易消失(梯度消失),难以优化模型。因此,Inception模型在这样的情况下应运而生。

Inception模型的实现思想

一句化:复用更多特征,而非目标于精准化特征提取。提高特征张量宽度,提高对特征的囊括性。

问题:

图像中突出部分的大小差别很大。例如,狗的图像可以是以下任意情况。每张图像中狗所占区域都是不同的。

从左到右:狗占据图像的区域依次减小

由于信息位置的巨大差异,为卷积操作选择合适的卷积核大小就比较困难。信息分布更全局性的图像偏好较大的卷积核,信息分布比较局部的图像偏好较小的卷积核。非常深的网络更容易过拟合。将梯度更新传输到整个网络是很困难的。简单地堆叠较大的卷积层非常消耗计算资源。

解决方案:

为什么不在同一层级上运行具备多个尺寸的滤波器呢?网络本质上会变得稍微宽一些,而不是更深一些。作者因此设计了 Inception 模块。

下图是「原始」Inception 模块。它使用 3 个不同大小的滤波器(1x1、3x3、5x5)对输入执行卷积操作,此外它还会执行最大池化。所有子层的输出最后会被级联起来,并传送至下一个 Inception 模块

Inception模块的初始想法

 

如前所述,深度神经网络需要耗费大量计算资源。为了降低算力成本,作者在 3x3 和 5x5 卷积层之前添加额外的 1x1 卷积层,来限制输入信道的数量。尽管添加额外的卷积操作似乎是反直觉的,但是 1x1 卷积比 5x5 卷积要廉价很多,而且输入信道数量减少也有利于降低算力成本。不过一定要注意,1x1 卷积是在最大池化层之后,而不是之前。

因此,Inception模块原始初始层还包含两个主要附加组件:

  • 在之前添加1×1的卷积层,主要用于降维。
  • 并行的最大池化层,为初始层提供了另一个选项。

在深度学习领域,有很多小的操作方法可以提高增高模型的准确率及泛化性能,例如:分解卷积及正则化;RMSProp 优化器;Dropout;辅助分类器使用了 BatchNorm;标签平滑(添加到损失公式的一种正则化项,旨在阻止网络对某一类别过分自信,即阻止过拟合);引入残差连接;GPU并行运行等相关小的优化思想。

基于以上思考,Inception模型之后又衍生出了很多版本,例如InceptionV1、InceptionV2、InceptionV3、InceptionV4;

Inception模型的代码实现

实现环境:

python3.6.5、tensorflow 1.1.8、keras 2.2.0等。

核心代码

本文将给出keras神经网络编程框架实现的一个简单Inception模型。

def inception_module(layer_in, f1, f2_in, f2_out, f3_in, f3_out, f4_out):
    conv1 = Conv2D(f1, (1,1), padding='same', activation='relu')(layer_in)
    conv3 = Conv2D(f2_in, (1,1), padding='same', activation='relu')(layer_in)
    conv3 = Conv2D(f2_out, (3,3), padding='same', activation='relu')(conv3)
    conv5 = Conv2D(f3_in, (1,1), padding='same', activation='relu')(layer_in)
    conv5 = Conv2D(f3_out, (5,5), padding='same', activation='relu')(conv5)
    pool = MaxPooling2D((3,3), strides=(1,1), padding='same')(layer_in)
    pool = Conv2D(f4_out, (1,1), padding='same', activation='relu')(pool)
    # concatenate filters, assumes filters/channels last
    layer_out = concatenate([conv1, conv3, conv5, pool], axis=-1)
    return layer_out

模型参数:

_____________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            [(None, 256, 256, 3) 0                                            
__________________________________________________________________________________________________
conv2d_1 (Conv2D)               (None, 256, 256, 96) 384         input_1[0][0]                    
__________________________________________________________________________________________________
conv2d_3 (Conv2D)               (None, 256, 256, 16) 64          input_1[0][0]                    
__________________________________________________________________________________________________
max_pooling2d (MaxPooling2D)    (None, 256, 256, 3)  0           input_1[0][0]                    
__________________________________________________________________________________________________
conv2d (Conv2D)                 (None, 256, 256, 64) 256         input_1[0][0]                    
__________________________________________________________________________________________________
conv2d_2 (Conv2D)               (None, 256, 256, 128 110720      conv2d_1[0][0]                   
__________________________________________________________________________________________________
conv2d_4 (Conv2D)               (None, 256, 256, 32) 12832       conv2d_3[0][0]                   
__________________________________________________________________________________________________
conv2d_5 (Conv2D)               (None, 256, 256, 32) 128         max_pooling2d[0][0]              
__________________________________________________________________________________________________
concatenate (Concatenate)       (None, 256, 256, 256 0           conv2d[0][0]                     
                                                                 conv2d_2[0][0]                   
                                                                 conv2d_4[0][0]                   
                                                                 conv2d_5[0][0]                   
==================================================================================================
Total params: 124,384
Trainable params: 124,384
Non-trainable params: 0
__________________________________________________________________________________________________

模型网络结构:

总结

平衡网络的宽度和深度。网络的优化表现可以通过平衡每阶段的过滤器数量和网络深度实现。同时提高宽度和深度可以提高网络质量,但是只有并行提高时才能对计算常量优化提升。从以上对Inception模型的思想来源的总结,我们不难发现一些优化深度神经网络模型的小技巧应用到Inception模型中,确实可以起到优化模型的作用。在这里大家可以试下动态池化方法替换最大池对Inception模型结构会不会有提升?

参考文献

1. Going Deeper with Convolutions

2. Rethinking the Inception Architecture for Computer Vision

3. Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning

4. Tm P , Pranathi A , Saiashritha K , et al. Tomato Leaf Disease Detection Using Convolutional Neural Networks[C]// 2018 Eleventh International Conference on Contemporary Computing (IC3). IEEE Computer Society, 2018

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐