GoogleLeNet解析:Going deeper with convolutions
GoogleLeNet深度有22层,但是参数量却只有AlexNet的1/12。
为减小计算量并且增加模型宽度,google为此设计了一种名叫inception module的结构。
inception经历了从v1到v4的改进,下图是inception的原始结构。
该结构将1x1,3x3,5x5的卷积和3x3的最大池化操作堆叠在一起,即增加了网络的宽度,也增加了网络对多尺度的适应性。
但是5x5的卷积核计算量依然很大,并且会造成特征图的厚度很大。所以在3x3,5x5的卷积和3x3的最大池化前加入了1x1的卷积核,以达到降维的目的,这就是inception v1的结构。
这里举例说明1x1的卷积是如何减少参数量的。
假设,previous layer的输出是大小128x128x256,
经过192个5x5的卷积核之后(stride=1, pad=2),
根据公式(w-f+2p)/s+1计算,输出大小是128x128x192,
参数为256x5x5x192=1228800.
而如果在5x5的卷积前面增加一个64通道的1x1的卷积层,
那么输出大小依然是128x128x192,
但是参数量却是256x1x1x32+32x5x5x192=161792.
这一下就减少了七点几倍的参数量。
下图是基于inception构建的GoogleLeNet的网络结构(图片来自网络)。
可以看到网络中还增加了两个辅助分类器,是为了避免的很深的网络中梯度消失的问题。
论文中的网络细节如下:
实验结果