GoogLeNet网络详解并使用pytorch搭建模型

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

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(                      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值