深度学习图像分类(二):AlexNet

更新时间:2023-06-09 11:42:04 阅读: 评论:0

深度学习图像分类(⼆):AlexNet
深度学习图像分类(⼆):AlexNet
⽂章⽬录
前⾔
2012年,Alex Krizhevsky、Ilya Sutskever在多伦多⼤学Geoff Hinton的实验室设计出了⼀个深层的卷积神经⽹络AlexNet,夺得了2012年ImageNet LSVRC的冠军,且准确率远超第⼆名(top5错误率为15.3%,第⼆名为26.2%),引起了很⼤的轰动。AlexNet可以说是具有历史意义的⼀个⽹络结构,在此之前,深度学习已经沉寂了很长时间,⾃2012年AlexNet诞⽣之后,后⾯的ImageNet冠军都是⽤卷积神经⽹络(CNN)来做的,并且层次越来越深,使得CNN成为在图像识别分类的核⼼算法模型,带来了深度学习的⼤爆发。
⼩tips: Alex并没有给⾃⼰的⽹络起名字,所以后⼈为了⽅便将这个⽹络成为AlexNet。同学们如果不想让别⼈给⾃⼰的⽹络起名字,写论⽂的时候记得起个名字~
⼀、AlexNet理论
AlexNet其实跟LeNet很像很像,⼏乎可以说是LeNet的升级版,都是有卷积和全连接组成。AlexNet之所以能够成功,跟这个模型设计的特点有关,主要有:
使⽤了⾮线性激活函数:ReLU
随机失活:Dropout
数据扩充:Data augmentation
其他:多GPU实现,LRN归⼀化层的使⽤
1. 激活函数:ReLU
传统的神经⽹络普遍使⽤Sigmoid或者tanh等⾮线性函数作为激励函数,然⽽它们容易出现梯度弥散或梯度饱和的情况。以Sigmoid函数为例,如下图所⽰,当输⼊的值⾮常⼤或者⾮常⼩的时候,这些神经元的梯度接近于0(梯度饱和现象),如果输⼊的初始值很⼤的话,梯度在反向传播时因为需要乘上⼀个Sigmoid导数,会造成梯度越来越⼩,导致⽹络变的很难学习。
relu函数直到现在也是学术界和⼯业界公认的最好⽤的激活函数之⼀,在各个不同领域不同模型下的使⽤⾮常之多。
牛肉丸的做法2. 随机失活:Dropout
女友闺蜜
引⼊Dropout主要是为了防⽌⽹络在训练过程中由于参数冗余出现的过拟合现象。在神经⽹络中Dropout通过修改神经⽹络本⾝结构来实现,对于某⼀层的神经元,通过定义的概率将神经元置为0,这个神经元就不参与前向和后向传播,就如同在⽹络中被删除了⼀样,同时保持输⼊层与输出层神经元的个数不变,然后按照神经⽹络的学习⽅法进⾏参数更新。在下⼀次迭代中,⼜重新随机删除⼀些神经元(置为0),直⾄训练结束。
3. 数据扩充:Data augmentation
由于神经⽹络算法是基于数据驱动的,因此,有⼀种观点认为神经⽹络是靠数据喂出来的,如果能够增加训练数据,提供海量数据进⾏训练,则能够有效提升算法的准确率,因为这样可以避免过拟合,
从⽽可以进⼀步增⼤、加深⽹络结构。⽽当训练数据有限时,可以通过⼀些变换从已有的训练数据集中⽣成⼀些新的数据,以快速地扩充训练数据。
其中,最简单、通⽤的图像数据变形的⽅式:⽔平翻转图像,从原始图像中随机裁剪、平移变换,颜⾊、光照变换,如下图所⽰:
数据增⼴确实是提升模型的有效⼿段,⽽且最近的增⼴⽅式也不仅限于这种随即裁剪,也可以使⽤⽣成对抗⽹络进⾏图像⽣成来达到图像增⼴的⽬的。
4. 多GPU实现
AlexNet当时使⽤了GTX580的GPU进⾏训练,由于单个GTX 580 GPU只有3GB内存,这限制了在其上训练的⽹络的最⼤规模,因此他们在每个GPU中放置⼀半核(或神经元),将⽹络分布在两个GPU上进⾏并⾏计算,⼤⼤加快了AlexNet的训练速度。
5. 局部响应归⼀化(LRN)
Local Respon Normalization(LRN)技术主要是深度学习训练时的⼀种提⾼准确度的技术⽅法。LRN⼀般是在激活、池化后进⾏的⼀种处理⽅法。LRN归⼀化技术⾸次在AlexNet模型中提出这个概念。通过实验确实证明它可以提⾼模型的泛化能⼒,但是提升的很少,以⾄于后⾯不再使⽤,甚⾄有⼈觉得它是⼀个“伪命题”,因⽽它饱受争议。现在基本上已经被Batch Normalization代替。
因此,这⾥简单介绍⼀下:
配方法的步骤局部归⼀化的灵感来源
在神经⽣物学中,有⼀个概念叫做侧抑制(lateral inhibitio ),指的是被激活的神经元会抑制它周围的神经元,⽽归⼀化(normalization)的的⽬的不就是“抑制”吗,两者不谋⽽合,这就是局部归⼀化的动机,它就是借鉴“侧抑制”的思想来实现局部抑制,当我们使⽤RELU损失函数的时候,这种局部抑
制显得很有效果。
归⼀化的好处
(1)为了后⾯数据处理的⽅便,归⼀化的确可以避免⼀些不必要的数值问题。
(2)为了程序运⾏时收敛加快。
(3)同⼀量纲。样本数据的评价标准不⼀样,需要对其量纲化,统⼀评价标准。这算是应⽤层⾯的需求。
(4)避免神经元饱和。就是当神经元的激活在接近0或者1时会饱和,在这些区域,梯度⼏乎为0,这样,在反向传播过程中,局部梯度就会接近0,这会有效地“杀死”梯度。
(5)保证输出数据中数值⼩的不被吞⾷。
实验总结
由于LRN模仿⽣物神经系统的侧抑制机制,对局部神经元的活动创建竞争机制,使得响应⽐较⼤的值会更⼤,提⾼了模型的泛化能
⼒,Hinton在ImageNet中的实验准确率分别提升了1.4%和1.2%。
⼆、 AlexNet代码
这⾥给出模型搭建的python代码(基于pytorch实现)。完整的代码是基于图像分类问题的(包括训练和推理脚本,⾃定义层等)详见我的GitHub:
ps:⾥⾯还有其他经典模型的代码复现,希望对⼤家有⽤
from turtle import forward
import torch
as nn
from custom_layers.CustomLayers import ConvActivation
# 由于分类层结构是全连接,因此限制模型输⼊的图像⼤⼩为224*224
# 卷积后特征图尺⼨不变的常⽤参数组合:(K=7,s=1,p=3)(K=5,s=1,p=2)(K=3,s=1,p=1)
class AlexNet(nn.Module):
def__init__(lf, num_class, input_channels=3, init_weights =True):
super().__init__()
lf.features = nn.Sequential(
# in[3,224,224] ==> out[48,55,55] ==> out[48,27,27]
ConvActivation(input_channels=input_channels, output_channels=48, kernel_size=11, stride=4, padding=2),            nn.MaxPool2d(kernel_size=3, stride=2),
# in[128,27,27] ==> out[128,27,27] ==> out[128,13,13]
ConvActivation(input_channels=48, output_channels=128, kernel_size=5, padding=2),
nn.MaxPool2d(kernel_size=3, stride=2),
# in[128,13,13] ==> out[192,13,13]
ConvActivation(input_channels=128, output_channels=192, kernel_size=3, padding=1),
# in[192,13,13] ==> out[192,13,13]
有志者事竟成英语
ConvActivation(input_channels=192, output_channels=192, kernel_size=3, padding=1),
# in[192,13,13] ==> out[128,13,13] ==> out[128,6,6]
ConvActivation(input_channels=192, output_channels=128, kernel_size=3, padding=1),
nn.MaxPool2d(kernel_size=3, stride=2)
)
上下相随lf.classifier = nn.Sequential(
nn.Dropout(p=0.5),
nn.Linear(128*6*6,2048),
nn.ReLU(True),
nn.Dropout(p=0.4),
nn.Linear(2048,2048),
nn.ReLU(True),
nn.Linear(2048, num_class)
)
if init_weights:
lf._initialize_weights()
def_initialize_weights(lf):
for m dules():
80年属啥if isinstance(m, nn.Conv2d):
nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
if m.bias is not None:
stant_(m.bias,0)
千年古屋
elif isinstance(m, nn.Linear):
al_(m.weight,0,0.01)
stant_(m.bias,0)
善辩
def forward(lf, x):
asrt x.shape[2]==224and x.shape[3]==224," input images size should be 224*224 "
x = lf.features(x)
x = torch.flatten(x, start_dim=1)
x = lf.classifier(x)
return x
⼩结
AelxNet可以说掀起了⼈⼯智能的第三次浪潮:深度学习的时代。其历史影响深远。
虽然⾥⾯的技术在现在看来没什么创新点,但是放在当时,其性能也甩了其他算法好⼏条街。

本文发布于:2023-06-09 11:42:04,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1030558.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   训练   模型   梯度   图像   神经   局部   深度
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图