图像分类篇:pytorch实现GoogLeNet

一、GoogLeNet网络详解

GoogLeNet在2014年由Google团队提出,斩获当年ImageNet竞赛中Classification Task(分类任务)中的第一名。

GoogLeNet的创新点:

  • 引入了Inception结构(融合不同尺度的特征信息)
  • 使用1x1的卷积核进行降维以及映射处理
  • 添加两个辅助分类器帮助训练(GoogLeNet有三个输出层,其中两个辅助分类层)
  • 丢弃全连接层,使用平均池化层(大大减少模型参数)

1.Inception结构

传统的CNN结构如AlexNet、VGG都是串联结构,即将一系列的卷积层和池化层进行串联得到的结构。

在这里插入图片描述

Inception原始结构 

GoogLeNet提出一种并联结构,下图是Inception的原始结构,将特征矩阵同时输入到多个分支中进行处理,并将输出的特征矩阵按深度进行拼接,得到最终的输出结果。

Inception的作用:增加网络深度和宽度的同时减少参数。

在这里插入图片描述

 注意:每个分支所得特征矩阵的高和宽必须相同(通过调整stride和padding ),来保证输出的特征矩阵能在深度上进行拼接。

Inception+降维

在Inception的基础上,还可以加上降维功能的结构,如下图所示,在原始Inception结构的基础上,在分支2、3、4上加入了卷积核大小为1x1的卷积层,目的是为了降维(减小深度),减少模型训练参数,减少计算量。

在这里插入图片描述

 1x1卷积核降维功能

对一个深度为512的特征矩阵使用64个大小为5x5的卷积核进行卷积,不使用1x1卷积核进行降维的 话一共需要819200个参数,如果使用1x1卷积核进行降维一共需要50688个参数,明显少了很多。这是通过减小特征矩阵的深度,从而减少卷积参数。

图像分类篇:pytorch实现GoogLeNet_第1张图片

2.辅助分类器

GoogLeNet 有3个输出层,其中的两个是辅助分类层。如下图所示,网络主干右边的 两个分支 就是 辅助分类器,其结构一模一样。在训练模型时,将两个辅助分类器的损失乘以权重(论文中是0.3)加到网络的整体损失上,再进行反向传播。

辅助分类器的两个分支有什么用呢?

  • 作用一:可以把他看做inception网络中的一个小细节,它确保了即便是隐藏单元和中间层也参与了特征计算,他们也能预测图片的类别,他在inception网络中起到一种调整的效果,并且能防止网络发生过拟合。
  • 作用二:给定深度相对较大的网络,有效传播梯度反向通过所有层的能力是一个问题。通过将辅助分类器添加到这些中间层,可以期望较低阶段分类器的判别力。在训练期间,它们的损失以折扣权重(辅助分类器损失的权重是0.3)加到网络的整个损失上。

 GoogLeNet网络参数如下表所示:

图像分类篇:pytorch实现GoogLeNet_第2张图片

 

图像分类篇:pytorch实现GoogLeNet_第3张图片

对于Inception模块,所需要使用到参数有#1x1#3x3reduce#3x3#5x5reduce#5x5poolproj,这6个参数,分别对应着所使用的卷积核个数。

  • #1x1对应着分支1上1x1的卷积核个数
  • #3x3reduce对应着分支2上1x1的卷积核个数
  • #3x3对应着分支2上3x3的卷积核个数
  • #5x5reduce对应着分支3上1x1的卷积核个数
  • #5x5对应着分支3上5x5的卷积核个数
  • poolproj对应着分支4上1x1的卷积核个数。

二、在Google Colab上使用pytorch实现

数据集:花分类数据集

图像分类篇:pytorch实现GoogLeNet_第4张图片

 训练时间20分钟,结果截图:

图像分类篇:pytorch实现GoogLeNet_第5张图片

 预测图片如下右图所示,预测结果为郁金香的概率为:99.8%

 图像分类篇:pytorch实现GoogLeNet_第6张图片图像分类篇:pytorch实现GoogLeNet_第7张图片

参考博文:pytorch图像分类篇:5. GoogLeNet结构详解与模型的搭建

你可能感兴趣的:(pytorch,分类,深度学习)