InceptionV1笔记整理

论文链接:https://arxiv.org/abs/1409.4842
年份:2015
会议/期刊:CVPR

GoogLeNet的参数是AlexNet的1/12,但是精度上却更高。受到Network in Network和Provable bounds for learning some deep representations的启发,作者提出了一种称之为Inception的网络结构, 主要是提高了网络内计算资源的利用率。


目录

1. Motivation and High Level Considerations
2. Architectural Details
3. GoogLeNet
4. Training Methodology


1. Motivation and High Level Considerations

提升深度网络的表现最直接的方式就是增加网络的size,这里的包括网络深度depth(网络层数)网络的宽度width(每一层的神经元数)。作者认为这会带来两个主要问题:

  1. 模型的参数过多,容易过拟合,尤其是在训练集数量有限的情况下
  2. 对计算资源的需求暴增,比如,如果两个卷积层相连,任何增加卷积核的行为将导致计算量以二次方的倍数增加,如果增加的容量没有被有效利用(例如,大多数权值趋于0),就会造成计算资源的浪费。

针对这两个问题的解决思路:使用稀疏连接结构代替全连接结构

  • Arora的开创性工作:根据特征和输出聚类之间的相关性逐层进行学习,得到最优网络结构
  • Hebbian原理:“neurons that fire together, wire together”

但是,现在的计算硬件能力在处理大量的非均匀(non-uniform)的稀疏数据结构时,是非常低效的

这不是把两头堵死了吗?所以,他们就想有没有一种办法,它既可以即使在filter-level也可以充分利用额外的稀疏性(extra sparsity),又能通过计算密集矩阵(dense matrices)使得现有的硬件发挥最大性能

Inception架构一开始是作为一个实现估计一个复杂网络的拓扑结构假设输出的学习例子,它尝试接近Arora提出的稀疏结构并用密集且简单现有的组件(dense, readily available components)来覆盖假设结果。

仅仅两轮迭代后,就能看到不错的结果,最终建立起了Inception结构。【PS:结果的改善是否归因于Inception结构的设计原则是值得深究的】


2. Architectural Details

"... is based on finding out how an optimal local sparse structure in a convolutional vision network can be approximated and covered by readily available dense components..."

再次重申,Inception的主要思想就是在卷积视觉网络中如何逼近最优局部稀疏结构,并由现有的密集计算工具(卷积)实现.

naive inception module
  • 参考Network in Network的文章,使用1x1卷积可以实现多个feature map的线性组合。
  • 同时,也希望获得更多更大的空间上的信息,所以加入3x3和5x5的卷积核。
  • Pooling层是CNN中必要的结构,所以也加进来。
    到此,我们就有了一个naive版本的Inception模块了。
Inception module with dimension reductions

如果直接使用naive版本的话,越到后面堆积的层越多,参数越多,非常低效,所以想到使用1x1卷积进行降维和投影。

可是,先卷积后降维会破坏特征图的稀疏性,因为降维是一个信息压缩的过程,一种密集性的信息表达方式,难以建模,所以采用了先降维后卷积的思路。

import torch
import torch.nn as nn
import torch.nn.functional as F

class BasicConv2d(nn.Module):
    def __init__(self, in_channels, out_channels, **kwargs):
        super(BasicConv2d, self).__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, bias=False, **kwargs)

    def forward(self, x):
        x = self.conv(x)
        return F.relu(x, inplace=True)

class Inception(nn.Module):
    def __init__(self, in_channels, pool_features, conv_block=None):
        super(Inception, self).__init__()
        if conv_block is None:
            conv_block = BasicConv2d

        self.branch1x1 = conv_block(in_channels, 64, kernel_size=1)

        self.branch3x3_1 = conv_block(in_channels, 96, kernel_size=1)
        self.branch3x3_2 = conv_block(96, 128, kernel_size=3, padding=1)
        
        self.branch5x5_1 = conv_block(in_channels, 16, kernel_size=1)
        self.branch5x5_2 = conv_block(16, 32, kernel_size=5, padding=1)

        self.branch_pool = conv_block(in_channels, pool_features, kernel_size=1)

    def _forward(self, x):
        branch1x1 = self.branch1x1(x)

        branch3x3 = self.branch3x3_1(x)
        branch3x3 = self.branch3x3_2(branch3x3)

        branch5x5 = self.branch5x5_1(x)
        branch5x5 = self.branch5x5_2(branch5x5)

        branch_pool = F.max_pool2d(x, kernel_size=3, stride=1, padding=1)
        branch_pool = self.branch_pool(branch_pool)

        outputs = [branch1x1, branch3x3, branch5x5, branch_pool]
        return outputs

    def forward(self, x):
        outputs = self._forward(x)
        return torch.cat(outputs, dim=1)

3. GoogLeNet


整个GoogLeNet总共22层(不含没有参数的层)

  • 图片大小:224 x 224 x 3(3代表RGB通道),减去均值
  • 所有卷积层(包括为了降维所使用的的1x1卷积层)都紧接着ReLU激活函数
  • 第一层将输入图像的边长减半,第二层再次将输入边长减半,即此层输出为原始输入图像的1/4,降低了计算量。
  • LRN层将前两层的输出进行归一化,使每个特征层更专一化,能够获取更广泛的特征,具有更高的泛化度。(之后被Batch Normal层替代了)
  • 9个Inception module,在第二个Inception module之后,第七个Inception module之后,各有两个步长为2的最大池化层,为了降低计算量、为网络提速
  • 使用平均池化层(avgpool)代替全连接层(FC)
  • 考虑到网络越深,反向传播会变得困难,分别在Inception 4a和Inception 4d增加辅助分类输出(auxiliary classifier)
    1. 增强底层分类器的discrimination
    2. 增强梯度信号
    3. 使用额外的正则化
    4. 训练时的loss权重为0.3

4. Training Methodology

  • DistBelief
  • 优化方法: SGD with 0.9 momentum
  • 学习率: 每8个epoch降低4%
  • Polyak averaging(用在作inference阶段)
  • 图像增强
    1. 图像各种尺寸patch的采样,这些patch的size平均分布在图像区域的8%-100%, 宽高比3:4或4:3
    2. photometric distortions(设置参数contrast, brightness 和color,调节光照变化,防止over-fitting)
    3. random interpolation methods随机插值法

Reference

  1. Going Deeper with Convolutions(Inception v1)笔记
  2. Inception V1,V2,V3,V4 模型总结

你可能感兴趣的:(InceptionV1笔记整理)