关于GoogleNet的一些理解

首先,讲一下GoogleNet的网络结构。

GoogleNet全称叫做Google Inception Net,和传统的CNN一样,Googlenet的前面几层也是卷积层和池化层,和其他网络不同的地方是,GoogleNet接下来会有若干个Inception Module组,每个模块组又包含若干个inception module,在经过inception modules之后,再来一个全局池化,最后再像其他网络那样再来一个softmax。

Googlenet发展了4种不同的版本。v1就如上述的网络设计,中间加上一些数据增强的方法如multi-scale等来丰富样本数据。v2学习了vggnet,用小的卷积核代替了大尺寸卷积核,还提出了batch normalization方法,即BN方法,该方法会对每一个输入的样本数据的内部进行标准化处理,使输出的数据样本规范化到N(0,1)的正态分布,这样处理之后,可以设定更大的学习速率,也即可使训练时间大大缩短,并且达到之前的准确率之后,还可以继续训练,并最终达到降低错误率的目的。

最重要的V3,使用了factorization into small convolution思想,即将一个较大的二位卷积核拆成两个较小的一维卷积核,例如一个3*3卷积核拆成3*1和1*3两个一维卷积核。这样做的好处是首先减少了大量的参数,原来的3*3卷积核参数又9个,而现在参数一共只有6个,这样做加速了运算并减轻了过拟合,同时还增加了一层非线性运算,扩展了模型的表达能力。另一方面,v3还优化了inception module的结构,使模块的分支中再加上分支,即network in network in network。而v4则是结合了ResNet即残差学习网络的思想,这里不提。

上图是一个inception modules组的结构示意图,想表达的意思就是,每个modules组的每一个module是顺序连接的,不是并行的,而module中的每一个branch才是并行的结构,即每个branch的输入应该是相同的,而一个modules组内的各个module的输入和输出应该是承上启下的。当第一个inception modules结构跑完之后,顺序而来的就是第二个inception modules模块组。

还有一点要注意的是,在每个module内部,每个branch分支的输出尺寸应该是一样大的,例如上图中的每个branch输出的均为35*35的矩阵,而每个module的输出矩阵的数量则为各个branch的输出数量之和,上图中的即为64+96+32=192.

最后,整个googlenet比较重要的v3,有如下几个点是经常借鉴和非常有效的:

1、Factorization into small convolution很有效,可以降低参数量,减轻过拟合,增加网络非线性的表达能力。

2、卷积网络从输入到暑促,应该让图像尺寸逐渐减小,输出通道数逐渐增加,这也是让图像平面结构简化,将平面信息转化为更加高阶更加抽象的特征信息。

3、Inception Module用多个分支提取不同抽象成都的高阶特征的思路很有效,可以丰富网络的表达能力。

猜你喜欢

转载自blog.csdn.net/SHNU_PFH/article/details/81708259