Inception模型思想详解及核心代码实现
摘要Inception 网络是 CNN 分类器发展史上一个重要的里程碑。在 Inception 出现之前,大部分流行 CNN 仅仅是把卷积层堆叠得越来越多,使网络越来越深,以此希望能够得到更好的性能。但是越深的模型存在一些问题:1是在训练数据集有限的情况下,参数太多,容易过拟合。2是网络越大计算复杂度越大,难以应用。3是网络越深,梯度越往后穿越容易消失(梯度消失),难以优化模型。因此,Incept
摘要
Inception 网络是 CNN 分类器发展史上一个重要的里程碑。在 Inception 出现之前,大部分流行 CNN 仅仅是把卷积层堆叠得越来越多,使网络越来越深,以此希望能够得到更好的性能。但是越深的模型存在一些问题:1是在训练数据集有限的情况下,参数太多,容易过拟合。2是网络越大计算复杂度越大,难以应用。3是网络越深,梯度越往后穿越容易消失(梯度消失),难以优化模型。因此,Inception模型在这样的情况下应运而生。
Inception模型的实现思想
一句化:复用更多特征,而非目标于精准化特征提取。提高特征张量宽度,提高对特征的囊括性。
问题:
图像中突出部分的大小差别很大。例如,狗的图像可以是以下任意情况。每张图像中狗所占区域都是不同的。
由于信息位置的巨大差异,为卷积操作选择合适的卷积核大小就比较困难。信息分布更全局性的图像偏好较大的卷积核,信息分布比较局部的图像偏好较小的卷积核。非常深的网络更容易过拟合。将梯度更新传输到整个网络是很困难的。简单地堆叠较大的卷积层非常消耗计算资源。
解决方案:
为什么不在同一层级上运行具备多个尺寸的滤波器呢?网络本质上会变得稍微宽一些,而不是更深一些。作者因此设计了 Inception 模块。
下图是「原始」Inception 模块。它使用 3 个不同大小的滤波器(1x1、3x3、5x5)对输入执行卷积操作,此外它还会执行最大池化。所有子层的输出最后会被级联起来,并传送至下一个 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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)