三、GoogleNet V1论文总结

三、GoogleNet V1

论文导读

相关借鉴:

1、NIN:首个采用1x1卷积核的网络,舍弃全连接层,大大减少网络参数;

2、借鉴以往的多尺度Gabor滤波器提取特征;

3、赫布理论:一起激活的神经元连接在一起;

研究意义:

1、开启多尺度卷积核时代;

2、拉开1x1卷积广泛应用序幕;

3、为GoogleNet系列开辟道路;

论文概要

  • 摘要

1、主题:提出了名为Inception的深度卷积神经网络;

2、模型特点:Inception网络提高计算资源利用率,增加网络深度和宽度时,参数少量增加;借鉴Hebbain理论和多尺度处理;

  • 网络结构

Inception模块

三、GoogleNet V1论文总结_第1张图片

特点:

1、多尺度卷积核;

2、1x1卷积降维,信息融合;

3、3x3 max pooling保留了特征图数量;

1x1卷积作用:压缩厚度,改变channel数量;

GoogLeNet结构:

三、GoogleNet V1论文总结_第2张图片

1、三个阶段:卷积-池化快速降低分辨率;堆叠Inception;FC层分类输出;

2、增加两个辅助损失,缓解梯度消失(在中间特征图添加损失函数)

稀疏结构:

稀疏矩阵:数值为0的元素数量远远多于非0元素数量,且无规律;

稠密矩阵:数值非0的元素数量远远多于为0元素的数目,且无规律;

稀疏矩阵优点:可分解成密集矩阵计算来加快收敛速度;

  • 训练技巧

辅助损失:

在Inception4b和Inception4e增加两个辅助分类层,用于计算辅助损失

作用:

1、增加Loss回传;

2、充当正则约束,迫使中间层特征也能具备分类能力;

学习率下降策略:

每8个epoch下降4%,800个epochs才下降0.016;

数据增强:

图像尺寸均分布在8%-100%之间,长宽比在[3/4,4/3]之间,最后做一些颜色变换;

  • 训练技巧

Multi crop:

1、等比例缩放短边到256、288、320、352四种尺寸;(一分为四)

2、在长边上裁剪出3个正方形,左中右或者上中下,三个位置;(一分为三)

3、四个角、中心、全局resize,六个位置;(一分为六)

3、水平镜像;(一分为二)

Model Fusion:

七个融合模型训练差异仅在图像采样方式和顺序差异;

论文总结

  • 创新点:

1、大量使用1x1卷积核,可降低维度,减少计算量,参数时AlexNet的1/12;

2、多尺度卷积核,实现多尺度特征提取;

3、辅助损失层,增加梯度回传,增加正则,减轻过拟合;

  • 启发点

1、池化损失空间分辨率,但在定位、检测和人脸姿态识别中仍应用;定位、检测和人体姿态估计这些任务中十分注重空间分辨率信息;

2、增加模型深度和宽度可有效提升性能,但容易过拟合和计算量过大;

3、为了节省内存消耗,先将分辨率降低,再堆叠使用Inception Module;

4、最后一个全连接层,是为了更方便的微调,迁移学习;

5、网络中间层特征对于分类也具有判别性;

6、学习率下降策略为每8个epochs下降4%(Loss曲线很平滑);

7、数据增强方法:尺寸8%-100%、长宽比在[3/4,4/3]、光照畸变有效;

8、随机采用差值方法可提升性能;

9、实际应用中没有必要144 crops;

论文代码

  • 训练阶段

1、辅助损失层的定义:

class InceptionAux(nn.Module):

    def __init__(self, in_channels, num_classes, conv_block=None):
        super(InceptionAux, self).__init__()
        if conv_block is None:
            conv_block = BasicConv2d
        self.conv = conv_block(in_channels, 128, kernel_size=1)

        self.fc1 = nn.Linear(2048, 1024)
        self.fc2 = nn.Linear(1024, num_classes)

    def forward(self, x):
        # aux1: N x 512 x 14 x 14, aux2: N x 528 x 14 x 14
        x = F.adaptive_avg_pool2d(x, (4, 4))
        # aux1: N x 512 x 4 x 4, aux2: N x 528 x 4 x 4
        x = self.conv(x)
        # N x 128 x 4 x 4
        x = torch.flatten(x, 1)
        # N x 2048
        x = F.relu(self.fc1(x), inplace=True)
        # N x 1024
        x = F.dropout(x, 0.7, training=self.training)
        # N x 1024
        x = self.fc2(x)
        # N x 1000 (num_classes)

        return x

2、模型结构修改,全连接层输出个数

num_ftrs = googlenet_model.fc.in_features
    googlenet_model.fc = nn.Linear(num_ftrs, num_classes)

    num_ftrs_1 = googlenet_model.aux1.fc2.in_features
    googlenet_model.aux1.fc2 = nn.Linear(num_ftrs_1, num_classes)

    num_ftrs_2 = googlenet_model.aux2.fc2.in_features
    googlenet_model.aux2.fc2 = nn.Linear(num_ftrs_2, num_classes)

3、损失函数的设定

optimizer.zero_grad()
            loss_main, aug_loss1, aug_loss2 = criterion(outputs[0], labels), criterion(outputs[1], labels), \
                                              criterion(outputs[2], labels)
            loss = loss_main + (0.3 * aug_loss1) + (0.3 * aug_loss2)
            loss.backward()

你可能感兴趣的:(计算机视觉,深度学习)