深度学习入门 | 第六章:经典卷积神经网络:Inception
Posted 狗熊会
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习入门 | 第六章:经典卷积神经网络:Inception相关的知识,希望对你有一定的参考价值。
Inception网络结构由Google团队提出,因此也被称为GoogleNet。该模型一共有4个版本,从V1到V4。其中Inception V1是2014年由克里斯汀·塞格德(Christian Szegedy)提出并获得了当年ImageNet的冠军。
第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)模块就是在同一层上分别使用了、和三个不同的卷积。
(2)使用的卷积来降维,图6.1中的(1)、(2)、(3)模块都是在和卷积之前先使用卷积,在的最大值池化之后也使用了卷积。
图6.1 Inception V1基础模块
2.Inception的两个创新点
Inception相较于之前的卷积方式有以下两个创新点。
(1)Inception V1使用多个不同尺寸的卷积核。通过图6.2中新旧方法的对比,可以清晰地看到,在之前的神经网络训练中,对上一层的输入通常使用多个相同尺寸的卷积核进行操作,而在Inception V1中,对上一层的输入使用多个不同尺寸的卷积核进行操作。学者们对这种操作的优点给出了多种解释,其中比较直观通俗的一种解释是,叠加不同尺寸的卷积核,可以从细节上提取更丰富的特征。
图6.2 Inception V1和之前卷积方式的区别
(2)使用大量的卷积核,通过图6.3中新旧方法的对比可以看到,在,卷积核之前,以及在maxpooling之后,都增加了的卷积。在实际操作中,每次使用通道数较少的卷积,可以大幅降低参数个数,从而实现降维。
图6.3 新增的1×1卷积(黄色部分)
为了更清晰地说明这一点,举个例子,如图6.4所示,假设上一层的输出结果是,中间经过具有256通道的的same卷积之后,输出结果为,两种方法消耗的参数个数分别如下。
(1)旧方法消耗的参数个数。如果不考虑截距项,参数个数就变为。
(2)新方法消耗的参数个数。此时在原始的的输入上,先经过具有96个通道的卷积层,消耗的参数个数为;再经过具有256个通道的卷积层,消耗的参数个数为,最后输出的数据仍然为,此时需要的参数总数为239 616。
可以看到,整体的参数相比之前大约减少了一半,这里参数减少主要归功于使用了通道数较少的卷积核。
图6.4 1×1卷积带来的参数个数减少的效果
3.Inception V1完整的网络结构
Inception V1完整的网络结构如图6.5所示,整个网络结构是比较庞大的,它一共有22层,各层如下。
输入层。原始输入图像为。
第一层(卷积层)。使用的卷积核(滑动步长为2)进行same卷积,64通道,输出为;然后经过的最大值池化(步长为2),输出尺寸为,即,在进行局部响应归一(即某种标准化)后,进入第二个卷积层。
第二层(卷积层)。使用的卷积核(滑动步长为1)进行same卷积,192通道,输出为;然后经过的最大值池化(步长为2),输出尺寸为,即,接下来进入Inception模块。
第三层(Inception 3a层)。有4个分支,采用不同尺寸的卷积核进行处理。
(1)64个的卷积核,输出为。
(2)96个的卷积核,作为卷积核之前的降维,变成,然后进行128个的卷积,输出为。
图6.5 Inception V1完整的网络结构
(3)16个的卷积核,作为卷积核之前的降维,变成,再进行32个的卷积,输出为。
(4)最大值池化层,使用的最大值池化,输出为,然后进行32个的卷积,输出为。最后将4个结果并联,总的通道数为,因此最终输出为。
第三层(Inception 3b层)。
(1)128个的卷积核,输出为。
(2)128个的卷积核,作为卷积核之前的降维,变成,再进行192个的卷积,输出为。
(3)32个的卷积核,作为卷积核之前的降维,变成,再进行96个的卷积,输出为。
(4)最大值池化层,使用的最大值池化,输出为,然后进行64个的卷积,输出为。最后将4个结果并联,总的通道数为,因此最终输出为。
第四层(4a,4b,4c,4d,4e)、第五层(5a,5b)……,与第三层的3a、3b类似。
下面通过花的分类数据来展示如何实现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,:,:,:])
输出:
2.Inception V1代码实现
编写Inception V1的代码,代码结构和之前模型的基本一致,值得注意的是,这里需要导入concatenate函数,该函数用于实现同一层中,不同尺寸卷积核的并联操作,输入图像的尺寸仍然是,按照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所示:
图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)
输出:
图6.7 Inception V1模型训练结果
最后总结一下,Inception V1通过增加网络的宽度来提升训练效果,主要有两个创新点,一是使用不同尺寸的卷积核来提炼更多丰富的细节,二是大量使用小卷积核来达到降维的目的。
以上就是今天为大家介绍的Inception网络结构,下周我们继续更新其他经典的CNN模型。欢迎大家点击【阅读原文】同步收看狗熊会慕课平台的深度学习课程,里面有熊大的精彩讲解!
以上是关于深度学习入门 | 第六章:经典卷积神经网络:Inception的主要内容,如果未能解决你的问题,请参考以下文章