第3周学习:ResNet+ResNeXt

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

  • 一、ResNet
    • 1.为解决梯度消失、梯度爆炸以及退化问题
    • 2.残差网络
    • 3.参数列表
    • 4.Batch Normalization
    • 5.迁移学习
  • 二、 ResNeXt
    • 1.与ResNet对比
    • 2.借鉴VGG思想,堆叠重复结构加深网络
    • 3.组卷积思想
  • 三、 代码作业
  • 四、问题


一、ResNet

1.为解决梯度消失、梯度爆炸以及退化问题

   网络的深度对模型的性能至关重要。当增加网络层数后,网络可以进行更加复杂的特征模式的提取,获取到的图片特征信息越全,学习效果也就越好。所以当模型更深时理论上可以取得更好的结果。但是在实际的试验中发现,更深的网络其性能不一定会更好。
   一是梯度消失和梯度爆炸
梯度消失:若每一层的误差梯度小于1,反向传播时,网络越深,梯度越趋近于0
梯度爆炸:若每一层的误差梯度大于1,反向传播时,网络越深,梯度越来越大
   二是随着网络层数的增多,会带来退化问题,阻碍网络的训练。
如下图所示,随着层数的增加,预测效果反而越来越差。
第3周学习:ResNet+ResNeXt_第1张图片
   为了解决梯度消失或梯度爆炸问题,ResNet论文提出通过数据的预处理以及在网络中使用 BN(Batch Normalization)层来解决。
   为了解决深层网络中的退化问题,可以人为地让神经网络某些层跳过下一层神经元的连接,隔层相连,弱化每层之间的强联系。这种神经网络被称为 残差网络 (ResNets)。ResNet论文提出了 residual结构(残差结构)来减轻退化问题,下图是使用residual结构的卷积网络,可以看到随着网络的不断加深,效果并没有变差,而是变的更好了。
第3周学习:ResNet+ResNeXt_第2张图片

2.残差网络

第3周学习:ResNet+ResNeXt_第3张图片

BasicBlock残差网络
第一层和第三层的1× 1的卷积核的作用是对特征矩阵进行降维升维操作,降低特征矩阵的深度主要是为了减少参数的个数。
参数个数:256×256×3×3×2=1179648
第3周学习:ResNet+ResNeXt_第4张图片

Bottleneck残差网络
第一层和第三层的1× 1的卷积核的作用是对特征矩阵进行降维升维操作,主要是为了减少参数的个数。
参数个数:1×1×256×64+3×3×64×64+1×1×256×64=69632

3.参数列表

第3周学习:ResNet+ResNeXt_第5张图片

4.Batch Normalization

   我们在图像预处理过程中通常会对图像进行标准化处理,这样能够加速网络的收敛,如下图所示,对于Conv1来说输入的就是满足某一分布的特征矩阵,但对于Conv2而言输入的feature map就不一定满足某一分布规律了(注意这里所说满足某一分布规律并不是指某一个feature map的数据要满足分布规律,理论上是指整个训练样本集所对应feature map的数据要满足分布规律)。而我们Batch Normalization的目的就是使我们的feature map满足均值为0,方差为1的分布规律。
第3周学习:ResNet+ResNeXt_第6张图片

5.迁移学习

使用迁移学习的优势
(1)能够快速训练出一个理想的结果
(2)当数据集较小时也能训练出一个理想的结果
常见的迁移学习方式
(1)载入权重后训练所有参数
(2)载入权重后只训练最后基层参数
(3)载入权重后在原网络基础上再添加一层全连接层,仅训练最后一个全连接层

二、 ResNeXt

1.与ResNet对比

   ResNeXt作为ResNet的衍生算法,结合了ResNet网络卷积方法的优良特性,在此基础上增加了Cardinality对卷积过程分组,这对网络模型参数的大规模增加所带来的计算困难和网络结构复杂等弊端有良好的控制和改善。经过实验比较,与 ResNet 相比,在使用相同的参数个数下,一个 101 层的 ResNeXt 网络,和 200 层的 ResNet 准确度近似,且计算量只有后者的一半。下图为参数对比:
第3周学习:ResNet+ResNeXt_第7张图片

2.借鉴VGG思想,堆叠重复结构加深网络

第3周学习:ResNet+ResNeXt_第8张图片

3.组卷积思想

第3周学习:ResNet+ResNeXt_第9张图片

三、 代码作业

LeNet 结构


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.conv3 = nn.Conv2d(16, 32, 4)
        self.conv4 = nn.Conv2d(32, 32, 4)
        self.conv5 = nn.Conv2d(32, 32, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.fc1 = nn.Linear(32, 16)
        self.fc2 = nn.Linear(16, 2)
 
    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = self.pool(F.relu(self.conv3(x)))
        x = self.pool(F.relu(self.conv4(x)))
        x = F.relu(self.conv5(x))
        x = x.view(-1, 32)
        x = F.relu(self.fc1(x))
        x = F.softmax(self.fc2(x), dim=1)
        return x

提交结果
在这里插入图片描述

四、问题

1、Residual learning
   随着网络层数的加深,目标函数越来越容易陷入局部最优解,同时,随着层数增加,梯度消失问题更加严重,使得原理输出层的网络参数得不到有效的学习。残差网络是一种非常有效的缓解梯度消失问题网络,极大的提高了可以有效训练的网络的深度。残差单元可以以跳层连接的形式实现,即将单元的输入直接与单元输出加在一起,然后再激活。
2、Batch Normailization 的原理
   Batch Normailization就是通过归一化手段,将每层输入强行拉回均值0方差为1的标准正态分布,这样使得激活输入值分布在非线性函数梯度敏感区域,从而避免梯度消失问题,大大加快训练速度。
3、为什么分组卷积可以提升准确率?即然分组卷积可以提升准确率,同时还能降低计算量,分数数量尽量多不行吗
   分组卷积可以减少参数量。
   分组卷积可以看成是稀疏操作,有时可以在较少参数量的情况下获得更好的效果。
   当分组数量等于输入feature map数量时,输出feature map数量也等于输入feature map数量,这时分组卷积就成了Depthwise卷积,可以使参数量进一步缩减。

你可能感兴趣的:(学习,深度学习,人工智能)