1.GoogLeNet网络详解
网络中的创新点:
(1)引入了Inception结构(融合不同尺度的特征信息)
(2)使用1x1的卷积核进行降维以及映射处理 (虽然VGG网络中也有,但该论文介绍的更详细)
(3)添加两个辅助分类器帮助训练
(4)丢弃全连接层,使用平均池化层(大大减少模型参数,除去两个辅助分类器,网络大小只有vgg的1/20)
(1) Inception结构
inception的作用:增加网络深度和宽度的同时减少参数。

左图为原始结构,右图加上了降维功能。
在左图中,将特征矩阵同时输入到四个分支中进行处理(并行),将这四个分支处理后的特征矩阵按深度(channel维度)进行拼接,最后得到一个输出特征矩阵。
在右图中,通过增加三个1x1的卷积层达到降维的作用,目的是为了降维(减小深度),减少模型训练参数,减少计算量。
注:每个分支所得特征矩阵的高和宽必须相同(通过调整stride和padding),以保证输出特征能在深度上进行拼接。
(2) 1x1卷积核降维

如果不使用1x1卷积核,使用64个5x5的卷积核进行卷积,就需要819200个参数;如果使用24个1x1的卷积核进行卷积,只需要50688个参数。
CNN参数个数 = 卷积核尺寸 × 卷积核深度 × 卷积核组数 = 卷积核尺寸 × 输入特征矩阵深度 × 输出特征矩阵深度
(3) 辅助分类器

在GoogLeNet网络中有两个辅助分类器,结构是完全一样的。这两个辅助分类器的输入分别来自Inception(4a)和Inception(4d)。
辅助分类器的第一层是一个平均池化下采样层,池化核大小为5x5,stride=3
第二层是卷积层,卷积核大小为1x1,stride=1,卷积核个数是128
第三层是全连接层,节点个数是1024
第四层是全连接层,节点个数是1000(对应分类的类别个数)
辅助分类器的两个分支的作用:
(1)可以把它看做inception网络中的一个小细节,它确保了即便是隐藏单元和中间层也参与了特征计算,它们也能预测图片的类别,它在inception网络中起到一种调整的效果,并且能防止网络发生过拟合。
(2)给定深度相对较大的网络,有效传播梯度反向通过所有层的能力是一个问题。通过将辅助分类器添加到这些中间层,可以期望较低阶段分类器的判别力。在训练期间,它们的损失以折扣权重(辅助分类器损失的权重是0.3)加到网络的整个损失上。
GoogLeNet 网络参数
参数#1x1,#3x3reduce,#3x3,#5x5reduce,#5x5,#pool proj主要对应Inception结构的配置

#1x1对应着分支1上1x1的卷积核个数
#3x3reduce对应着分支2上1x1的卷积核个数
#3x3对应着分支2上3x3的卷积核个数
#5x5reduce对应着分支3上1x1的卷积核个数
#5x5对应着分支3上5x5的卷积核个数
pool proj对应着分支4上1x1的卷积核个数。
GoogLeNet 网络模型

2.使用Pytorch搭建GoogLeNet网络
model.py
定义卷积模板
在搭建网络之前先进行模板文件的创建,可以通过此方法定义卷积模板避免重复搭建conv和relu,卷积模板的定义:
class BasicConv2d(nn.Module): #在搭建卷积层过程中通常将卷积和ReLU激活函数共同使用
def __init__(self, in_channels, out_channels, **kwargs):
super(BasicConv2d, self).__init__()
self.conv = nn.Conv2d(in_channels, out_channels, **kwargs)
self.relu = nn.ReLU(inplace=True)
def forward(self, x): #定义正向传播过程
x = self.conv(x)
x = self.relu(x)
return x
定义Inception模板
class Inception(nn.Module): #定义Inception结构模板
def __init__(self, in_channels, ch1x1, ch3x3red, ch3x3, ch5x5red, ch5x5, pool_proj): #结合googlenet网络参数和Inception结构
super(Inception, self).__init__()
self.branch1 = BasicConv2d(in_channels, ch1x1, kernel_size=1) #分支1,使用定义的卷积模板,输入的特征矩阵深度为in_channels,卷积核个数为传入的ch1x1
self.branch2 = nn.Sequential(
BasicConv2d(in_channels, ch3x3red, kernel_size=1), #分支2
BasicConv2d(ch3x3red, ch3x3, kernel_size=3, padding=1) #将padding设置为1,使输出特征矩阵和输入特征矩阵的高和宽保持一致,保证输出大小等于输入大小
)
self.branch3 = nn.Sequential( #分支3
BasicConv2d(in_channels, ch5x5red, kernel_size=1),
BasicConv2d(ch5x5red, ch5x5, kernel_size=5, padding=2) #保证输出大小等于输入大小:output_size=(input_size-5+2*2)/1+1=input_size
)
self.branch4 = nn.Sequential(

本文详细介绍了GoogLeNet网络的创新点,包括Inception结构、1x1卷积核、辅助分类器以及网络参数优化。同时,展示了如何使用Pytorch搭建GoogLeNet网络,包括定义卷积模板、Inception模块、辅助分类器以及整个网络结构。在训练过程中,利用辅助分类器的损失来辅助优化。
最低0.47元/天 解锁文章
3257

被折叠的 条评论
为什么被折叠?



