文章插图
【pytorch实现 GoogLeNet——CNN经典网络模型详解】
在这里插入图片描述
每个卷积层的卷积核个数如何确定呢,下面是原论文中给出的参数列表,对于我们搭建的Inception模块,所需要使用到参数有#1x1, #3x3reduce, #3x3, #5x5reduce, #5x5, poolproj,这6个参数,分别对应着所使用的卷积核个数 。
文章插图
下面这幅图是我将Inception模块所使用到的参数信息标注在每个分支上,其中#1x1对应着分支1上1x1的卷积核个数,#3x3reduce对应着分支2上1x1的卷积核个数,#3x3对应着分支2上3x3的卷积核个数,#5x5reduce对应着分支3上1x1的卷积核个数,#5x5对应着分支3上5x5的卷积核个数,poolproj对应着分支4上1x1的卷积核个数 。
文章插图
多个尺寸上进行卷积再聚合
上图可以看到对输入做了4个分支,分别用不同尺寸的filter进行卷积或池化,最后再在特征维度上拼接到一起 。这种全新的结构有什么好处呢?Szegedy从多个角度进行了解释:
解释1:在直观感觉上在多个尺度上同时进行卷积,能提取到不同尺度的特征 。特征更为丰富也意味着最后分类判断时更加准确 。
解释2:利用稀疏矩阵分解成密集矩阵计算的原理来加快收敛速度 。
举个例子下图左侧是个稀疏矩阵(很多元素都为0,不均匀分布在矩阵中),和一个2x2的矩阵进行卷积,需要对稀疏矩阵中的每一个元素进行计算;如果像右图那样把稀疏矩阵分解成2个子密集矩阵,再和2x2矩阵进行卷积,稀疏矩阵中0较多的区域就可以不用计算,计算量就大大降低 。这个原理应用到inception上就是要在特征维度上进行分解! 传统的卷积层的输入数据只和一种尺度(比如3x3)的卷积核进行卷积,输出固定维度(比如256个特征)的数据,所有256个输出特征基本上是均匀分布在3x3尺度范围上,这可以理解成输出了一个稀疏分布的特征集;而inception模块在多个尺度上提取特征(比如1x1,3x3,5x5),输出的256个特征就不再是均匀分布,而是相关性强的特征聚集在一起(比如1x1的的96个特征聚集在一起,3x3的96个特征聚集在一起,5x5的64个特征聚集在一起),这可以理解成多个密集分布的子特征集 。这样的特征集中因为相关性较强的特征聚集在了一起,不相关的非关键特征就被弱化,同样是输出256个特征,inception方法输出的特征“冗余”的信息较少 。用这样的“纯”的特征集层层传递最后作为反向计算的输入,自然收敛的速度更快 。
文章插图
在这里插入图片描述
解释3:Hebbin赫布原理 。Hebbin原理是神经科学上的一个理论,解释了在学习的过程中脑中的神经元所发生的变化,用一句话概括就是fire togethter, wire together 。赫布认为“两个神经元或者神经元系统,如果总是同时兴奋,就会形成一种‘组合’,其中一个神经元的兴奋会促进另一个的兴奋” 。比如狗看到肉会流口水,反复刺激后,脑中识别肉的神经元会和掌管唾液分泌的神经元会相互促进,“缠绕”在一起,以后再看到肉就会更快流出口水 。用在inception结构中就是要把相关性强的特征汇聚到一起 。这有点类似上面的解释2,把1x1,3x3,5x5的特征分开 。因为训练收敛的最终目的就是要提取出独立的特征,所以预先把相关性强的特征汇聚,就能起到加速收敛的作用 。
在inception模块中有一个分支使用了max pooling,作者认为pooling也能起到提取特征的作用,所以也加入模块中 。注意这个pooling的stride=1,pooling后没有减少数据的尺寸
辅助分类器结构 网络中的两个辅助分类器结构是一模一样的,如下图所示
文章插图
着两个辅助分类器的输入分别来自Inception(4a)和Inception(4d) 。
- 辅助分类器的第一层是一个平均池化下采样层,池化核大小为5x5,stride=3
- 第二层是卷积层,卷积核大小为1x1,stride=1,卷积核个数是128
- 第三层是全连接层,节点个数是1024
- 第四层是全连接层,节点个数是1000(对应分类的类别个数)
推荐阅读
- Python实现数据压缩如此简单
- Java案例实战:Httpclient 实现网络请求 + Jsoup 解析网页
- 教你用10行Python 代码实现自动化群控
- 中老年耳背会遗传吗?
- 使用Swoole协程实现 WebRTC 信令服务器
- GO语言 GUI编程 | 怎样实现 page 页面?
- 使用 Go 语言实现凯撒加密
- 主流RPC框架通讯协议实现原理与源码解析
- SpringBoot中使用dubbo实现RPC调用
- 使用时间轮实现“延时任务”