热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析经典卷积神经网络及其实现代码

来自:https://blog.csdn.net/NNNNNNNNNNNNY/article/details/70473886

AlexNet

经典卷积神经网络介绍及实现代码
2012年,Hinton的学生Alex Krizhevsky提出了深度卷积神经网络模型AlexNet,获得当年ILSVRC(Image Large Scale Visual Recognition Challenge)比赛分类项目的冠军。

AlexNet主要使用到的新技术如下:

a) 成功使用ReLU作为CNN的**函数,并验证了其在较深网络中的有效性,解决了Sigmod在网络较深时的梯度弥散问题。
b) 训练时在最后几个全连接层使用Dropout随机忽略一部分神经元以避免模型过拟合,
c) 使用重叠的最大池化。AlexNet全部使用最大池化,避免平均池化的模糊效果;并提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠覆盖,特升了特征的丰富性。
d) 提出LRN(Local Response Normalization,局部响应归一化)层,如今已很少使用。
e) 使用CUDA加速深度卷积神经网络的训练。当初用的还是两块GRX 580 GPU,发展的好快呀。
f) 数据增强,随机从256*256的原始图像中截取224*224大小的区域作为网络输入。

整个AlexNet有5个卷积层和3个全连接层。

其参数图如下:
经典卷积神经网络介绍及实现代码
关于计算params和FLOPs的方法,参看Deep Learning for Computer Vision: Memory usage and computational considerations

使用tensorflow实现AlexNet

参考网址:https://github.com/tensorflow/models/tree/master/tutorials/image/alexnet

VGGNet

经典卷积神经网络介绍及实现代码

VGGNet结构非常简洁,其特点如下:

a) 通过反复堆叠3*3的小型卷积核和2*2的最大池化层构建。
b) VGGNet拥有5段卷积,每一段卷积网络都会将图像的边长缩小一半,但将卷积通道数翻倍:64 —>128 —>256 —>512 —>512 。这样图像的面积缩小到1/4,输出通道数变为2倍,输出tensor的总尺寸每次缩小一半。
c) 经常多个完全一样的3*3的卷积层堆叠在一起。这其实是非常有用的设计:3个3*3的卷积层串联相当于1个7*7的卷积层,即一个像素会跟周围7*7的像素产生关联,可以说感受野大小是7*7。而且前者拥有比后者更少的参数量3×3×37×7=55%3×3×37×7=55%。更重要的是,3个3*3的卷积层拥有比1个7*7的卷积层更多的线性变换(前者可以使用三次ReLU**函数),使得CNN对特征的学习能力更强。
经典卷积神经网络介绍及实现代码
d) 训练时有个小技巧:先训练级别A的简单网络,再复用A网络的权重初始化后几个复杂模型,这样训练收敛的速度更快。

使用tensorflow实现VGGNet

参考网址:https://github.com/machrisaa/tensorflow-vgg

Google Inception Net

经典卷积神经网络介绍及实现代码

具有如下特点:

a) 在控制了计算量和参数量的同时,获得了非常好的分类性能。Inception V1有22层深,但其计算量只有15亿次浮点运算,同时只有500万的参数量,即为AlexNet参数量(6000万)的1/12。为什么要降低参数量?第一,参数越多模型越庞大,(同样深度下)需要供模型学习的数据量就越大,而目前高质量的数据又很贵;第二,参数越多,耗费的计算资源也越大。Inception V1参数少但效果好的原因之一就在于其模型参数更深、表达能力更强。
b) 去除了最后的全连接层,使用1*1的卷积层来替代,这样是模型训练更快并减轻了过拟合。关于这方面可参见:为什么使用卷积层替代CNN末尾的全连接层
c) 精心设计的Inception Module(Network In Network的思想)有选择地保留不同层次的高阶特征,最大程度地丰富网络的表达能力。一般来说卷积层要提升表达能力,主要依靠增加输出通道数(副作用是计算量大和过拟合)。因为每一个输出通道对应一个滤波器,同一个滤波器共享参数只能提取一类特征,因此一个输出通道只能做一种特征处理。Inception Module一般情况下有4个分支:第一个分支为1*1卷积(性价比很高,低成本(计算量小)的跨通道特征变换,同时可以对输出通道升维和降维),第二个分支为1个1*1卷积再接分解后(factorized)的1*nn*1卷积 (Factorization into small convolutions的思想),第三个分支和第二个类似但一般更深一些,第四个分支为最大池化(增加了网络对不同尺度的适应性,Multi-Scale的思想)。因此Inception Module通过比较简单的特征抽象(分支1)、比较复杂的特征抽象(分支2和分支3)和一个简化结构的池化层(分支4)有选择地保留不同层次的高阶特征,这样可以最大程度地丰富网络的表达能力。
经典卷积神经网络介绍及实现代码
经典卷积神经网络介绍及实现代码
d) Inception V2提出了著名的Batch Normalization方法。BN用于神经网络某层时,会对每一个mini-batch数据内部进行标准化(normalization)处理,是输出规范化到N(0, 1)的正态分布,减少了Internal Covariate shift。关于这方面可参见: 为什么会出现Batch Normalization层
e) Inception V3引入了Factorization into small convolutions的思想,将一个较大的二维卷积拆成两个较小的一维卷积。比如,将7*7卷积拆成1*77*1两个卷积。这样做节约了大量参数,加速运算并减轻了过拟合(比将7*7卷积拆成3个3*3卷积更节约参数);并且论文指出这种非对称的卷积结构拆分比对称地拆分为几个相同的小卷积核效果更明显,可以处理更多、更丰富的空间特征,增加特征多样性。

使用tensorflow实现inception_v3

参考网址:https://github.com/tensorflow/models/blob/master/slim/nets/inception_v3.py

ResNet

经典卷积神经网络介绍及实现代码

这是一种新的网络思想,说一下我自己的理解。

为什么会出现Residual Learning

人们观察到一个典型现象:当网络一直加深时,准确率会趋于峰值,然后再加深网络准确率反而会下降(在训练集和测试集上均是如此,这显然就不是过拟合了)。ResNet作者把这种现象称为degradation problem。

然后大家开始想,前向传播过程中信息量越来越少是不错,但也不至于逼近效果越来越差呀。聪明的小伙子(严肃来讲应该是大神)He提出:把新增加的层变为恒等映射(identity mappings),这样至少效果不会越来越差吧。既然网络能拟合函数H(x),是不是也能同样拟合H(x)-x。说干就干,实验是检验真理的唯一标准。于是得出结论“拟合H(x)-x比直接拟合H(x)更简单”(当然理论上他也有一套自己的解释:如果我们想要得到的最优结果是x,拟合前者显然更简单,权重直接为0即可;虽然现实中我们想要的并非x,但我们想要的更应该接近x而非接近0吧)。哈哈,深度残差网络就这样诞生了。

ResNet单元模块

经典卷积神经网络介绍及实现代码
如上图所示为两种类型的block,block定义如下:

y=F(x,Wi)+xy=F(x,Wi)+x
的映射。我的理解是对x加个池化(stride=2)即可满足尺寸变化,然后再利用1*1小卷积升维即可。

ResNet网络特点

a) 网络较瘦,控制了参数数量;
b) 存在明显层级,特征图个数逐层递进,保证输出特征表达能力;
c) 没有使用Dropout,利用BN和全局平均池化进行正则化,加快了训练速度;
d) 层数较高时减少了3x3卷积个数,并用1x1卷积控制了3x3卷积的输入输出特征图数量,称这种结构为“瓶颈”(bottleneck)。
参考:https://zhuanlan.zhihu.com/p/22447440

使用tensorflow实现Resnet_v2

参考网址:https://github.com/tensorflow/models/blob/master/slim/nets/resnet_v2.py

参考:
1.以上相关模型的论文,这里就不贴了
2.书籍《Tensorflow实战》

AlexNet


推荐阅读
  • jQuery Flot 数据可视化插件:高效绘制图表的专业工具
    jQuery Flot 是一款高效的数据可视化插件,专为绘制各种图表而设计。该工具支持丰富的图表类型和自定义选项,适用于多种应用场景。用户可以通过其官方网站获取示例代码和下载资源,以便快速上手和使用。 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在Unity中进行3D建模的全面指南,详细介绍了市场上三种主要的3D建模工具:Blender 3D、Maya和3ds Max。每种工具的特点、优势及其在Unity开发中的应用将被深入探讨,帮助开发者选择最适合自己的建模软件。 ... [详细]
  • 结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法
    结语 | 《探索二进制世界:软件安全与逆向分析》读书笔记:深入理解二进制代码的逆向工程方法 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 本文探讨了在Android应用中实现动态滚动文本显示控件的优化方法。通过详细分析焦点管理机制,特别是通过设置返回值为`true`来确保焦点不会被其他控件抢占,从而提升滚动文本的流畅性和用户体验。具体实现中,对`MarqueeText.java`进行了代码层面的优化,增强了控件的稳定性和兼容性。 ... [详细]
  • 本文深入探讨了数据库性能优化与管理策略,通过实例分析和理论研究,详细阐述了如何有效提升数据库系统的响应速度和处理能力。文章首先介绍了数据库性能优化的基本原则和常用技术,包括索引优化、查询优化和存储管理等。接着,结合实际应用场景,讨论了如何利用容器化技术(如Docker)来部署和管理数据库,以提高系统的可扩展性和稳定性。最后,文章还提供了具体的配置示例和最佳实践,帮助读者在实际工作中更好地应用这些策略。 ... [详细]
  • 在探讨 AS3 中的数据深度复制技术时,本文详细介绍了实现数据深度克隆的有效方法。通过对比多种方案,最终确定了一种高效且可靠的实现方式,所有代码均来源于公开资源,确保了方法的实用性和可操作性。 ... [详细]
  • Android目录遍历工具 | AppCrawler自动化测试进阶(第二部分):个性化配置详解
    终于迎来了“足不出户也能为社会贡献力量”的时刻,但有追求的测试工程师绝不会让自己的生活变得乏味。与其在家消磨时光,不如利用这段时间深入研究和提升自己的技术能力,特别是对AppCrawler自动化测试工具的个性化配置进行详细探索。这不仅能够提高测试效率,还能为项目带来更多的价值。 ... [详细]
  • 2019年斯坦福大学CS224n课程笔记:深度学习在自然语言处理中的应用——Word2Vec与GloVe模型解析
    本文详细解析了2019年斯坦福大学CS224n课程中关于深度学习在自然语言处理(NLP)领域的应用,重点探讨了Word2Vec和GloVe两种词嵌入模型的原理与实现方法。通过具体案例分析,深入阐述了这两种模型在提升NLP任务性能方面的优势与应用场景。 ... [详细]
  • 【Python爬虫实操】 不创作小说,专精网站内容迁移,超高效!(含源代码)
    本文详细介绍了如何利用Python爬虫技术实现高效网站内容迁移,涵盖前端、后端及Android相关知识点。通过具体实例和源代码,展示了如何精准抓取并迁移网站内容,适合对Python爬虫实战感兴趣的开发者参考。 ... [详细]
  • 本文提供了PyTorch框架中常用的预训练模型的下载链接及详细使用指南,涵盖ResNet、Inception、DenseNet、AlexNet、VGGNet等六大分类模型。每种模型的预训练参数均经过精心调优,适用于多种计算机视觉任务。文章不仅介绍了模型的下载方式,还详细说明了如何在实际项目中高效地加载和使用这些模型,为开发者提供全面的技术支持。 ... [详细]
  • Bits模块中rollsum.go文件的Off-by-One错误分析与修复 ... [详细]
  • 教程:使用Source Monitor进行代码质量分析
    Source Monitor 是一款强大的代码分析工具,能够对 Java、C++、C、C# 和 Delphi 等多种编程语言进行复杂度分析,帮助开发者有效评估和提升代码质量。通过详细的指标和报告,该工具可辅助团队识别潜在问题并优化代码结构。 ... [详细]
  • 本文将详细介绍在Android应用中添加自定义返回按钮的方法,帮助开发者更好地理解和实现这一功能。通过具体的代码示例和步骤说明,本文旨在为初学者提供清晰的指导,确保他们在开发过程中能够顺利集成返回按钮,提升用户体验。 ... [详细]
author-avatar
Jenny821010
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有