深度学习入门 | 第六章:经典卷积神经网络:Inception

Posted 狗熊会

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习入门 | 第六章:经典卷积神经网络:Inception相关的知识,希望对你有一定的参考价值。

点击上方蓝
给个关注吧


6.1
Inception

Inception网络结构由Google团队提出,因此也被称为GoogleNet。该模型一共有4个版本,从V1到V4。其中Inception V1是2014年由克里斯汀·塞格德(Christian Szegedy)提出并获得了当年ImageNet的冠军


6.1.1
Inception网络结构

第5章介绍的AlexNet、VGG等网络结构都是通过增加网络的深度(层数)来获得更好的训练效果,Inception V1则通过增加网络的宽度(通道数)来提升训练效果。在Inception V1的基础上,Google团队又从神经网络训练性能的角度出发,不断改善网络结构,陆续提出Inception V2、Inception V3和Inception V4。下面重点介绍Inception V1的结构。Inception V1也叫GoogLeNet,曾在2014年ImageNet大赛上力压VGG夺冠。

1.Inception模块

Inception V1就是由多个如图6.1所示的Inception基础模块串联起来的。Inception V1的贡献主要有两个。

(1)在多个不同尺寸的卷积核上同时进行卷积再聚合,图6.1中的(a)、(b)、(c)模块就是在同一层上分别使用了深度学习入门 | 第六章:经典卷积神经网络:Inception深度学习入门 | 第六章:经典卷积神经网络:Inception深度学习入门 | 第六章:经典卷积神经网络:Inception三个不同的卷积。

(2)使用深度学习入门 | 第六章:经典卷积神经网络:Inception的卷积来降维,图6.1中的(1)、(2)、(3)模块都是在深度学习入门 | 第六章:经典卷积神经网络:Inception深度学习入门 | 第六章:经典卷积神经网络:Inception卷积之前先使用深度学习入门 | 第六章:经典卷积神经网络:Inception卷积,在深度学习入门 | 第六章:经典卷积神经网络:Inception的最大值池化之后也使用了深度学习入门 | 第六章:经典卷积神经网络:Inception卷积。

深度学习入门 | 第六章:经典卷积神经网络:Inception

图6.1  Inception V1基础模块

2.Inception的两个创新点

Inception相较于之前的卷积方式有以下两个创新点。

(1)Inception V1使用多个不同尺寸的卷积核。通过图6.2中新旧方法的对比,可以清晰地看到,在之前的神经网络训练中,对上一层的输入通常使用多个相同尺寸的卷积核进行操作,而在Inception V1中,对上一层的输入使用多个不同尺寸的卷积核进行操作。学者们对这种操作的优点给出了多种解释,其中比较直观通俗的一种解释是,叠加不同尺寸的卷积核,可以从细节上提取更丰富的特征。

深度学习入门 | 第六章:经典卷积神经网络:Inception

图6.2  Inception V1和之前卷积方式的区别

(2)使用大量深度学习入门 | 第六章:经典卷积神经网络:Inception的卷积核,通过图6.3中新旧方法的对比可以看到,在深度学习入门 | 第六章:经典卷积神经网络:Inception深度学习入门 | 第六章:经典卷积神经网络:Inception卷积核之前,以及在maxpooling之后,都增加了深度学习入门 | 第六章:经典卷积神经网络:Inception的卷积。在实际操作中,每次使用通道数较少的深度学习入门 | 第六章:经典卷积神经网络:Inception卷积,可以大幅降低参数个数,从而实现降维。

深度学习入门 | 第六章:经典卷积神经网络:Inception

图6.3  新增的1×1卷积(黄色部分)

了更清晰地说明这一点,举个例子,如图6.4所示,假设上一层的输出结果是深度学习入门 | 第六章:经典卷积神经网络:Inception中间经过具有256通道的深度学习入门 | 第六章:经典卷积神经网络:Inception的same卷积之后,输出结果为深度学习入门 | 第六章:经典卷积神经网络:Inception,两种方法消耗的参数个数分别如下。

(1)旧方法消耗的参数个数。如果不考虑截距项,参数个数就变为深度学习入门 | 第六章:经典卷积神经网络:Inception

(2)新方法消耗的参数个数。此时在原始的深度学习入门 | 第六章:经典卷积神经网络:Inception的输入上,先经过具有96个通道的深度学习入门 | 第六章:经典卷积神经网络:Inception卷积层,消耗的参数个数为深度学习入门 | 第六章:经典卷积神经网络:Inception;再经过具有256个通道的深度学习入门 | 第六章:经典卷积神经网络:Inception卷积层,消耗的参数个数为深度学习入门 | 第六章:经典卷积神经网络:Inception,最后输出的数据仍然为深度学习入门 | 第六章:经典卷积神经网络:Inception,此时需要的参数总数为239 616。

可以看到,整体的参数相比之前大约减少了一半,这里参数减少主要归功于使用了通道数较少的深度学习入门 | 第六章:经典卷积神经网络:Inception卷积核。

深度学习入门 | 第六章:经典卷积神经网络:Inception

图6.4  1×1卷积带来的参数个数减少的效果

3.Inception V1完整的网络结构

Inception V1完整的网络结构如图6.5所示,整个网络结构是比较庞大的,它一共有22层,各层如下。

输入层。原始输入图像为深度学习入门 | 第六章:经典卷积神经网络:Inception

第一层(卷积层)。使用深度学习入门 | 第六章:经典卷积神经网络:Inception的卷积核(滑动步长为2)进行same卷积,64通道,输出为深度学习入门 | 第六章:经典卷积神经网络:Inception;然后经过深度学习入门 | 第六章:经典卷积神经网络:Inception的最大值池化(步长为2),输出尺寸为深度学习入门 | 第六章:经典卷积神经网络:Inception,即深度学习入门 | 第六章:经典卷积神经网络:Inception,在进行局部响应归一(即某种标准化)后,进入第二个卷积层。

第二层(卷积层)。使用深度学习入门 | 第六章:经典卷积神经网络:Inception的卷积核(滑动步长为1)进行same卷积,192通道,输出为深度学习入门 | 第六章:经典卷积神经网络:Inception;然后经过深度学习入门 | 第六章:经典卷积神经网络:Inception的最大值池化(步长为2),输出尺寸为深度学习入门 | 第六章:经典卷积神经网络:Inception,即深度学习入门 | 第六章:经典卷积神经网络:Inception,接下来进入Inception模块。

第三层(Inception 3a层)。有4个分支,采用不同尺寸的卷积核进行处理。

(1)64个深度学习入门 | 第六章:经典卷积神经网络:Inception的卷积核,输出为深度学习入门 | 第六章:经典卷积神经网络:Inception

(2)96个深度学习入门 | 第六章:经典卷积神经网络:Inception的卷积核,作为深度学习入门 | 第六章:经典卷积神经网络:Inception卷积核之前的降维,变成深度学习入门 | 第六章:经典卷积神经网络:Inception,然后进行128个深度学习入门 | 第六章:经典卷积神经网络:Inception的卷积,输出为深度学习入门 | 第六章:经典卷积神经网络:Inception

深度学习入门 | 第六章:经典卷积神经网络:Inception

图6.5  Inception V1完整的网络结构

(3)16个深度学习入门 | 第六章:经典卷积神经网络:Inception的卷积核,作为深度学习入门 | 第六章:经典卷积神经网络:Inception卷积核之前的降维,变成深度学习入门 | 第六章:经典卷积神经网络:Inception,再进行32个深度学习入门 | 第六章:经典卷积神经网络:Inception的卷积,输出为深度学习入门 | 第六章:经典卷积神经网络:Inception

(4)最大值池化层,使用深度学习入门 | 第六章:经典卷积神经网络:Inception的最大值池化,输出为深度学习入门 | 第六章:经典卷积神经网络:Inception,然后进行32个深度学习入门 | 第六章:经典卷积神经网络:Inception的卷积,输出为深度学习入门 | 第六章:经典卷积神经网络:Inception。最后将4个结果并联,总的通道数为深度学习入门 | 第六章:经典卷积神经网络:Inception,因此最终输出为深度学习入门 | 第六章:经典卷积神经网络:Inception

第三层(Inception 3b层)。

(1)128个深度学习入门 | 第六章:经典卷积神经网络:Inception的卷积核,输出为深度学习入门 | 第六章:经典卷积神经网络:Inception

(2)128个深度学习入门 | 第六章:经典卷积神经网络:Inception的卷积核,作为深度学习入门 | 第六章:经典卷积神经网络:Inception卷积核之前的降维,变成深度学习入门 | 第六章:经典卷积神经网络:Inception,再进行192个深度学习入门 | 第六章:经典卷积神经网络:Inception的卷积,输出为深度学习入门 | 第六章:经典卷积神经网络:Inception

(3)32个深度学习入门 | 第六章:经典卷积神经网络:Inception的卷积核,作为深度学习入门 | 第六章:经典卷积神经网络:Inception卷积核之前的降维,变成深度学习入门 | 第六章:经典卷积神经网络:Inception,再进行96个深度学习入门 | 第六章:经典卷积神经网络:Inception的卷积,输出为深度学习入门 | 第六章:经典卷积神经网络:Inception

(4)最大值池化层,使用深度学习入门 | 第六章:经典卷积神经网络:Inception的最大值池化,输出为深度学习入门 | 第六章:经典卷积神经网络:Inception,然后进行64个深度学习入门 | 第六章:经典卷积神经网络:Inception的卷积,输出为深度学习入门 | 第六章:经典卷积神经网络:Inception。最后将4个结果并联,总的通道数为深度学习入门 | 第六章:经典卷积神经网络:Inception,因此最终输出为深度学习入门 | 第六章:经典卷积神经网络:Inception

第四层(4a,4b,4c,4d,4e)、第五层(5a,5b)……,与第三层的3a、3b类似。


6.1.2
案例:花的分类

下面通过花的分类数据来展示如何实现Inception V1,该数据集为公开数据集,包含了17种不同花的类别。

1.数据准备与处理

作为案例展示,选取其中的部分数据,通过对原始样本数据集进行随机分类,得到用于本案例的训练集共有952张图像,验证集共有408张图像。首先通过ImageDataGenerator()读入数据,具体如代码示例6-1所示。

代码示例6-1:读入数据

from keras.preprocessing.image import ImageDataGenerator

IMSIZE=224

train_generator = ImageDataGenerator(rescale=1./255).flow_from_directory(
     './data_incp/train/',
     target_size=(IMSIZE, IMSIZE),
     batch_size=100,
     class_mode='categorical')

validation_generator = ImageDataGenerator(rescale=1./255).flow_from_directory(
     './data_incp/test',
     target_size=(IMSIZE, IMSIZE),
     batch_size=100,
     class_mode='categorical')

展示训练集的前10张图像,具体如代码示例6-2所示。

代码示例6-2:展示图像

from matplotlib import pyplot as plt

plt.figure()
fig,ax = plt.subplots(2,5)
fig.set_figheight(7)
fig.set_figwidth(15)
ax=ax.flatten()
X,Y=next(train_generator)
for i in range(10): ax[i].imshow(X[i,:,:,:])

输出:

深度学习入门 | 第六章:经典卷积神经网络:Inception

2.Inception V1代码实现

编写Inception V1的代码,代码结构和之前模型的基本一致,值得注意的是,这里需要导入concatenate函数,该函数用于实现同一层中,不同尺寸卷积核的并联操作,输入图像的尺寸仍然是深度学习入门 | 第六章:经典卷积神经网络:Inception,按照InceptionV1的完整结构,依次构造Inception V1的各层。具体如代码示例6-3所示。

代码示例6-3:Inception V1代码实现

from keras.layers import Conv2D, BatchNormalization, MaxPooling2D
from keras.layers import Flatten, Dropout, Dense, Input, concatenate
from keras import Model

input_layer = Input([IMSIZE,IMSIZE,3]) 
x = input_layer

x = Conv2D(64,(7,7),strides=(2,2),padding='same',activation='relu')(x) 
x = BatchNormalization(axis=3)(x) 
x = MaxPooling2D(pool_size=(3,3),strides=(2,2),padding='same')(x) 

x = Conv2D(192,(3,3),strides=(1,1),padding='same',activation='relu')(x) 
x = BatchNormalization(axis=3)(x) 
x = MaxPooling2D(pool_size=(3,3),strides=(2,2),padding='same')(x) 

for i in range(9):
     #第三层:Inception 3a。后面的3b,4a-4e,5a,5b都用3a近似替代
     ##64个1x1的卷积核
     branch1x1 = Conv2D(64,(1,1),strides=(1,1),padding='same',activation=
'relu')(x)
     branch1x1 = BatchNormalization(axis=3)(branch1x1)
     ##96个1x1的卷积核,再进行128个3x3的卷积
     branch3x3 = Conv2D(96,(1,1),strides=(1,1),padding='same',activation=
'relu')(x) 
     branch3x3 = BatchNormalization(axis=3)(branch3x3) 
     branch3x3 = Conv2D(128,(3,3),strides=(1,1),padding='same',activation=
'relu')(branch3x3) 
     branch3x3 = BatchNormalization(axis=3)(branch3x3)
     ##16个1x1的卷积核,再进行32个5x5的卷积
     branch5x5 = Conv2D(16,(1,1),strides=(1,1),padding='same',activation=
'relu')(x) 
     branch5x5 = BatchNormalization(axis=3)(branch5x5)
     branch5x5 = Conv2D(32,(5,5),strides=(1,1),padding='same',activation='relu')
(branch5x5) 
     branch5x5 = BatchNormalization(axis=3)(branch5x5) 
     ##pool层,使用3x3的核,输出28x28x192,然后进行32个1x1的卷积
     branchpool = MaxPooling2D(pool_size=(3,3),strides=(1,1),padding='same')(x)
     branchpool = Conv2D(32,(1,1),strides=(1,1),padding='same',activation=
'relu')(branchpool) 
     branchpool = BatchNormalization(axis=3)(branchpool) 
     x = concatenate([branch1x1,branch3x3,branch5x5,branchpool],axis=3)
     x = MaxPooling2D(pool_size=(3,3),strides=(2,2),padding='same')(x)

x = Dropout(0.4)(x)
x = Flatten()(x)
x = Dense(17,activation='softmax')(x)
output_layer=x
model=Model(input_layer,output_layer)
model.summary()

使用model.summary()查看模型结构和参数概要,由于层数过多,只展示最开始的部分结构,如图6.6所示:

深度学习入门 | 第六章:经典卷积神经网络:Inception

图6.6  Inception V1模型概要表

3.Inception V1编译运行

构造的简化版的Inception V1模型应用到花的分类数据上,可以看到,训练集的准确率达到了93.84%,验证集的准确率提高到了48.53%,具体如代码示例6-4所示,输出如图6.7所示。

代码示例6-4:Inception V1模型编译与拟合

from keras.optimizers import Adam
model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.001), 
metrics=['accuracy'])
model.fit_generator(train_generator,epochs=20,validation_data=validation_
generator)

输出:

深度学习入门 | 第六章:经典卷积神经网络:Inception

图6.7  Inception V1模型训练结果

深度学习入门 | 第六章:经典卷积神经网络:Inception
深度学习入门 | 第六章:经典卷积神经网络:Inception

后总结一下,Inception V1通过增加网络的宽度来提升训练效果,主要有两个创新点,一是使用不同尺寸的卷积核来提炼更多丰富的细节,二是大量使用小卷积核来达到降维的目的。

以上就是今天为大家介绍的Inception网络结构,下周我们继续更新其他经典的CNN模型。欢迎大家点击【阅读原文】同步收看狗熊会慕课平台的深度学习课程,里面有熊大的精彩讲解!





往期精彩











点击阅读原文,一起玩耍

以上是关于深度学习入门 | 第六章:经典卷积神经网络:Inception的主要内容,如果未能解决你的问题,请参考以下文章

深度学习Bible学习笔记:第六章 深度前馈网络

第六章 二叉树算法入门经典结构体指针

算法入门经典第六章 例题6-5 移动盒子

算法入门经典第六章 例题6-15 给任务排序

深度学习系列经典博客收藏

吴裕雄--天生自然python Google深度学习框架:经典卷积神经网络模型