GoogLeNet(从Inception v1到v4的演进)

本文详细介绍了GoogLeNet网络结构,从Inception V1的模块化设计,探讨1x1卷积的作用,到Inception V2的卷积分解和降低特征图大小的优化,再到Inception V3和V4的进一步改进,如7x7分解和残差连接的应用,展示了GoogLeNet在提高准确性的同时保持计算效率的策略。
摘要由CSDN通过智能技术生成

Inception网络结构

       就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构.

Inception V1

       该结构将CNN中常用的卷积(1x1,3x3,5x5)、池化操作(3x3)堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性。
网络卷积层中的网络能够提取输入的每一个细节信息,同时5x5的滤波器也能够覆盖大部分接受层的的输入。还可以进行一个池化操作,以减少空间大小,降低过度拟合。在这些层之上,在每一个卷积层后都要做一个ReLU操作,以增加网络的非线性特征。
然而这个Inception原始版本,所有的卷积核都在上一层的所有输出上来做,而那个5x5的卷积核所需的计算量就太大了,造成了特征图的厚度很大,为了避免这种情况,在3x3前、5x5前、max pooling后分别加上了1x1的卷积核,以起到了降低特征图厚度的作用,这也就形成了Inception v1的网络结构,如上图所示

1x1的卷积核有什么用呢?
       1x1卷积的主要目的是为了减少维度,还用于修正线性激活(ReLU)。比如,上一层的输出为100x100x128,经过具有256个通道的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256,其中,卷积层的参数为128x5x5x256= 819200。而假如上一层输出先经过具有32个通道的1x1卷积层,再经过具有256个输出的5x5卷积层,那么输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256= 204800,大约减少了4倍。

基于Inception构建了GoogLeNet的网络结构如下(共22层):

对上图说明如下:
(1)GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改;
(2)网络最后采用了average pooling(平均池化)来代替全连接层,该想法来自NIN(Network in Network),事实证明这样可以将准确率提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整;
(3)虽然移除了全连接,但是网络中依然使用了Dropout ; 
(4)为了避免梯度消失,网络额外增加了2个辅助的softm

### Inception v1至v4版本的区别与改进 #### 版本概述 Inception系列模型经历了多个迭代版本的发展,从最初的Inception v1 (GoogLeNet)[^5] 到后来的Inception v2、v3以及最终的v4,在架构设计上不断引入新的技术以提高性能并降低计算成本。 #### 主要变化与发展 ##### Inception v1 作为该系列的第一个版本,提出了经典的Inception模块概念。通过在一个层内组合不同大小的卷积核(如1x1, 3x3, 5x5),使得网络能够捕捉多尺度特征的同时保持较低参数量和计算开销。 ##### Inception v2 & v3 这两个版本来自同一份论文《Rethinking the Inception Architecture for Computer Vision》[^4]。其中一个重要改进是将较大尺寸的卷积操作分解成更小的操作序列——例如把单个5x5卷积分解为连续两次应用的3x3卷积;这不仅减少了参数数量而且提高了效率。此外,还加入了批量标准化(Batch Normalization)用于加速收敛过程,并优化了网格尺寸规约策略以更好地控制信息流路径中的分辨率损失。 ##### Inception v4 此版本进一步探索了如何结合先前成功的组件和技术来构建更深更强力的体系结构。特别是借鉴了ResNet的思想,在原有基础上增加了残差连接机制,从而允许创建更加深层化的网络而不会遇到梯度消失等问题。这种做法显著增强了模型的学习能力,并促进了更快捷有效的训练流程[^1]。 ```python def inception_module_v4(x_input): # 定义分支11x1 卷积 branch_0 = Conv2D(96, kernel_size=(1, 1), padding='same', activation='relu')(x_input) # 定义分支2:串联两个1x1卷积加一个3x3卷积 branch_1 = Conv2D(64, kernel_size=(1, 1), padding='same', activation='relu')(x_input) branch_1 = Conv2D(96, kernel_size=(3, 3), padding='same', activation='relu')(branch_1) # ...其他分支定义... output = concatenate([branch_0, branch_1]) # 合并所有分支输出 return Add()([output, x_input]) # 添加残差连接 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值