赞
踩
经典机器学习的流水线:
传统机器学习的工作步骤可以发现,其图像特征都是机械地计算出来的,比如一张图像经过SIFT算法后就可以拿到特征数据交给模型学习如何分类。但神经网络输入的是原始像素值(或经过简单的预处理如居中缩放),图像中的哪些点能作为特征点并不是由某种算法直接决定,也就是说提取特征的方法(识别特征)也需要被学习。如下图,在神经网络的最底层,模型学习到了一些类似于传统机器学习的特征提取算法所取得的图像特征,这恰好说明特征被学习的可能性,相比于费劲心思培育出优秀的特征提取算法,我们可以将注意力放在如何优化数据集方面,这个工作交给模型去学习似乎更好。
因此两者的突破点不同,传统机器学习更注重于推出精致的特征提取算法、用优雅的理论去证明学习算法的能力。对于神经网络,从对最终模型精度的影响来说,更大或更干净的数据集、或是稍微改进的特征提取,比任何学习算法带来的进步要大得多。
所以神经网络的参数要更多,需要大量的有标签数据以及硬件资源,ImageNet数据集的诞生伴随着大数据时代来临以及GPU运算力的提升改变了神经网络发展困境。
AlexNet(2012)和LeNet(1989)的设计理念非常相似,差异主要有以下:
影响排序:对特征图规模的影响<对参数规模<<对计算规模 ,其中对特征图的规模影响微乎其微,主要体现在计算量上,越大的卷积核计算量越大。
这个系列于2014提出
用小而多的卷积核组成的模块代替大卷积核,这样感受野基本不会降低并且可以大大减少计算量,这些可复用的卷积块可以在框架中直接调用。
2014
主要改进:
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())
所做的工作如下:
相较于全连接层优点:
关于第3点,提出了一种全局平均池化的方式来替换CNN中的传统全连接层,这个思想的实现在于在最后的mlpconv层为分类任务的每个对应类别生成一个特征图。与全连接层直接作用顶部特征图不同的是,我们计算每张特征图的平均值,然后将输出的向量输送到softmax层,能够强制实现特征图(每个通道)和类别之间的对应关系,使得它更适合卷积结构。至此,特征图(每个通道)能够被轻松的转换成类别置信度。
2014
认为使用不同大小的卷积核组合是有利的
辅助分类器,为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。这两个辅助的分类器的loss应该加一个衰减系数,反向传播时靠近输入层的辅助分类器会传递给浅层权重较明显的梯度值。实际测试的时候这两个额外的softmax会被去掉。
不同大小的滤波器可以有效地识别不同范围的图像细节,最后拼接成不同尺度特征的融合
计算量大。由于块的宽度,Inception的输入会复制成4份计算。经过块后的输出通道一定大于输入通道,因为池化+1×1卷积这个路线会保留输入通道数。因此块中1×1主要用来减少通道数,从而降低模型的复杂性(通道数少了后面的3×3卷积核的通道数也变得一样少,参数减少)。
另外,除了参数减少降低模型复杂性,计算量也随着减少以外,1×1也可以直接减少运算次数,如果想要把特征厚度从128变成256,可以直接用3x3进行特征提取。但是先用1x1进行压缩到64,然后再用3x3把64channel的特征扩展成256,其实对后续的精度没有影响,而且减少了运算次数。
网络最后采用了average pooling来代替全连接层,想法来自NIN,但实际在最后还是加了一个全连接层,主要是为了方便迁移微调
基于VGG
问题
就网络层数的多少如何影响训练效果来说,在一定界限下越多的网络层数可以融合出更丰富的特征,而且参数的增多可以为拟合出更接近理想模型提供可能,但是超过这个界限继续增加网络层数可能会产生梯度弥散,它带来的负面影响大于前面的那些正面效果后使得训练效果反而越差了。
这里梯度弥散是因为广泛使用的激活函数ReLu的导数值总是<1的,当网络层数越深时,根据反向传播算法的梯度更新公式,越靠近输入层的权重更新时需要越多梯度连乘,所以值会越小造成梯度弥散,训练误差反而高。
主要改进:残差块
残差连接(跳跃连接)
网络深一点可以更好的学习训练集上数据的分布规律,但是也担心过拟合的问题,残差连接可以保证在经过网络中的某一层后的学习效果至少不会退化到比输入这一层之前差。并且一部分梯度可以通过残差连接减少中间传播给到浅层,这样减轻梯度弥散。
残差块有两种,左边恒等块,右边是卷积块,在跳跃连接过程中添加1×1卷积的主要作用是改变通道数
这里全局平均池化层输出大小不需要对应类别数量,因为后接了全连接层
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拥有更少的计算量
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。