GoogLeNet学习总结

#参考文档:https://my.oschina.net/u/876354/blog/1637819#comments
https://panjinquan.blog.****.net/article/details/81560537
本文就最近学习的GoogLeNet进行总结,主要包括了其基本原理、模型构成、python代码实现、C语言代码简单实现、实战项目应用。
一、基本原理
一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,深度指网络层次数量、宽度指神经元数量。但这种方式容易产生以下问题:
(1)参数太多,如果训练数据集有限,很容易产生过拟合;
(2)网络越大、参数越多,计算复杂度越大,难以应用;
(3)网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型。
所以设计团队通过使用Inception结构,既保证了参数数量不会过大,又可以增强网络表现。
GoogLeNet学习总结
该结构是由四路并行的操作组成的模块。由于其中5x5的参数数量过大,设计团队又改进该结构如下。GoogLeNet学习总结
可以看到在3x3、5x5之前增加了一层1x1的卷积层,目的是为了削减参数数量。下面举一个计算实例来说明这样做的好处。
比如,上一层的输出为150x150x128,经过具有256个通道的5x5卷积层之后(stride=1,pad=2),输出数据为150x150x256,其中,卷积层的参数为128x5x5x256= 819200。
而假如上一层输出先经过具有32个通道的1x1卷积层,输出数据为150x150x32。再经过具有256个输出的5x5卷积层,那么输出数据仍为为150x150x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256= 208896,大约减少了4倍。

二、网络模型构成
GoogLeNet实际上就是通过不断使用Inception模块,以及单层的卷积、池化实现了网络的组成。
GoogLeNet学习总结

GoogLeNet学习总结
三、代码实现
Python:可以将网络代码实现分解为几部分:首先构建一个用于实现卷积、归一化操作、**函数的模块函数。目的是为了在构建Inception时使用这个函数实现每一路操作中的卷积。
GoogLeNet学习总结
接下来实现Inception模块
GoogLeNet学习总结
这四路的输出结果由一个前向传播函数进行打包相加。
GoogLeNet学习总结
最后实现整个网络的结构。
GoogLeNet学习总结
GoogLeNet学习总结
C语言:之前的学习总结中总结了使用C语言实现卷积池化操作。同上面Python的思路相同,可以先借由实现Inception结构进而实现整个网络的构建。通过编写随机矩阵函数,给予一个指定大小的初始输入矩阵。再将初始矩阵给予incep函数进行其他函数的调用,以实现网络。
GoogLeNet学习总结
四、实战项目
一个可以训练运行的计算机视觉项目,基本步骤可以分为制作数据集——划分训练集验证集——生成tfrecord文件——使用网络模型进行训练——使用测试函数进行测试并输出结果。