Inception

目录

 

概述

Inception V1

Inception V2

Inception v3

Inception v4


概述

Inception是GoogleNet中的模块,它的目的是设计一种具有优良局部拓扑结构的网络,即对输入图像并行地执行多个卷积运算或池化操作,并将所有结果拼接为一个非常深地特征图。因为1 \times 13 \times 35 \times 5等不同卷积地运算与池化操作可以获得输入图像的不同信息,并行处理这些运算并结合所有结果将获得更好的图像表征。

另一方面,Inception网络是复杂的(需要大量工程工作)。它使用了大量的trick来提升性能,包括速度和准确率两方面。它的不断进化带来了多种Inception网络版本的出现。常见的版本有:

  • Inception V1
  • Inception V2和Inception V3
  • Inception V4和Inception ResNet

每个版本都是前一个版本的迭代进化。了解Inception网络的升级可以帮助我们构建自定义分类器,优化速度和准确率。不过,一般情况下,或许较低版本的Inception模块工作效果更好。

 

Inception V1

图像识别任务中存在一些问题:

  • 由于信息位置的巨大差异,为卷积操作选择合适的卷积核大小就比较困难。信息分布更全局性的图像偏好较大的卷积核,信息分布比较局部的图像偏好较小的卷积核
  • 非常深的网络更容易过拟合,将梯度更新传输到整个网络是很困难的
  • 简单地堆叠较大地卷积层非常消耗计算资源

为此,Inception模块被设计出来。Inception的思路是:在同一层级上运行具有多个尺寸的滤波器,网络本质上会变得稍微宽一些,而不是更深。

下图是”原始“的Inception模块。它使用了3个不同大小的滤波器(1 \times 13 \times 35 \times 5)对输入执行卷积操作,此外,它还会执行最大池化。所有子层的输入最后会被级联起来,并传送至下一个Inception模块。这里写图片描述

卷积神经网络需要耗费大量的计算资源,为了降低算力成本,作者在3 \times 35 \times 5卷积层之前添加了额外的1 \times 1卷积层,来限制输入信道的数量。尽管添加额外的卷积操作似乎是反直觉的,但是1 \times 1卷积比5 \times 5卷积要廉价很多,而且输入信道数量减少也有利于降低算力成本。需要注意的是,1 \times 1卷积在最大池化层之后,而不是之前。添加了这些额外的1 \times 1卷积之后,就构成了可实现降维的Inception模块:

这里写图片描述

 

使用Inception (V1)模块构建的GoogleNet:

è¿éåå¾çæè¿°

上图的GoogleNet结构中使用了9个线性堆叠的Inception模块。它有22层(包括池化层的话是27层)。该模型的在最后一个Inception模块使用全局平均池化。

这是一个深层分类器,和所有的深层网络一样,它也会遇到梯度消失问题。为了阻止该网络中间梯度的小时过程,作者引入了两个辅助分类器,它们对其中两个Inception模块的输出执行softmax操作,然后在同样的标签上使用计算辅助损失。总损失即辅助损失和真实损失的加权和。在GoogleNet的论文中,两个辅助分类器的权重值是0.3.辅助损失只是用于训练,在推断过程中并不使用。

Inception V2

Inception v2 和 Inception v3 来自同一篇论文《Rethinking the Inception Architecture for Computer Vision》。在这篇论文中,作者积极探索拓展网络的方法,旨在通过恰当的分解卷积与积极的正则化尽可能高效地利用添加的计算。

问题:

  • 减少特征的表征性瓶颈。直观上来说,当卷积不会大幅度改变输入维度时,神经网络可能会执行地更好。过多地减少维度可能会造成信息的损失,这也成为”表征性瓶颈“
  • 使用更优秀的因子分解方法,卷积才能在计算复杂度上更加高效

解决方案:

  • 5 \times 5的卷积分解为两个3 \times 3的卷积运算以提升计算速度。尽管这有点违反直觉,但是5 \times 5的卷积在计算成本上是3 \times 3卷积的2.78倍。所以叠加两个3 \times 3卷积实际上在性能上会有所提升,如下图所示:
    • 前一版Inception中的5 \times 5的卷积变成了两个3 \times 3卷积的堆叠。
  • 此外,醉着将n \times n的卷积核分解为1 \times nn \times 1两个卷积。例如,一个3 \times 3的卷积首先执行一个1 \times 3的卷积,然后执行一个3 \times 1的卷积。他们还发现这种方法在成本上要比单个3 \times 3的卷积降低33%,这一结构如下图所示:
    • 次数如果n=3,则与上一张结构图一样(同样5 \times 5的卷积可以用两个3 \times 3卷积的堆叠来代替)
  • 其次,模块中的滤波器组被扩展(即变得更宽而不是更深),以解决表征性瓶颈:​​​​​​​​​​​​​​​​​​​​​

Inception v2模块便包含了以上三中Inception模块。

 

Inception v3

问题:

  • 作者注意到辅助分类器直到训练过程快结束时才有较多贡献,那时准确率接近饱和。作者认为辅助分类器的功能时正则化,尤其是它们具备BatchNorm和Dropout操作时。
  • 是否能够改进Inception v2而无需大幅更改模块仍需调查

解决方案:

Inception v3整合了前面Inception v2中所提到的所有升级,还使用了:

  • RMSProp优化器
  • Factorized 7 \times 7卷积
  • 辅助分类器使用了BatchNorm
  • 标签平滑(添加到损失公式的一种正则项,旨在阻止网络对某一类别过分自信,即阻止过拟合)

 

Inception v4

nception v4 和 Inception -ResNet 在同一篇论文《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》中介绍。

在改论文中,研究者介绍到,Inception架构可以用很低的计算成本达到很高的性能。而在传统的网络架构中引入残差连接去到了优秀的效果,其结果与Inception v3网络当时的最新版本相近。这使得人们好奇,如果将Inception架构和残差连接起来会是什么样的效果。在这篇论文中,研究者通过研究明确地证实了,结合残差连接可以显著加速Inception地训练。也有一些证据表明残差Inception网络在相近的成本下略微超过没有残差网络的Inception网络。

 

  • 11
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Inception是一种在深度学习中广泛应用的模块,最早由GoogLeNet提出并采用。它通过并行采集不同大小的卷积核来提取输入图像的特征,并将所有输出结果拼接为一个深层的特征图。这种特征提取方式丰富了特征表示,使得网络能够学到不同尺度的特征,提高了网络的性能和灵活性。 在PyTorch中,可以使用torch.nn模块来构建Inception网络Inception网络的基本单元是一个带有1x1卷积核的Inception层,这个层由多个卷积核大小不同的子模块组成。整个网络由多个这样的Inception模块串联而成。 下面是一个使用PyTorch实现的Inception网络的示例代码: ``` class Inception(torch.nn.Module): def __init__(self, in_channels): super(Inception, self).__init__() self.conv1x1 = torch.nn.Conv2d(in_channels, 10, kernel_size=1) self.conv3x3 = torch.nn.Conv2d(in_channels, 20, kernel_size=3, padding=1) self.conv5x5 = torch.nn.Conv2d(in_channels, 30, kernel_size=5, padding=2) self.maxpool = torch.nn.MaxPool2d(kernel_size=3, stride=1, padding=1) def forward(self, x): out1 = F.relu(self.conv1x1(x)) out2 = F.relu(self.conv3x3(x)) out3 = F.relu(self.conv5x5(x)) out4 = F.relu(self.maxpool(x)) out = torch.cat((out1, out2, out3, out4), dim=1) return out class InceptionNet(torch.nn.Module): def __init__(self): super(InceptionNet, self).__init__() self.conv1 = torch.nn.Conv2d(1, 10, kernel_size=5) self.inception1 = Inception(in_channels=10) self.conv2 = torch.nn.Conv2d(88, 20, kernel_size=5) self.inception2 = Inception(in_channels=20) self.maxpool = torch.nn.MaxPool2d(2) self.fc = torch.nn.Linear(1408, 10) def forward(self, x): x = F.relu(self.maxpool(self.conv1(x))) x = self.inception1(x) x = F.relu(self.maxpool(self.conv2(x))) x = self.inception2(x) x = x.view(x.size(0), -1) out = self.fc(x) return out model = InceptionNet() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值