经典的CNN模型架构-LeNet、AlexNet、VGG、GoogleLeNet、ResNet

作者:微尘,上海交大应用数学专业

知乎ID:微尘,感兴趣的朋友可以关注

本文将引入 ImageNet图像数据库,并介绍以下几种经典的CNN模型架构:LeNet、AlexNet、VGG、GoogleLeNet、ResNet

1.ImageNet介绍

ImageNet是一个包含超过1500万幅手工标记的高分辨率图像的数据库,大约有22000个类别。该数据 WordNet库组织类似于的层次结构,其中每个领域叫同义词集合。每个同义词集合都是 ImageNet层次结构中的一个节点。每个节点都包含超过500幅图像。

ImageNet大规模视觉识别挑战赛(ILSVRC)成立于2010年,旨在提高大规模目标检测图像分类的最新技术。

在对 ImageNet概览之后,我们现在来看看不同的CNN模型架构。

2.LeNet

图1

2010年,在 ImageNet挑战赛也称为 ILSVRC2010)中出现了一个CNN架构—— LeNet5,由 Yann Lecun创建。该网络以一个32×32的图像作为输入,然后进入卷积层(C1),接着进入子采样层(S2),目前子采样层被池化层取代。然后是另一个卷积层序列(C3),跟着是一个池化层(即子采样层)(S4)最后,有三个全连接层,包括最后的输出层(OUTPUT)。该网络用于邮局的邮政编码识别。从那以后,在这个比赛的助力下,每年都会引入不同的CNN架构。LeNet5网络架构如图1所示。我们可以得出以下几点:

网络输入是一个32×32的灰度图像。实现的架构是CONY层,其次是池化层和一个全连接层。CONY层滤波器大小是5×5,步长为1

3. AlexNet架构

CNN架构的第一次突破发生在2012年。获奖的CNN架构名叫 AlexNet。它是由多伦多大学的 Alex Krizhevsky和他的教授 Jeffry Hinton开发.

在第一次运行中,该网络使用ReLU激活函数和0.5概率的 dropout来对抗过拟合。如图2所示,架构中使用了一个标准化层,但是由于该网络使用了大量的数据增强,因此在实践中不再使用该标准化层。虽然有更精确的网络可用,但由于 AlexNet相对简单的网络结构和较小的深度, AlexNet在今天仍然广泛使用。比如计算机视觉

图2

可能由于当时GPU连接间的处理限制, AlexNet使用两个单独的GPU在 ImageNet数据库上执行训练,如图3所示。

图3

基于 AlexNet的交通标志分类器

在本例中,我们将使用迁移学习进行特征提取,并基于一个德国交通标志数据集开发一个分类器。

这里所用的 AlexNetMichael是由 Guerzhoy和 Davi Frossard实现的, AlexNet权重来自伯克利视觉学习中心。完整的代码和数据集可以从这里下载。AlexNet所需的图像大小是227×227×3像素,而交通标志图像大小是32×32×3像素。为了将交通标志图像输入 Alex Net,我们需要将图像尺寸调整到 AlexNet期望的大小,即227x227×3,代码如下


1original_image=tf.placeholder(tf float32,(None,32,32,3))
2 resized_image=tf.image. resize_images(original_imag,(227,227))


我们可以借助 TensorFlow的tf.image. resize_images方法来做到这一点。

这里的另一个问题是, AlexNet是在 ImageNet数据集上进行训练的,该数据集有1000类图像。因此,我们将用一个包含43个神经元的分类层来代替这个层。为此,计算出最后一个全连接层的输出大小,因为全连接层是一个2D形状,所以最后一个元素是输出的大小。fc7.get_shape.as_list()[-1]可以做到。最后将此数据与交通标志数据集的类别数量结合起来,可以得到最终全连接层的形状: shape=(getshape.aslist[-],43)。如下代码是在 TensorFlow中定义全连接层的标准方法。最后,使用 softmax计算概率大小:

1#Refer AlexNet implementation code, returns last fully connected layer
2fc7 = AlexNet(resized, feature_extract=True)
3shape = (fc7.get_shape().as_list()[-1], 43)
4fc8_weight = tf.Variable(tf.truncated_normal(shape, stddev=1e-2))
5fc8_b = tf.Variable(tf.zeros(43))
6logits = tf.nn.xw_plus_b(fc7, fc8_weight, fc8_b)
7probs = tf.nn.softmax(logits)

4 .VGGNet架构

2014年 ImageNet挑战赛的亚军是来自牛津大学视觉几何团队的VGGNet.这个卷积网络是一个简单而优雅的架构,只有7.3%的误差率。它有两个版本:VGG16和 VGG19.

VGG16是一个16层的神经网络,不包括最大池化层和 softmax层。因此被称为VGG16。VGG19由19个层组成,在 Keras中, Theano和 TensorFlow后端都有一个预先训练好的模型。

这里的关键设计考虑是深度。基于所有层中大小为3x3的卷积滤波器,可以通过添加更多的卷积层来增加网络深度。这个模型的输入图像的默认大小是224×224×3。图像以步长1、填充值1通过一系列卷积层。整个网络中的卷积大小都是3×3。最大池化层以步长2通过2×2的窗口滑动,然后是另一个卷积层,后面是三个全连接层。前两个全连接层各有4096个神经元,第三个全连接层有1000个神经元,主要负责分类。最后一层是 softmax层。VGG16使用一个较小的3×3卷积窗口,相比之下, AlexNet的11×11卷积窗口要大得多。所有隐含层构建过程都使用relu激活函数VGGNet架构如下所示:

图4

由于小的3×3卷积滤波器,使得 VGGNet深度增加。该网络的参数数量约为1.4亿个,大部分来自于第一个全连接层。在现代架构中, VGGNet的全连接层被全局平均池化(GAP)层替代,以最小化参数数量。

另一个观察结果是,滤波器的数量随着图像大小的减小而增加。

VGG16图像分类代码示例

Keras应用程序模块有预先训练的神经网络模型,以及在 ImageNet上预先训练的权重。这些模型可以直接用于预测、特征提取和调优。

①我在colab上运行的代码,先在谷歌图片上随便找一张dolphin照片下载到本地,然后通过以下代码上传照片到colab

1from google.colab import files
2
3uploaded = files.upload()

②搭建模型和训练模型、预测图片类别

 1#import VGG16 network model and other necessary libraries 
 2
 3from keras.applications.vgg16 import VGG16
 4from keras.preprocessing import image
 5from keras.applications.vgg16 import preprocess_input, decode_predictions
 6import numpy as np
 7
 8#Instantiate VGG16 and returns a vgg16 model instance 
 9vgg16_model = VGG16(weights='imagenet', include_top=False) 
10#include_top: whether to include the 3 fully-connected layers at the top of the network.
11#This has to be True for classification and False for feature extraction. Returns a model instance
12#weights:'imagenet' means model is pre-training on ImageNet data.
13model = VGG16(weights='imagenet', include_top=True)
14model.summary()
15
16#image file name to classify
17image_path = 'dol.jpg'
18#load the input image with keras helper utilities and resize the image. 
19#Default input size for this model is 224x224 pixels.
20img = image.load_img(image_path, target_size=(224, 224))
21#convert PIL (Python Image Library??) image to numpy array
22x = image.img_to_array(img)
23print (x.shape)
24
25#image is now represented by a NumPy array of shape (224, 224, 3),
26# but we need to expand the dimensions to be (1, 224, 224, 3) so we can
27# pass it through the network -- we'll also preprocess the image by
28# subtracting the mean RGB pixel intensity from the ImageNet dataset
29#Finally, we can load our Keras network and classify the image:
30
31x = np.expand_dims(x, axis=0)
32print (x.shape)
33
34preprocessed_image = preprocess_input(x)
35
36preds = model.predict(preprocessed_image)
37print('Prediction:', decode_predictions(preds, top=2)[0])

预测结果为大白鲨和虎鲨的结合,勉强过关嘿嘿嘿~

第一次执行上述代码时, Keras将自动下载并缓存架构权重到磁盘目录~/.keras/models中。这样后续的运行将更快。

5. GoogLeNet架构

在2014年 ILSVRC的中,谷歌发布了自己的网络 GoogLeNet它的性能比 VGGNet好一点, GoogLeNet的性能是6.7%,而 VGGNet的性能是7.3%(这里性能指的是误差率)。

GoogLeNet最吸引人之处在于它的运行速度非常快,主要原因是由于它引入了一个叫inception模块的新概念,从而将参数数量减少到500个,是 AlexNet的1/12。同时它的内存和功耗也都更低。

GoogLeNet有22层,所以它是一个非常深的网络。添加的层数越多,参数的数量就越多,而且网络很可能出现过拟合。同时计算量将会更大,因为滤波器的线性增加将会导致计算量的二次方增大。所以设计人员使用了 inception模块和GAP。因为后全连接层容易过拟合,因此在网络末端将使用GAP替代全连接层。GAP没有需要学习或优化的参数

5.1架构洞察

与前面架构不同, GoogLeNet设计人员没有选择特定的滤波器大小,而是将大小为1×1、3×3和5×5的所有三个滤波器和3×3的最大池化层都应用到同一个补丁中,并连接到单个输出向量中。

使用1×1的卷积会减少计算量,因为在昂贵的3×3和5×5卷积下计算量会增加。在昂贵的3×3和5×5卷积之前使用的是带有ReLU激活函数的1×1卷积。

在 GoogLeNet中, inception模块一个叠着一个这种堆叠允许我们修改每个模块而不影响后面的层。例如,你可以增加或减少任何一层的宽度。如图5所示。

图5

深度网络在反向传播过程中也会遇到所谓的梯度消失问题。通过在中间层添加辅助分类器可以避免这种情况。此外,在训练过程中,中间层的损失将乘以因子0.3计入总损失

由于全连接层容易出现过拟合,所以用GAP层来替代。平均池化不排除使用 dropout,这是一种在深度神经网络中克服过拟合正则化方法。GoogLeNet在60之后添加一个线性层和一个GAP层,通过运用转移学习技术来帮助其他层滑动自己的分类器。

5.2inception模块示例

6 .ResNet架构

一定深度后,向前反馈 convNet添加额外层会导致更高的训练误差和验证误差。性能只会随着层的增加而增加到一定深度,然后会迅速下降。在 ResNet(残差网络)论文中,作者认为这种低度拟合未必是由梯度消失问题导致的,因为当使用批处理标准化技术时也会发生这种情况。因此,他们增加了一个新的概念叫残余块。如图6所示。ResNet团队向网络中添加了可以跳过卷积层的连接

图6 残余块

提示:ResNet使用标准的convNet,并添加每次可以跳过多个卷积层的连接。每条支路都有一个残余块。

在2015年的 ImageNet ILSVRC挑战赛中,胜出的是来自微软的 ResNet,误差率为3.57%。在某种意义上, ResNet就是VGG结构反复重复后更深的网络。与 VGGNet不同, ResNet有不同的深度,比如34层、50层、101层和152层。与8层的 AlexNet、19层的 VGGNet和22层的 GoogLeNet相比, ResNet多达152层 ResNet架构是一堆残余快。

其主要思想是通过向神经网络添加连接来跳过多个层。每个残余块都有3×3的卷积层。在最后一个卷积层之后,添加一个GAP层。只有一个全连接层可以对1000个类别进行分类。ResNet有不同的深度变体,例如基于 ImageNet数据集的34、50、101和152层。对于一个较深层次的网络,比如超过50层,它将使用 bottleneck特性来提高效率。本网络不使用 dropout。

需要注意的其他网络架构包括:

  • 网络中的网络。
  • 超越ResNet
  • 分形网络,一种没有残余的超深神经网络

7小结

在这一篇文章,我们学习了不同的CNN架构。这些模型是预先训练好的已存在的模型,且在网络架构上有所不同。每个网络都是为解决特定架构的问题而设计的。所以,这里我们描述了它们的架构差异。

参考资料:

1.Practical Convolutional Neural Networks: Implement advanced deep learning models using Python Paperback 王彩霞译

2.github.com/huanghanchi/Practical-Convolutional-Neural-Networks/blob/master/Chapter04/CNN_1.py


知乎地址:https://zhuanlan.zhihu.com/p/93069133

贪心科技
贪心科技

贪心科技是国内首家AI和大数据课程为主的自适应学习平台。我们追求最精炼的AI教育内容和个人量身定制的课堂。我们鼓励大家拥有“贪心精神”:对知识不断的渴望,对现状不满希望进步的愿望。贪心科技,满足贪心的你。

理论ResNetAlexNetVGGLeNet神经网络模型优化CNN
相关数据
微软机构

微软是美国一家跨国计算机科技公司,以研发、制造、授权和提供广泛的计算机软件服务为主。总部位于美国华盛顿州的雷德蒙德,最为著名和畅销的产品为Microsoft Windows操作系统和Microsoft Office办公室软件,以及Xbox的游戏业务。微软是美国《财富》杂志2015年评选的世界500强企业排行榜中的第95名。

https://www.microsoft.com/en-us/about
池化技术

池化(Pooling)是卷积神经网络中的一个重要的概念,它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效的原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。

激活函数技术

在 计算网络中, 一个节点的激活函数定义了该节点在给定的输入或输入的集合下的输出。标准的计算机芯片电路可以看作是根据输入得到"开"(1)或"关"(0)输出的数字网络激活函数。这与神经网络中的线性感知机的行为类似。 一种函数(例如 ReLU 或 S 型函数),用于对上一层的所有输入求加权和,然后生成一个输出值(通常为非线性值),并将其传递给下一层。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

VGG技术

2014年,牛津大学提出了另一种深度卷积网络VGG-Net,它相比于AlexNet有更小的卷积核和更深的层级。AlexNet前面几层用了11×11和5×5的卷积核以在图像上获取更大的感受野,而VGG采用更小的卷积核与更深的网络提升参数效率。VGG-Net 的泛化性能较好,常用于图像特征的抽取目标检测候选框生成等。VGG最大的问题就在于参数数量,VGG-19基本上是参数量最多的卷积网络架构。VGG-Net的参数主要出现在后面两个全连接层,每一层都有4096个神经元,可想而至这之间的参数会有多么庞大。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

TensorFlow技术

TensorFlow是一个开源软件库,用于各种感知和语言理解任务的机器学习。目前被50个团队用于研究和生产许多Google商业产品,如语音识别、Gmail、Google 相册和搜索,其中许多产品曾使用过其前任软件DistBelief。

计算机视觉技术

计算机视觉(CV)是指机器感知环境的能力。这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。目标识别和面部识别也是很重要的研究领域。

LeNet技术

LeNet 诞生于 1994 年,是最早的卷积神经网络之一,并且推动了深度学习领域的发展。自从 1988 年开始,在许多次成功的迭代后,这项由 Yann LeCun 完成的开拓性成果被命名为 LeNet5。LeNet5 的架构基于这样的观点:(尤其是)图像的特征分布在整张图像上,以及带有可学习参数的卷积是一种用少量参数在多个位置上提取相似特征的有效方式。在那时候,没有 GPU 帮助训练,甚至 CPU 的速度也很慢。因此,能够保存参数以及计算过程是一个关键进展。这和将每个像素用作一个大型多层神经网络的单独输入相反。LeNet5 阐述了那些像素不应该被使用在第一层,因为图像具有很强的空间相关性,而使用图像中独立的像素作为不同的输入特征则利用不到这些相关性。

数据库技术

数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。 所谓“数据库”系以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。

最大池化技术

最大池化(max-pooling)即取局部接受域中值最大的点。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

GoogLeNet技术

同样在2014年,谷歌提出了 GoogLeNet(或Inception-v1)。该网络共有22层,且包含了非常高效的Inception模块,它同样没有如同VGG-Net那样大量使用全连接网络,因此参数量非常小。GoogLeNet最大的特点就是使用了Inception模块,它的目的是设计一种具有优良局部拓扑结构的网络,即对输入图像并行地执行多个卷积运算或池化操作,并将所有输出结果拼接为一个非常深的特征图。

过拟合技术

过拟合是指为了得到一致假设而使假设变得过度严格。避免过拟合是分类器设计中的一个核心任务。通常采用增大数据量和测试样本集的方法对分类器性能进行评价。

神经元技术

(人工)神经元是一个类比于生物神经元的数学计算模型,是神经网络的基本组成单元。 对于生物神经网络,每个神经元与其他神经元相连,当它“兴奋”时会向相连的神经元发送化学物质,从而改变这些神经元的电位;神经元的“兴奋”由其电位决定,当它的电位超过一个“阈值”(threshold)便会被激活,亦即“兴奋”。 目前最常见的神经元模型是基于1943年 Warren McCulloch 和 Walter Pitts提出的“M-P 神经元模型”。 在这个模型中,神经元通过带权重的连接接处理来自n个其他神经元的输入信号,其总输入值将与神经元的阈值进行比较,最后通过“激活函数”(activation function)产生神经元的输出。

正则化技术

当模型的复杂度增大时,训练误差会逐渐减小并趋向于0;而测试误差会先减小,达到最小值后又增大。当选择的模型复杂度过大时,过拟合现象就会发生。这样,在学习时就要防止过拟合。进行最优模型的选择,即选择复杂度适当的模型,以达到使测试误差最小的学习目的。

梯度消失问题技术

梯度消失指的是随着网络深度增加,参数的梯度范数指数式减小的现象。梯度很小,意味着参数的变化很缓慢,从而使得学习过程停滞,直到梯度变得足够大,而这通常需要指数量级的时间。这种思想至少可以追溯到 Bengio 等人 1994 年的论文:「Learning long-term dependencies with gradient descent is difficult」,目前似乎仍然是人们对深度神经网络的训练困难的偏好解释。

WordNet技术

WordNet是由普林斯顿大学心理学家、语言学家和计算机工程师联合设计的一种基于认知语言学的英语词典。它不是光把单词以字母顺序排列,而是按照单词的意义组成一个“单词的网络”。

图像分类技术

图像分类,根据各自在图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法。它利用计算机对图像进行定量分析,把图像或图像中的每个像元或区域划归为若干个类别中的某一种,以代替人的视觉判读。

堆叠技术

堆叠泛化是一种用于最小化一个或多个泛化器的泛化误差率的方法。它通过推导泛化器相对于所提供的学习集的偏差来发挥其作用。这个推导的过程包括:在第二层中将第一层的原始泛化器对部分学习集的猜测进行泛化,以及尝试对学习集的剩余部分进行猜测,并且输出正确的结果。当与多个泛化器一起使用时,堆叠泛化可以被看作是一个交叉验证的复杂版本,利用比交叉验证更为复杂的策略来组合各个泛化器。当与单个泛化器一起使用时,堆叠泛化是一种用于估计(然后纠正)泛化器的错误的方法,该泛化器已经在特定学习集上进行了训练并被询问了特定问题。

深度神经网络技术

深度神经网络(DNN)是深度学习的一种框架,它是一种具备至少一个隐层的神经网络。与浅层神经网络类似,深度神经网络也能够为复杂非线性系统提供建模,但多出的层次为模型提供了更高的抽象层次,因而提高了模型的能力。

知乎机构

作为中文互联网综合性内容平台,知乎将AI广泛应用与社区,构建了人、内容之间的多元连接,提升了社区的运转效率和用户体验。知乎通过内容生产、分发,社区治理等领域的AI应用,也创造了独有的技术优势和社区AI创新样本。

https://www.zhihu.com
目标检测技术

一般目标检测(generic object detection)的目标是根据大量预定义的类别在自然图像中确定目标实例的位置,这是计算机视觉领域最基本和最有挑战性的问题之一。近些年兴起的深度学习技术是一种可从数据中直接学习特征表示的强大方法,并已经为一般目标检测领域带来了显著的突破性进展。

迁移学习技术

迁移学习 是属于机器学习的一种研究领域。它专注于存储已有问题的解决模型,并将其利用在其他不同但相关问题上。比如说,用来辨识汽车的知识(或者是模型)也可以被用来提升识别卡车的能力。计算机领域的迁移学习和心理学常常提到的学习迁移在概念上有一定关系,但是两个领域在学术上的关系非常有限。

推荐文章
暂无评论
暂无评论~