CNN 发展简史

CNN 发展简史

说在前面

  • 上一篇文章中,我们详细说了CNN的主要结构组成和训练原理,今天我们来回顾一下CNN的网络模型发展史,主要学习CNN是如何被提出来?网络结构如何进化?每一次改进解决的问题?等等,这对理解网络模型有很好的帮助,并且在我的毕业设计中可以根据数据合理选取网络模型。

  • 在1998年前的CNN发展史这篇博客 http://www.lunarnai.cn/2018/07/03/Brief_history_CNN/ 已经叙述的很详尽了,有兴趣的可以看一下,基本上是如何从动物中获取灵感构建计算机的神经网络模型,下面我只阐述重大的CNN模型突破节点。

1. LeNet-5 (1998)

在这里插入图片描述

LeNet-5模型一共有7层,卷积层-池化层-卷积层-池化层-3个全连接层,为什么叫LeNet-5呢,因为当时默认卷积层包括卷积+池化,所以等价于2个卷积层+3个全连接层,一共5层。当时主要用LeNet-5进行邮件上的手写邮政编码数字识别,取得了不错的效果。

此外LeNet-5还有一些有趣的细节,一个是使用了tanh作为激活函数,这里作者表示对称的激活函数能够更快收敛,,这里不用ReLU的原因可能在于98年的时候,网络的深度还不太深,因此梯度消失不是一个太大的问题,而相比之下加速收敛的性质更加重要。

此外论文在附录对比了随机梯度下降和批梯度下降 ,指出随机梯度下降以及mini-bath SGD能够极大加快拟合速度,并且最终效果很好。

优点:这种网络当时提出来成为了CNN标准的“模板”——叠加卷积层和池化层,并以一个全连接层结束网络。

缺点:当时一段时间并未火起来,原因在于当时历史背景,这个简单的网络仅有6000多个参数,但训练起来费时且没有GPU加速,相比较于传统的SVM等算法,效率还是差了许多,所以并没有大放异彩。

2. AlexNet (2012)

  • 可以看到硬件跟不上,1998年到2012年中间十多年没有新的CNN网络提出来,但是在2006年,研究人员成功利用GPU加速了CNN,相比CPU实现快了4倍,可以说是一个大的突破,也为12年的AlexNet打下了良好的基础。

  • 原文链接:https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf ImageNet Classification with Deep Convolutional Neural Networks.

  • 相比于LeNet-5,AlexNet仅仅多堆叠了卷积层,一共有8个网络层,网络模型如下图所示:

在这里插入图片描述

这个图看上去有点费劲,转换一下就是下面这幅图:
/>

由卷积层-池化层-卷积层-池化层-3个卷积层-池化层-3个全连接层组成。整体来看除了卷积层增多了,没有大的改变。

创新点

  1. 使用ReLu激活函数,不容易发生梯度消失问题。
  2. 对输入的数据进行了数据增强处理。(水平变换、光照增强、随机裁剪、平移变换等等)
  3. 首次使用Dropout防止过拟合。
  4. 采用两块GPU并行计算,最上面那张图就是每一层分两块进行计算,所以看着比较繁琐,这里也是由于GPU不是很好,所以要两块并行。

3. VGG (2014)

  • 原文链接:https://arxiv.org/pdf/1409.1556.pdf VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION.

  • VGG 提出了几种网络模型分别是 VGG13、VGG16、VGG19,他们的网络结构如下图所示:

    相比AlexNet,仅仅是堆叠了更多的卷积层、池化层,整体来看和文章名字一样Very Deep。下图是VGG19的具体结构图:

在VGG中也是引入了1×1的卷积核,可以改变输出的维度。

4. GoogLeNet (2015)

  • 论文链接:https://arxiv.org/pdf/1409.4842.pdf Going deeper with convolutions.

  • GoogLeNet (网络没有最深,只有更深),这里名字起的很好,致敬了LeNet,这真的只是巧合吗???GoogLeNet 引入了新的网络结构Inception-v1,也是“Network in Network”,(Inception得名于2010年由莱昂纳多·迪卡普里奥主演的科幻电影《盗梦空间》)。

  • Inception的网络模型如下图所示:

使用不同的卷积并行拓扑结构,然后进行连接,获得1×1、3×3、5×5卷积提取的不同特征,然后对他们进行归并融合;采用1×1的卷积进行降维,消除计算瓶颈,作者还引入了两个辅助分类器,使分类器在较浅层的网络也进行识别,增加反向传播的梯度信息。

5. ResNet (2015)

  • 论文链接:https://arxiv.org/pdf/1512.03385.pdf Deep Residual Learning for Image Recognition.

  • ResNet 叫深度残差网络,是由中国广东的何凯明大神在2015年CVPR上提出来的,并且一经出世,就在ImageNet中斩获图像分类、检测、定位三项冠军!这篇论文的影响力可以说是非常巨大,后面的几乎所有的CNN论文都引用的这篇ResNet。(我的毕业设计也采用的ResNet网络模型);这篇论文也是突破了一个瓶颈,解决了CNN网络深度的重大问题(稍后解释),总之,我觉得这篇论文的影响力十分巨大,相比之前CNN模型的进化(仅仅是网络深度),ResNet是质的改变!

  • ResNet提出前发现的问题?

    在之前的经验来看,从LeNet到AlexNet再到VGG、GoogLeNet,网络深度不断增加,模型性能越来越好,那么就想:是否网络深度不断增加,性能会一直增加?但实验结果发现,深度网络中存在着退化问题,如下图所示:56层的网络比20层的网络训练效果还差
    在这里插入图片描述

    这种情况并不是发生了过拟合,过拟合是训练误差小而测试误差大,而上面的图片显示训练误差和测试误差56层的网络都大。

  • 造成这样不符合常理的现象原因是?

    随着网络深度的增加,反向传播的梯度也在逐渐减小,这就是所谓的梯度消失现象,网络越深,反向传播的梯度会越来越小,导致梯度下降更慢,浅层的网络不能够更新梯度,训练没有突破。

  • 解决办法?——“short cut” or “skip connection” or “resNet”

    话不多说直接上图,ResNet提出了一种新的结构解决了上述梯度消失的问题,下面是基本结构单元:

    在正常的卷积层旁边加了一条短接线short cut,也就是常说的skip connection,假设正常卷积层输出是F(x),旁边输出是x,则最终两条路线相加为h(x) = F(x) + x,得到的h(x)再传到下一层,当反向传播时,下面来自深层网络传回来的梯度假设为1,经过一个加法门,通过短接线传到上面的梯度也为1,这样就可以将深层的梯度直接畅通无阻地传到上一层,使得浅层地网络参数得到训练,解决了梯度消失的问题。

  • 下面是与VGG的网络结构对比图
    在这里插入图片描述

    这里说明一下ResNet中的虚线和实线的区别:实际上ResNet有两个基本的block,一个是Identity Block输入和输出的维度是一样的,也就是实线所表示的,它可以串联多个;另外一个block是Conv Block,输入和输出的维度是不一样的,所以不能直接串联,要在短接线处加一个1×1的卷积层,改变维度使得两条路径的维度一致。(随着网络深度增加,channel也增加)具体的结构如下图所示:

  • 这样作者通过构建不同卷积核的个数,以及组合模式,给出了以下几种ResNet的结构模型:
    在这里插入图片描述

  • ResNet特点:残差网络在模型表征方面并不存在直接的优势,ResNets并不能更好的表征某一方面的特征,但是ResNets允许逐层深入地表征更多的模型。

    残差网络使得前馈式/反向传播算法非常顺利进行,在极大程度上,残差网络使得优化较深层模型更为简单。

    “shortcut”快捷连接添加既不产生额外的参数,也不会增加计算的复杂度。快捷连接简单的执行身份映射,并将它们的输出添加到叠加层的输出。通过反向传播的SGD,整个网络仍然可以被训练成终端到端的形式。


以上是我目前了解到的网络模型,下面的网络模型是近几年的,也分别给出了论文和解析链接:

6. Xception (2016)

7. Inception-ResNet-v2 (2016)

8. ResNeXt-50 (2017)

9. Inception v1 - v4 Inception-ResNet

结尾

  • 以上就是CNN的网络模型发展史,后面的几个模型我也没有深入研究,因为我做的毕业设计就是用的ResNet,所以后面会重点说ResNet的实现过程。
  • 其次一些目标检测的模型在这里没有提及,比如Fast-RCNN、SSD、YOLO V1-V3等等,后期会专门介绍一篇目标检测的框架算法进化史。
  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 以下是一些使用Go语言编写的神经网络框架的推荐: 1. Gorgonia:Gorgonia是一个基于Go语言的神经网络和机器学习库。它提供了一系列的机器学习工具和数据结构,包括张量操作,自动微分和梯度下降优化算法等。 2. Tensorflow Go:Tensorflow Go是Google的TensorFlow机器学习框架的Go语言版本。它提供了一组强大的API,用于构建和训练神经网络,支持CPU和GPU加速。 3. Golearn:Golearn是一个Go语言实现的机器学习库,它包括了许多常用的机器学习算法,如决策树、随机森林、K近邻等。它还支持将数据导入和导出到多种格式,如CSV、ARFF等。 4. NeuroGo:NeuroGo是一个轻量级的Go语言神经网络库,它支持前馈神经网络卷积神经网络等模型,并提供了各种激活函数、损失函数和优化器。 5. Skynet:Skynet是一个基于Go语言的深度学习框架,它支持多种类型的神经网络模型,并提供了灵活的自定义选项和高效的并行计算能力。 这些框架都具有各自的优缺点和适用范围,你可以根据自己的需要选择合适的框架来进行开发。 ### 回答2: 有以下几个基于Go语言编写的神经网络框架可以推荐: 1. TensorFlow:虽然TensorFlow主要使用Python编写,并且提供了对Go的支持,但目前Go的API还比较有限。它是目前最流行的深度学习框架之一,提供了高效的计算图和自动微分等功能。 2. Gorgonia:Gorgonia是一个功能强大的深度学习库,基于Theano和Torch等框架的思想。它提供了对Go语言友好的API,可以用于构建和训练神经网络模型。 3. GoNN:GoNN是一个轻量级的神经网络库,它提供了简单易用的API,适合初学者和对性能要求不高的应用场景。GoNN支持各种常见类型的层和优化器。 4. Golearn:Golearn是一个用于机器学习的Go语言库,它包含了一些神经网络算法的实现,如多层感知机(MLP)和卷积神经网络(CNN),可以用于分类、回归等任务。 这些神经网络框架在Go语言生态系统中的使用还相对较新,并且相对于Python等主流语言,Go语言在机器学习和深度学习领域的生态还在发展中。但由于Go语言本身的并发性和性能优势,上述框架在一些特定领域的应用中可能具有一定的优势。 ### 回答3: 以下是几个使用Go语言编写的神经网络框架的推荐: 1. Gorgonia:Gorgonia是一个强大的神经网络和机器学习库,它提供了许多用于构建和训练神经网络的工具和函数。该框架具有图计算的能力,可以进行自动微分,并支持GPU加速。Gorgonia还提供了一种易于使用的API和丰富的文档。 2. GoNN:GoNN是一个轻量级的神经网络库,适用于处理各种机器学习任务。该框架提供了各种类型的神经网络层(如全连接层、卷积层等),并且具有可配置的参数和超参数,可以方便地进行模型的构建和训练。 3. Golearn:Golearn是一个用于机器学习和数据挖掘的库,它提供了用于构建和训练神经网络的工具。该框架支持各种常见的机器学习任务,如分类、回归和聚类等,并提供了丰富的特征工程和模型评估的功能。 这些框架都是用Go语言编写的,具有简洁的API和丰富的功能,能够帮助开发者轻松构建和训练神经网络模型。无论是初学者还是有经验的开发者都可以从中受益。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值