深度学习——分类之Inception v4和Inception-ResNet

深度学习——分类之Inception v4和Inception-ResNet

论文:Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning

作者:Christian Szegedy, Sergey Ioffe, Vincent Vanhoucke, Alex Alemi

ImageNet Top5错误率:3.08%

中心思想:这篇论文一口气提出了三个网络,Inception v4、Inception-ResNet v1和Inception ResNet v2,主要就是看到ResNet觉得挺好,就拿来和Inception模块结合一下,加shortcut。

Inception v4

作者称,由于历史的原因,Inception v3继承了太多的历史包袱,看起来过于复杂(是的= =),所以设计并非最优的,技术上的限制主要是为了模型能在DistBelief进行分布式训练,做了让步,而现在迁移到Tensorflow了(论文顺便给Tensorflow打了一波广告),所以去掉不必要的历史包袱,做一个简单一致的网络设计,所以有了Inception v4:



Inception-ResNet

然后又引入了residual connection直连,把Inception和ResNet结合起来,让网络又宽又深,提除了两个版本:

  • Inception-ResNet v1:Inception加ResNet,计算量和Inception v3相当,较小的模型
  • Inception-ResNet v2:Inception加ResNet,计算量和Inception v4相当,较大的模型,当然准确率也更高

结合了residual connection的Inception模块类似如下:



整体的的网络结构如下:



Residual Connection

作者重新研究了下residual connection的作用,指出residual connection并不会明显提升模型精度,而是会加快训练收敛:

Although the residual version converges faster, the final accuracy seems to mainly depend on the model size.

另外,引入了residual connection以后,网络太深了不稳定,不太好训练,到后面可能全变为0了,而通过引入scale,如下图所示,下图的Inception框可以用任意其它sub-network替代,输出乘以一个很小的缩放系数,通常0.1左右,再相加再激活:



代码展示得更加清晰:

def forward(self, x):
    out = self.conv2d(x)  # 这里可以是卷积层、可以是Inception模块等任意sub-network
    out = out * self.scale + x  # 乘以一个比例系数再相加
    out = self.relu(out)
    return out

引入scale可以解决这个问题,并且进入scale以后,并不会降低精度还能使得网络更加稳定。

总结

ResNet和Inception各有各的优点,ResNet的网络结构很规整简单,Inception则更复杂一点,一个更深,一个更宽。

本文贴的结果如下,仅供参考:



实际上从这里(强烈安利,pretrained-models.pytorch这个github项目,提供了各种预训练好的PyTorch模型)的PyTorch实现结果来看,模型在ImageNet上的Top1准确率如下:

  • Inception-ResNet v2 80.2
  • Inception v4 80.1
  • ResNet152 78.4
  • Inception v3 77.3
  • ResNet101 77.4
  • ResNet50 76.0

Inception-ResNet v2、ResNet152和Inception v4模型规模差不多,v4略小,Inception v3和ResNet50模型规模相当。

作者在论文里面称

the step time of Inception-v4 proved to be significantly slower in practice, probably due to the larger numberof layers.

我的实际使用经验也符合significantly slower的描述,所以我一般使用ResNet50作为base model,精度和Inception v3相当,并且有些场合更加灵活,如果最求更强大的base model更高的准确率,再用Inception-ResNet v2。

Inception从v1、v2(作者在这篇论文又将BN-Inception称之为v2,应该是更明确的划分)、v3到v4的不断演进,做了大量的实验,对于深度网络基础设施建设做了很大贡献,包括Inception模块、Batch Normalization、卷积分解以及和ResNet结合。

编辑于 2018-01-12

文章被以下专栏收录