当前位置:   article > 正文

图像识别经典模型的发展_图片识别模型

图片识别模型

AlexNet-神经网络超越传统机器学习的开始

经典机器学习的流水线

  1. 获取一个数据集
  2. 根据光学、几何学等数据集所在领域的知识,手工对数据集进行预处理
  3. 通过标准的特征提取算法,如SIFT 、SURF、HOG、bags of visual words得到特征数据
  4. 将上一步提取到的特征送入分类器训练

传统机器学习的工作步骤可以发现,其图像特征都是机械地计算出来的,比如一张图像经过SIFT算法后就可以拿到特征数据交给模型学习如何分类。但神经网络输入的是原始像素值(或经过简单的预处理如居中缩放),图像中的哪些点能作为特征点并不是由某种算法直接决定,也就是说提取特征的方法(识别特征)也需要被学习。如下图,在神经网络的最底层,模型学习到了一些类似于传统机器学习的特征提取算法所取得的图像特征,这恰好说明特征被学习的可能性,相比于费劲心思培育出优秀的特征提取算法,我们可以将注意力放在如何优化数据集方面,这个工作交给模型去学习似乎更好。

在这里插入图片描述

因此两者的突破点不同,传统机器学习更注重于推出精致的特征提取算法、用优雅的理论去证明学习算法的能力。对于神经网络,从对最终模型精度的影响来说,更大或更干净的数据集、或是稍微改进的特征提取,比任何学习算法带来的进步要大得多。

所以神经网络的参数要更多,需要大量的有标签数据以及硬件资源,ImageNet数据集的诞生伴随着大数据时代来临以及GPU运算力的提升改变了神经网络发展困境。

AlexNet与LeNet

AlexNet(2012)和LeNet(1989)的设计理念非常相似,差异主要有以下:

  • 第一层卷积11*11要比LeNet大很多,因为需要需要更大的卷积窗口以应对ImageNet中大像素的图像
  • 卷积通道数目是LeNet的10倍,可以提取到更丰富的特征种类
  • 激活函数替换成了ReLU。1.ReLU相比于sigmoid求幂运算更简单 2. 对参数进行初始化时,sigmoid在y值接近0和1的附近梯度值非常小,可能会使梯度下降停滞,而ReLU激活函数在正区间的梯度总是1,当然如果使用ReLU初始化时要保证参数不为负,否则会出现同样情况。ReLU更需要配合权重衰减,因为如果学习率过大或者某时刻梯度过大导致更新后的权重为负值,会进而导致w一直不会被更新。
  • 局部响应归一化
  • 使用了Dropout
  • 增加了大量的图像增强数据

VGG-深层神经网络的启发式模型

  • 同样步长和卷积核数量下,不同卷积核大小的特征图和卷积参数差别不大

影响排序:对特征图规模的影响<对参数规模<<对计算规模 ,其中对特征图的规模影响微乎其微,主要体现在计算量上,越大的卷积核计算量越大。

使用块的VGG

这个系列于2014提出

用小而多的卷积核组成的模块代替大卷积核,这样感受野基本不会降低并且可以大大减少计算量,这些可复用的卷积块可以在框架中直接调用。

NiN-网中网结构

2014

主要改进:

  1. 取消全连接层,它是引起过拟合的主要结构
  2. 使用1×1卷积,增加非线性表达、减少计算、缩放通道、输出信息更加抽象
  3. 网络的最后接一个全局平均池化层

MLPconv

1个卷积层 +( 1×1卷积层,由多个1×1卷积核堆积 )× 2

  • 缩放通道数量,对于相同大小的输入和输出,它可以减少计算量
  • 利用后接的非线性激活函数,增加非线性性质

在这里插入图片描述

def nin_block(in_channels, out_channels, kernel_size, strides, padding):
    return nn.Sequential(
        nn.Conv2d(in_channels, out_channels, kernel_size, strides, padding),
        nn.ReLU(),
        nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU(), #接激活提高非线性表达
        nn.Conv2d(out_channels, out_channels, kernel_size=1), nn.ReLU())
#-----------------------------------------------------------
net = nn.Sequential(
    nin_block(1, 96, kernel_size=11, strides=4, padding=0),
    nn.MaxPool2d(3, stride=2),
    nin_block(96, 256, kernel_size=5, strides=1, padding=2),
    nn.MaxPool2d(3, stride=2),
    nin_block(256, 384, kernel_size=3, strides=1, padding=1),
    nn.MaxPool2d(3, stride=2),
    nn.Dropout(0.5),
    # 标签类别数是10,最后一个mlpconv的输出通道数一定要和类别数量对应
    nin_block(384, 10, kernel_size=3, strides=1, padding=1),
    nn.AdaptiveAvgPool2d((1, 1)),
    # 将四维的输出转成二维的输出,其形状为(批量大小,10)
    nn.Flatten())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

全局平均池化层

所做的工作如下:

  1. 对于输入的 feature map,通道内的所有值进行平均得到一个标量输出。
  2. 对于输入 feature map 的每个通道,都执行第 1 步,得到每个通道内所有值的平均值。
  3. 将每个通道的平均值串联起来,作为输出(拉直后输出,没有再接全连接层)。与输出层相连接

相较于全连接层优点:

  1. 没有训练参数避免过拟合
  2. 不像之前的池化层那样需要移动窗口做很多次计算,所以计算量很小
  3. Global Average Pooling Layer的输出大小取决于输入的通道数量,通道数量又是由网络结构中卷积核的数量决定的,因此不依赖于输出图像的大小,可以处理不同大小的输入。

关于第3点,提出了一种全局平均池化的方式来替换CNN中的传统全连接层,这个思想的实现在于在最后的mlpconv层为分类任务的每个对应类别生成一个特征图。与全连接层直接作用顶部特征图不同的是,我们计算每张特征图的平均值,然后将输出的向量输送到softmax层,能够强制实现特征图(每个通道)和类别之间的对应关系,使得它更适合卷积结构。至此,特征图(每个通道)能够被轻松的转换成类别置信度。

GoogLeNet

2014

认为使用不同大小的卷积核组合是有利的

辅助分类器,为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。这两个辅助的分类器的loss应该加一个衰减系数,反向传播时靠近输入层的辅助分类器会传递给浅层权重较明显的梯度值。实际测试的时候这两个额外的softmax会被去掉。

Inception模块

不同大小的滤波器可以有效地识别不同范围的图像细节,最后拼接成不同尺度特征的融合

在这里插入图片描述

计算量大。由于块的宽度,Inception的输入会复制成4份计算。经过块后的输出通道一定大于输入通道,因为池化+1×1卷积这个路线会保留输入通道数。因此块中1×1主要用来减少通道数,从而降低模型的复杂性(通道数少了后面的3×3卷积核的通道数也变得一样少,参数减少)。

另外,除了参数减少降低模型复杂性,计算量也随着减少以外,1×1也可以直接减少运算次数,如果想要把特征厚度从128变成256,可以直接用3x3进行特征提取。但是先用1x1进行压缩到64,然后再用3x3把64channel的特征扩展成256,其实对后续的精度没有影响,而且减少了运算次数。

网络结构

网络最后采用了average pooling来代替全连接层,想法来自NIN,但实际在最后还是加了一个全连接层,主要是为了方便迁移微调

在这里插入图片描述

ResNet

基于VGG

问题

就网络层数的多少如何影响训练效果来说,在一定界限下越多的网络层数可以融合出更丰富的特征,而且参数的增多可以为拟合出更接近理想模型提供可能,但是超过这个界限继续增加网络层数可能会产生梯度弥散,它带来的负面影响大于前面的那些正面效果后使得训练效果反而越差了。

这里梯度弥散是因为广泛使用的激活函数ReLu的导数值总是<1的,当网络层数越深时,根据反向传播算法的梯度更新公式,越靠近输入层的权重更新时需要越多梯度连乘,所以值会越小造成梯度弥散,训练误差反而高。

主要改进:残差块

残差块

残差连接(跳跃连接)

网络深一点可以更好的学习训练集上数据的分布规律,但是也担心过拟合的问题,残差连接可以保证在经过网络中的某一层后的学习效果至少不会退化到比输入这一层之前差。并且一部分梯度可以通过残差连接减少中间传播给到浅层,这样减轻梯度弥散。

残差块有两种,左边恒等块,右边是卷积块,在跳跃连接过程中添加1×1卷积的主要作用是改变通道数

在这里插入图片描述

网络结构

在这里插入图片描述

这里全局平均池化层输出大小不需要对应类别数量,因为后接了全连接层

在这里插入图片描述

DenseNet

2017

问题

ResNet的一个最主要的优势是梯度可以流经恒等函数来到达靠前的层,但恒等映射和非线性变换输出的叠加方式是相加, 这在一定程度上破坏了网络中的信息流。

主要改进 稠密块 过渡层

稠密块

ResNet是跨层相加,输出公式:XL=HL (XL−1)+XL−1,意义是将输入变换后再加上原输入作为输出。

现在 XL=HL ([ X0,X1,XL−1]),[]代表拼接,将 X0到XL−1 层的所有输出feature map按通道并起来,意义是将之前每层的输入一起作为现在的输入进行变换。由此带来的问题是由于需要进行多次拼接操作,数据需要被复制多次,显存要求要高。

DenseBlock中各个层卷积之后均输出k个特征图,采用 k个卷积核使得得到的特征图的channel数为 k。k在DenseNet称为growth rate(增长率),是一个超参。这样做可以减少参数数量

优点

  • 特征重用,传播与预测都保留了低层次的特征
  • 实现了梯度的提前传播,减少梯度弥散和网络退化的问题

在这里插入图片描述

过渡层

结构:BN + ReLU + Conv1x1(减小通道数) + AvgPool(减小size),

在这里插入图片描述

CNN网络一般要经过Pooling或者stride>1的Conv来降低特征图的大小,而DenseNet的密集连接方式需要特征图大小保持一致。为了解决这个问题DenseNet网络中使用衔接结构Transition层,隔离开不同的稠密块,压缩的程度取决于压缩系数θ,取值范围是 (0,1]。

优点

可以使DenseNet相比ResNet拥有更少的计算量

CNN网络一般要经过Pooling或者stride>1的Conv来降低特征图的大小,而DenseNet的密集连接方式需要特征图大小保持一致。为了解决这个问题DenseNet网络中使用衔接结构Transition层,隔离开不同的稠密块,压缩的程度取决于压缩系数θ,取值范围是 (0,1]。

优点

可以使DenseNet相比ResNet拥有更少的计算量

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/151561?site
推荐阅读
相关标签
  

闽ICP备14008679号