Inception block

from GoogLenet

Author:张一极 2020-0321-20:27

谷歌的inceptionnet通过不一样的叠加方法,获取了更深层次的图像特征和语义信息,也为了更高效的利用资源,获取更有利的结果。

两个特点,从inception模块中,第一个是使用1x1卷积降维,第二个特点是,多尺度卷积同时聚合,

使用1x1卷积,可以在卷积过程中,将乘法变为加法,原先堆叠的程度,变成线性的串联,累加起来的计算量,比起直接累乘要少很多。

多通道卷积的优势:

在多个尺寸卷积的情况下,可以获取不同感受野下的不同信息,以往的网络都是3x3的卷积提取特征,inception使用多个通道,1x1,3x3,5x5,组合成一样的特征数目,减少了冗余杂乱,最终的计算效率是一样的,并且收敛速度上更有优势。

所以,我理解的inception结构就是在多个尺度上,进行卷积和池化以后,通过特征通道上的连接给到网络的。

接下来每一个path的结构参考paper给出的结构,

image-20200322150925151

第一条通路,直接经过一个1x1的卷积结构,即上文所述可以在卷积过程中,将乘法变为加法,原先堆叠的程度,变成线性的串联,累加起来的计算量比起直接累乘要少,而作者在论文中提到了,提高深度学习网络效率的一个方法就是增大网络宽度,也就是神经元的个数,但是由此会引起的问题就是关于训练的难题,会导致这些网络结构无法顺利收敛,很多参数收敛到最后都趋于0,浪费了计算机的计算能力,于是论文使用了多个通路,分别是1x1,3x3,5x5的卷积结构,为了方便叠加,无其他的架构,在5x5和3x3之前使用1x1卷积进行降维,防止计算开销过大的问题。

第二条通路,尺度为1的卷积降维+3x3的卷积提取特征,最终输出维度和直接使用3x3的卷积是一样的特征维度。

第三条通道类似,第四条,先是用了一个池化层,一个3x3的maxpooling,但是移动步长为1,这一点很重要,没有减少特征尺寸的情况下,提取了一些图像特征。

Code:

所有的inception模块结构都是一样的,实现了多层通路:

其中conv_函数是一个生成函数,生成一个自定义通道和kernel—size的卷积层:

每一个conv生成的包含三个结构,标准的卷积格式。


网络架构:

141605_c1XW_876354.png

头部网络:

neckblock:

网络结构表格中#3x3表示,先通过1x1卷积,再进入的3x3卷积,所以我们的neckblock多了一个1x1的同输入输出结构,至此,我们实现到了第二个部分,输出维度是28x28x192,下面是第一个inceptions模块。

这部分结构,第一个inception,输出是28 *28 * 256,承接它的是第二个的输入,第二个输出是480维度的特征,

第二个inceptions:

inception操作之后,通过一个maxpooling,size是3的stride=2的池化操作,把输出特征图尺寸降低到了7x7x832,(原来是14x14x832)。

最后一个inception结构:

使用了avgpooling模块,全局平均池化,论文实验说比全连接层好了0.6个点,所以我也打算做个实验看看可不可行。

Code:

最后一层linear。

对应的,我做了一组对比实验:

最后一层取代了avg结构:

All code:

 

实验🧪:going

🏃