GoogLeNet详解:特征还能这样提取?

GoogLeNet详解:特征还能这样提取?
abinng😶🌫️author: abinng date: 2025-12-19 16:19
createDate:2025-12-19 15:26
背景
在2014年的ImageNet图像识别挑战赛中,一个名叫_GoogLeNet_ (Szegedy
et al., 2015)的网络架构大放异彩。
GoogLeNet吸收了NiN中串联网络的思想,并在此基础上做了改进。
这篇论文的一个重点是解决了什么样大小的卷积核最合适的问题。
毕竟,以前流行的网络使用小到
结构
上图是略微简化的GoogLeNet模型,省略了一些为稳定训练而添加的特殊特性
Inception块
上图结构中有一个很明显的、没见过的块,叫Inception块,也就是这个(看起来好恐怖?):

从输入开始看:Inception块由四条并行路径组成。前三条路径使用窗口大小为
卷积如何减少通道数?
上面提到了
Inception块的参数计算
假设输入为
- 路径1: 输入为
卷积核数量为 个;卷积核的尺寸为 ;步幅为 , 填充 输出为 的特征图。 - 路径2: 1.输入为
卷积核数量为 个;卷积核的尺寸为 ;步幅 , 填充 输出为 的特征图。 2.输入为 卷积核数量为 个;卷积核的尺寸为 ;步幅 , 填充 输出为 的特征图。 - 路径3: 1.输入为
卷积核数量为 个;卷积核的尺寸为 ;步幅 , 填充 输出为 的特征图。 2.输入为 卷积核数量为 个;卷积核的尺寸为 ;步幅 , 填充 输出为 的特征图。 - 路径4: 1.输入为
池化感受野为 ;步幅 , 填充 输出为 的特征图。 2.输入为 卷积核数量为 个;卷积核的尺寸为 ;步幅 , 填充 输出为 的特征图。 - 通道合并: 1.路径1的输出为:
2.路径2的输出为: 3.路径3的输出为: 4.路径4的输出为: 最终通道合并为 ,最终的输出为: 。
1 | import torch |
卷积核的作用
- ==提前声明==,其实这些作用只要是卷积都可以达到,但是
的卷积核更“专一”,计算时并不会把一些不想包含的邻域的值也包含进来计算 - 实现跨通道的交互和信息整合
- 其实其他大小的卷积核也有同样作用,但是
卷积核首先计算量小,其次 卷积核在进行卷积运算时,权重控制明确,且边长大于1的卷积核在进行卷积运算时,如果要控制图像大小不变,要进行填充,此时就混合了一些0的值进行运算,而且只要卷积核边长大于1,就会进行空间的融合+通道的融合,而边长为1的卷积和只进行纯粹通道的融合,更好控制权重,例子: 的三通道输入,分别用 三通道且填充为1的卷积核与 三通道的卷积核进行卷积运算,通过这个计算过程,就可以理解到
- 其实其他大小的卷积核也有同样作用,但是
- 可以控制降维和升维,不改变
和 - 这个不难理解,可以参考上面的
卷积如何减少通道数,看懂了那么升维也同理
- 这个不难理解,可以参考上面的
- 通过降维可以减少计算量,升维也可以增加计算量
- 实际上其他大小的卷积核也可以实现,但是还是看上面的解释,显然
的更方便且更容易控制,作用在参数的值的方面便变化上的也不大不乱,毕竟我只想降维呢。升维同理
- 实际上其他大小的卷积核也可以实现,但是还是看上面的解释,显然
- 增加非线性特性
卷积核可以在保持特征图( )尺寸不变的前提下,通过后接的非线性激活函数(如 )大幅增加网络的非线性特性。这使得网络能够学习更复杂的特征,从而提高模型的表达能力。
全局平均池化层(GAP)
上面的模型结构图在最后连接FC层之前,有一个全局平均池化层,这是干嘛的? 一句话,把特征总结到一个均值上了,指望这个均值往后传递信息
这个全局平均池化的操作,实际上就是用一个和图像大小一样的池化感受野进行平均池化操作,最终得到
- 优点:一句话,直接把参数变得很少,并且保留了一定特征
- 抑制过拟合。因为参数变少了,单有全连接层的话,容易大量保留下来空间信息,导致过拟合。
- 使特征图输入尺寸更加灵活。因为神经网络参数在此刻不再与输入图像的尺寸有关了,而是与通道有关,也就是输入图像的长宽可以不固定。
- 缺点:一句话,一些重要特征可能被忽略
- 信息丢失:每个通道上的特征信息数值被压缩成一个数值,肯定会丢失信息,一些重要的特征表达可能会被平均掉,导致降低了网络的表达能力
- 梯度信息:特征图被降维成一个向量,导致梯度的传播变得更加困难,可能会导致梯度消失/爆炸
- 复杂任务:还是一样的,对于一些重视细节的任务,一些特征被忽略,表达能力不够
参数计算
不多说,还是用到了这个公式:
1 | b1 = nn.Sequential(nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3), |
第二个模块使用两个卷积层:第一个卷积层是64个通道、
1 | b2 = nn.Sequential(nn.Conv2d(64, 64, kernel_size=1), |
第三个模块串联两个完整的Inception块。第一个Inception块的输出通道数为
1 | b3 = nn.Sequential(Inception(192, 64, (96, 128), (16, 32), 32), |
第四模块更加复杂, 它串联了5个Inception块,其输出通道数分别是
1 | b4 = nn.Sequential(Inception(480, 192, (96, 208), (16, 48), 64), |
第五模块包含输出通道数为
1 | b5 = nn.Sequential(Inception(832, 256, (160, 320), (32, 128), 128), |
权重初始化:
初始化权重的原因:
- 不良的初始化,极易造成梯度消失or梯度爆炸
- 如果权重初始化得太远离最优解,模型需要更多时间来调整这些权重以达到最佳性能。而一个好的初始化策略可以使权重开始时就更接近最优解,从而加快训练过程。
- 可能让模型陷入局部最小值出不去
从反向传播中理解,这里引用上面梯度下降法反向传播的一个公式
梯度下降法反向传播的基础知识
好了回忆完了,所以我们知道:
- 当
很小时,为梯度消失 - 当
很大时,为梯度爆炸 而从上面的公式可以知道, 的大小就能影响梯度 当网络的层数比较深的情况下,如VGG,GoogLeNet - 当权重比1大一点,随着连乘,就会爆炸式增长
- 当权重比1小一点,随着连乘,就会指数级减少
1 | for m in self.modules(): |
GoogLeNet模型的计算复杂,而且不如VGG那样便于修改通道数。 为了使Fashion-MNIST上的训练短小精悍,我们可以将输入的高和宽从224降到96,这简化了计算。
代码
GitHub - abinng/Blog-code: 用于存放我博客中的代码
进入后右上角可以给仓库一个Star哦~(´▽`ʃ♡ƪ)














