【深度学习】深度卷积神经网络(AlexNet)

news2024/11/15 19:31:39

在 LeNet 提出后,卷积神经网络在计算机视觉和机器学习领域中很有名气,但并未起到主导作用。

这是因为 LeNet 在更大、更真实的数据集上训练的性能和可行性还有待研究。

事实上,在 20 世纪 90 年代到 2012 年之间的大部分时间里,神经网络往往被其他机器学习方法超越,如支持向量机。

在计算机视觉中,直接将神经网络与其他机器学习方法比较也许不太公平,因为卷积神经网络的输入是由原始像素值或是经过简单预处理的像素值组成。

而在使用传统机器学习方法时,从业者永远不会将原始像素作为输入。

在传统机器学习方法中,计算机视觉流水线是由经过人的精心设计的特征流水线组成的。

与训练端到端(从像素到分类结果)系统相比,经典机器学习的流水线看起来更像下面这样:

  1. 获取一个有趣的数据集(早期收集数据需要昂贵的传感器)。
  2. 根据光学、几何学及其他偶然发现,手工对特征数据集进行预处理。
  3. 通过标准的特征提取算法,如 SIFT(尺度不变特征变换)和 SURF(加速鲁棒特征)。
  4. 将提取的特征送入分类器中,以训练分类器。

对于机器学习研究人员来说,用优雅的理论去证明各种模型的性质是重要且美丽的;而对计算机视觉研究人员来说,推动领域进步的是数据特征,而不是学习算法。

计算机视觉研究人员相信,从对最终模型精度的影响来说,更大或更干净的数据集、或是稍微改进的特征提取,比任何学习算法带来的进步大得多。

一、学习表征

在 2012 年以前,图像特征都是机械地计算出来的。在当时,设计一套新的特征函数、改进结果,并撰写论文是主流。

另有一些研究人员有不同的想法,他们认为特征本身就应该被学习。

此外,他们还认为,在合理的复杂性前提下,特征应该由多个共同学习的神经网络层组成,每个层都有可学习的参数。

在机器视觉中,最底层可能检测边缘、颜色和纹理。由 Alex 等人(2012)提出的新的卷积神经网络变体 AlexNet 的最底层就学习到了一些类似于传统滤波器的特征抽取器。

AlexNet 的更高层建立在这些底层表示的基础上,表示出更大的特征,如眼睛、鼻子等等。

而更高的层可以检测整个物体,如人、飞机等等。最终的隐藏神经元可以学习图像的综合表示,从而使得属于不同类别的数据易于区分。

尽管一直有一群执着的研究者不断钻研,试图学习视觉数据的逐级表征,但很长一段时间都未能有所突破。

深度卷积神经网络的突破出现在 2012 年,可归因于两个因素:数据和硬件。

数据

包含许多特征的深度模型需要大量的有标签数据,才能显著优于基于凸优化的传统方法。

然而,限于早期计算机有限的存储和 90 年代有限的研究预算,大部分研究只基于小的公开数据集。

这一状况在 2010 年前后兴起的大数据浪潮中得到改善。2009 年,ImageNet 数据集发布,并发起 ImageNet 挑战赛,其推动了计算机视觉和机器学习研究的发展。

硬件

深度学习对计算资源的要求很高,训练可能需要数百个迭代轮数,每次迭代都需要通过代价高昂的许多线性代数层传递数据。

然而,用 GPU 训练神经网络改变了这一格局。图形处理器(Graphics Processing Unit, GPU)早年用来加速图形处理,使电脑游戏玩家受益。

GPU 可优化高吞吐量的 4$\times$4 矩阵和向量乘法,从而服务于基本的图形任务。幸运的是,这些数学运算与卷积层的计算惊人地相似。

相比于 CPU,GPU 的综合性能更强,内核也要简单得多,因此 GPU 更加节能。此外,深度学习的许多操作需要较高的内存带宽,而 GPU 拥有 10 倍于 CPU 的带宽。

回到 2012 年的重大突破,Alex 等人意识到卷积神经网络中的计算瓶颈:卷积和矩阵乘法,都是可以在硬件上并行化的操作。于是,他们使用 GPU 加快了卷积运算,推动了深度学习热潮。

二、AlexNet

2012 年,AlexNet 横空出世。它首次证明了学习到的特征可以超越手工设计的特征,一举打破了计算机视觉研究的现状。

AlexNet 使用了 8 层卷积神经网络,其架构和 LeNet 非常相似,如下图所示。

从 LeNet(左)到 AlexNet(右)

尽管它们的设计理念非常相似,但也存在显著差异:

  1. AlexNet 相较于 LeNet-5 要深得多,其由 8 层组成:五个卷积层、两个全连接隐藏层和一个全连接输出层。
  2. AlexNet 使用 ReLU 而不是 sigmoid 作为激活函数。

模型设计

在 AlexNet 的第一层,卷积窗口的形状是 11$\times$11,比 LeNet 中大得多。

这是因为 ImageNet 中使用的图像要比 MNIST 大得多,因此需要一个更大的卷积窗口来捕获目标。

第二层中的卷积窗口缩减为 5$\times 5 ,然后是 3 5,然后是 3 5,然后是3\times 3 ,在第一层、第二层和第五层卷积层后,加入窗口形状为 3 3,在第一层、第二层和第五层卷积层后,加入窗口形状为 3 3,在第一层、第二层和第五层卷积层后,加入窗口形状为3\times$3、步幅为 2 的最大汇聚层。而且,AlexNet 的通道数是 LeNet 的 10 倍。

AlexNet 将 sigmoid 激活函数改为更简单的 ReLU 激活函数。一方面,ReLU 激活函数的计算更为简单;另一方面,当使用不同的参数初始化方法时,ReLU 激活函数使训练模型更加容易。

容量控制和预处理

AlexNet 通过暂退法(Dropout)控制全连接层的模型复杂度,而 LeNet 只使用了权重衰减。

为了进一步扩充数据,AlexNet 在训练时增加了大量的图像增强数据,如翻转、裁切和变色。这使得模型更加健壮,更大的样本量有效地减少了过拟合。

net = nn.Sequential(                     # 定义模型
        # 这里使用一个11*11的更大窗口来捕捉对象。
        # 同时,步幅为4,以减少输出的高度和宽度。
        # 另外,输出通道的数目远大于LeNet
        nn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(),
        nn.MaxPool2d(kernel_size=3, stride=2),
        # 减小卷积窗口,使用填充为2来使得输入与输出的高和宽一致,且增大输出通道数
        nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(),
        nn.MaxPool2d(kernel_size=3, stride=2),
        # 使用三个连续的卷积层和较小的卷积窗口。
        # 除了最后的卷积层,输出通道的数量进一步增加。
        # 在前两个卷积层之后,汇聚层不用于减少输入的高度和宽度
        nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),
        nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),
        nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(),
        nn.MaxPool2d(kernel_size=3, stride=2),
        nn.Flatten(),
        # 这里,全连接层的输出数量是LeNet中的好几倍。使用dropout层来减轻过拟合,暂退概率0.5
        nn.Linear(6400, 4096), nn.ReLU(),
        nn.Dropout(p=0.5),
        nn.Linear(4096, 4096), nn.ReLU(),
        nn.Dropout(p=0.5),
        # 最后是输出层。由于这里使用Fashion-MNIST,所以用类别数为10,而非论文中的1000
        nn.Linear(4096, 10))

数据集准备

即使在现代 GPU 上,使用 ImageNet 数据集训练也需要数小时或数天的时间,因此我们继续使用 Fashion-MNIST 数据集来实现 AlexNet 模型。

但由于 Fashion-MNIST 数据集中的图像(28$\times 28 )远低于 I m a g e N e t 图像,为了有效使用 A l e x N e t 架构,我们把图像 r e s i z e 变换为 224 28)远低于 ImageNet 图像,为了有效使用 AlexNet 架构,我们把图像 resize 变换为 224 28)远低于ImageNet图像,为了有效使用AlexNet架构,我们把图像resize变换为224\times$224。

模型训练

定义好模型以及变换数据集后,训练的代码和前面 LeNet 几乎一样,不过这里采用的是小学习率(0.01)和小batch_size(128)。

LeNet 模型训练的代码上次忘了放了,放到这篇文章附件里。

这次输入的图像增大很多,导致训练时间久了不少,我的拯救者风扇响个不停。第 10 轮训练后的相关结果为:

10轮的训练损失为0.32810轮的训练精度为0.87910轮的测试集精度为0.885

可以看到精度已经很接近 90%,相比 LeNet 有一定提高,这得益于 Dropout、ReLU 的使用和预处理。

尽管 AlexNet 的代码仅比 LeNet 多几行,但这中间跨越的时间却有 20 来年。目前 AlexNet 已经被很多更有效的架构超越,但它是从浅层网络到深层网络的关键一步。

LeNet 与 AlexNet 模型训练的代码见附件:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2161342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows系统的Tomcat日志路径配置

文章目录 引言I Windows系统的Tomcat日志路径配置配置常规日志路径访问日志路径配置,修改server.xmlII 日志文件切割:以分隔割tomcat 的 catalina.out 文件为例子通过Linux系统自带的切割工具logrotate来进行切割引言 需求:C盘空间不足,处理日志文件,tomcat日志迁移到D盘…

中国科学院云南天文台博士招生目录

中国科学院云南天文台是专业基础研究与应用研究结合的综合性天文研究机构(其前身是1938年中央研究院天文研究所在昆明东郊凤凰山创建的凤凰山天文台),总部在云南省昆明市,设有两个观测站(丽江高美古天文观测站和澄江抚…

Boruta 的库的初识

我在一个kaggle比赛时间预测中发现Boruta我并不熟悉与是我学习了一下 Boruta 的工作原理: 影子特征(Shadow Features): Boruta 首先创建一组影子特征,这些影子特征是通过随机打乱原始特征的值生成的。影子特征的目的是作为对照组…

【完结】【PCL实现点云分割】ROS深度相机实践指南(下):pcl::BoundaryEstimation实现3D点云轮廓检测的原理(论文解读)和代码实现

前言 本教程使用PCL对ROS深度相机捕获到的画面进行操场上锥桶的分割 上:[csdn 博客] 【PCL实现点云分割】ROS深度相机实践指南(上):PCL库初识和ROS-PCL数据类型转换中:[csdn 博客] 【PCL实现点云分割】ROS深度相机实践指南(中):Pl…

电梯节能 引领趋势

电梯,之前对我们来说,就是让我们省时省力的工具,谁知电梯也可加装【节能设备】。 电梯节能评估,节电率达20%-50%。 电梯节能(电梯回馈装置)通常电梯在轻载上行,重载下行和平层停梯状态下&#…

监控和维护 Linux 系统的健康状态:从服务启动故障到操作系统查询

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

rar文件怎么打开?这几款软件压缩和查看很方便!

在这个数字化信息爆炸的时代,我们每天都会接触到各种各样的文件,其中RAR格式文件以其高压缩率和良好的文件保护特性,成为了许多人分享和存储大文件的首选。然而,面对这样一个看似“神秘”的文件格式,不少朋友可能会感到…

Stable Diffusion绘画 | 来训练属于自己的模型:配置完成,炼丹启动

前言 效率设置-优化器 优化器可以分为4类: 第一类 AdamW :梯度下降算法,结合自适应学习率,既可以快速收敛,又可以避免 Loss值 震荡 AdamW8bit:能降低显存占用,并略微加快训练速度&#xff0…

Mysql—主从复制的slave添加及延迟回放

MySQL 主从复制是什么? ​ MySQL 主从复制是指数据可以从一个 MySQL 数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,…

国产分布式数据库-tidb单机部署文档

tidb单机部署文档 1、创建用户 #创建用户 useradd tidb #设置密码 passwd tidb2、配置免密码登录 编辑/etc/sudoers文件,文末加入: tidb ALL(ALL) NOPASSWD:ALL如果想要控制某个用户(或某个组用户)只能执行root权限中的一部分命令, 或者允许某些用户使用sudo时…

充电桩设备升级扩展多段计费

一 项目背景 某省某市的一个充电桩项目近日收到业主需求,需在国庆节增加一个时间段(深谷计费段),但充电桩设备仅支持4段(尖时段,峰时段,平时段,谷时段),今…

【CoppeliaSim V4.7】The Python interpreter could not handle the wrapper script

[sandboxScript:error] The Python interpreter could not handle the wrapper script (or communication between the launched subprocess and CoppeliaSim could not be established via sockets). Make sure that the Python modules ‘cbor2’ and ‘zmq’ are properly i…

Spring MVC 基本配置步骤 总结

1.简介 本文记录Spring MVC基本项目拉起配置步骤。 2.步骤 在pom.xml中导入依赖&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.0.6</version><scope>…

关于javascript中防抖和节流的使用详解

防抖&#xff08;Debounce&#xff09;和节流&#xff08;Throttle&#xff09;是两种常见的优化技巧&#xff0c;通常用于控制函数在短时间内频繁触发的场景&#xff0c;尤其是在处理用户输入、滚动、窗口大小调整等事件时。它们的主要目的是减少不必要的函数调用&#xff0c;…

想把泰文从文本上识别,什么软件工具好用呢?

泰文识别技术涉及将泰文图像转换成数字文本&#xff0c;主要通过光学字符识别&#xff08;OCR&#xff09;技术实现。这项技术广泛应用于文档处理、语言学习和翻译服务。实现泰文识别的方法包括使用手机应用程序、在线服务、专业软件&#xff0c;以及结合人工智能和机器学习。此…

UE5 C++: 插件编写04 | 自动增加前缀

准备工作 UObject* Asset UObject* Asset 通常指的是一个指向UObject的指针。UObject是Unreal Engine中的基类&#xff0c;几乎所有的引擎对象都继承自UObject。这个指针可以引用任何派生自UObject的对象&#xff0c;比如蓝图、材质、贴图、音频资源等资产。 如果你看到UObj…

【C++】——set和map的使用

文章目录 set的特性set初始化set迭代器和常见成员函数multisetmap的特性map初始化map迭代器和常见成员函数insert[]运算符重载multimap set的特性 自动排序&#xff1a; set中的元素会默认排升序存储唯一性&#xff1a; set中每个元素都是唯一的&#xff0c;如果插入一个已有元…

如何找到实力突出的建站公司,2024网络建站公司推荐

选择网站建设公司需要考虑公司以下几点&#xff1a; 是否对的业务需求的了解程度如何&#xff1f; 与公司的文化契合度 相同企业文化的公司&#xff0c;往往能取得很好的合作 沟通的方式 考虑&#xff1a;谁将是解决疑虑、查询、反馈的联系人&#xff0c;查询的响应时间是…

ShiroFilterFactoryBean登录认证成功后没有正常跳转到successUrl问题解决

问题出现&#xff1a; 分析&#xff1a;在配置了ShiroFilter之后&#xff0c;直接尝试在页面端访问login.jsp,但是login.jsp需要做认证过滤也就是FormAuthenticationFilter。 应为没有登录信息所以可想而知&#xff0c;会走ShiroFilterFactoryBean定义的loginUrl也就是认定为没…

VBA技术资料MF202:添加右键多按钮弹出菜单

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…