秃姐学AI系列之:AlexNet + 代码实现

目录

深度学习之前的网络

机器学习

几何学

特征工程

总结

深度卷积神经网络的突破的两个关键因素

数据

ImageNet(2010)

硬件

90年:数据量和计算能力发展的均匀且都不大的时候——神经网络

00年:内存不错、算力也不错,数据有增加但是规模还不算多的时候——核方法

10年以后:计算量更多了,可以构造更加深的网络了——又回到了神经网络

AlexNet

兴起的原因

网络架构

 更多细节

 复杂度

总结

代码实现 AlexNet

QA


深度学习之前的网络

机器学习

在2000年的时候,机器学习里面最火的、最主流的算法绝对是——核方法

什么是核方法呢?

     1.特征提取

      2.选择核函数来计算相关性——通过核函数计算之后就会变成一个凸优化的问题

说人话就是:如何判断在高维空间里面两个点是如何相关的

  • 线性模型的话可以做内积
  • 通过核方法的话可以变换整个空间,把这个空间拉成我们想要的样子

      3.凸优化问题

线性模型就是一个凸优化问题——所以它可以有一个很好的理论解,可以把显式解写出来

       4.漂亮的定理

因为是凸优化,所以可以拥有比较好的定理

整个核方法最大的特色就是:有一套完整的泛函数学定理,用来计算

  • 模型的复杂度
  • 在xxx情况下会发生xxx事情

这也是在2000年的时候核方法可以替代掉神经网络,称为当时机器学习最主流的算法的原因

哪怕到现在SVM仍然被积极的使用,因为它确实对参数不怎么敏感(不太需要调参)

几何学

目前为止我们讲的神经网络多为卷积神经网络,卷积神经网络(特别是2d卷积神经网络)通常是用在图片上面,也就是计算机视觉。 

在2000年左右,计算机视觉关心的问题大多都是从几何学那边迁移过来的

几何学的核心思想:

     1.特征抽取

     2.描述几何(例如多相机)

将整个计算机视觉的问题描述为几何问题,例如:三个相机拍照,通过相机的位置来还原3D的情况

      3.(非)凸优化

如果有很好的模型,可以把问题表示为一个很好的凸优化函数

       4.漂亮定理

同样的,因为应用了凸优化,所以可以拥有很好的定理证明;

一些特殊的非凸优化的问题,也有一些定理

几何方法的特点就是:如果定理的假设(比如对整个世界做了一个比较简单的物理模型的假设)满足,效果会非常好(这现在仍然是很多学科在做的工作)

特征工程

其实在计算机视觉里面,最重要的是特征工程——就是对一张图片怎么去抽取特征

我们现在神经网络是直接把原始像素输入进模型,但是如果同样直接把原始像素输入进SVM,效果会非常非常差。所以在过去的很多年,计算机视觉的研究者就怎么抽取图像特征这方面提出了非常多的算法:

  • SIFT

去抽取各个方向、各个角度的小向量来描述这个图片

  • SURF

如果特征工程抽取的特征非常好的话,后面用一个非常简单的多分类模型就可以达到很好的效果(例如SVM)。

总结

在深度学习之前,整个计算机视觉大家其实不那么关心机器学习的模型是什么样子,关键在于如何去做特征提取,即原始图片如何去抽取特征使得机器学习更容易去学习。所以当时整个计算机视觉就是针对不一样的问题来抽取不一样的特征。 

深度卷积神经网络的突破的两个关键因素

数据

ImageNet(2010)

和MNIST数据集相比:(类多了100倍,样本多了1000倍)

  • 不再是黑白灰度图而变为彩色图片
  • 大小也从28 x 28升级为 469 x 387(google图像搜索大小)
  • 样本数从 60K 到 1.2M
  • 类别从 9类 到 1000类(ImageNet竞赛数据大小) 

因为有了这么大的数据集,才能用更深的网络去抽取特征,因为包含许多特征的深度模型需要大量的有标签数据,才能显著优于基于凸优化的传统方法(如线性方法和核方法)

硬件

在过去60年里面硬件的发展趋势如下图所示:

第一行:数据集大小

第二行:内存大小

第三行:计算能力

从图里面可以看出

从70年到20年,数据大小方面,容量大概增加了1000倍;而计算能力因为GPU的兴起,突飞猛进了10000倍。所以计算能力的增长远超于数据量的增长,因为这种差异,导致了不同年点模型的区别。 

90年:数据量和计算能力发展的均匀且都不大的时候——神经网络

        因为神经网络相对于是一种比较便宜的模型框架,虽然计算量比较大,但是内存要求不是很高

00年:内存不错、算力也不错,数据有增加但是规模还不算多的时候——核方法

        原因有三:①简单②理论完备③跑得动:真的能把核矩阵算出来,相较于计算能力也是一个适中的消耗

10年以后:计算量更多了,可以构造更加深的网络了——又回到了神经网络

        虽然数据长得没那么块,但是我计算量比以前翻了几十倍,那么就可以更多的挖掘数据里面的信息,也就是说去构造更加深的网络,用计算去换取目标的精度

PS:说不定再过十年核方法又回来了哈哈哈,我们已经处在了神经网络的第二个十年里面了。第一个神经网络也就只兴起了十年多,然后就去造芯片了....

AlexNet

掀起当下这波深度学习热潮的模型 

兴起的原因

  • AlexNet赢得了2012年ImageNet竞赛

  • 更深更大的LeNet:在架构上其实没太根本的区别

  • 主要改进:

    • 丢弃法(Dropout):做模型的控制,因为模型更大了,用丢弃法来做模型的正则

    • ReLU:跟Sigmoid比,ReLU梯度更大,而且在零点的一阶导更好一些,可以支撑更深的模型

    • MaxPooling:使得输出值比较大,梯度比较大,训练会更容易一些

  • 计算机视觉方法论的改变:LeNet人们还认为它只是个机器学习的模型,而AlexNet增大了几十倍,由量变引起了质变,把人们之前对于计算机视觉的观念改变了。如下图所示:

 在AlexNet之前,人们的兴趣和重点都放在人工特征提取这块,来研究如何把人对问题的理解转换为标准的机器学习的数值;

而AlexNet除了最后一层可以理解成Softmax回归来计算概率,之前的所有层都可以理解成模型在自己学习特征,每一个CNN的通道都在独立的学习特征,最后使得Softmax可以很好的进行分类。这样做的好处是:

  • 构造CNN相对来说很简单,不需要了解太多计算机视觉的专业知识
  • 更容易跨到不同的问题或学科上面去解决

网络架构

在AlexNet的第一层,卷积窗口的形状是11×11,96的通道数,步长为4

  • 由于ImageNet中大多数图像的宽和高比MNIST图像的多10倍以上,因此,需要一个更大的卷积窗口来捕获目标。 
  • 从6——>96的通道数,表明图片尺寸变大了,包含了更多的通道数,想在第一层就尝试识别出来
  • 步长为4是受当时算力限制,如果步长不为4的话后面计算量会变得太大

第二层中的卷积窗口形状被缩减为 5×5,填充 2,输出通道 256;然后是 3×3,填充 1。

  • 填充(pad)为 2 即使得输入输出尺寸一样
  • 通道数AlexNet直接拉到 256,比LeNet的 16 翻了十几倍:同样 AlexNet 还是希望能识别更多的模式在这一层,所以使用了更大的输出通道
  • AlexNet 比 LeNet 多了三个连续的 384 通道的卷积层,最后做一次池化层

此外,在第一层、第二层和第五层卷积层之后,加入窗口形状为 3×3、步幅为 2 的最大汇聚 MaxPooling 层。

  • LeNet池化层是2 x 2且步长也为2,即不重叠的;
  • 而AlexNet是3 x 3步长为2,会存在一定程度的重叠;
  • 相同的是两个模型都选择在池化层将数据量减半(2步长)

在最后一个卷积层后有两个全连接层,分别有4096个输出。 这两个巨大的全连接层拥有将近1GB的模型参数。

  • 因为 AlexNet 所用的数据集 ImageNet 有1000类的输出类别,所以需要一个巨大的全连接来支撑

由于早期GPU显存有限,原版的AlexNet采用了双数据流设计,使得每个GPU只负责存储和计算模型的一半参数。 幸运的是,现在GPU显存相对充裕,所以现在很少需要跨GPU分解模型。

 更多细节

  • 激活函数从Sigmoid变为ReLU(减缓梯度消失,ReLU在正向指标上面梯度总是为1,零点处一阶导数为1,更容易数值稳定)

ReLU激活函数使训练模型更加容易。 当sigmoid激活函数的输出非常接近于0或1时,这些区域的梯度几乎为0,因此反向传播无法继续更新一些模型参数。 相反,ReLU激活函数在正区间的梯度总是1。 因此,如果模型参数没有正确初始化,sigmoid函数可能在正区间内得到几乎为0的梯度,从而使模型无法得到有效的训练。

  • 隐藏全连接层后加入了丢弃层(两个4096之后)
  • 数据增强:AlexNet觉得10000张图片不够大,包括但不仅限于:随机截取、随机改变亮度、随即调整色温....用这样的变种改善卷积对于光照、位置的敏感程度;这样的操作也可以降低模型记住数据的能力(过拟合)

 复杂度

参数个数:AlexNet 比 LeNet 多了10倍

        但是考虑到 ImageNet 数据集比 MNIST大了不止10倍的情况下这个参数量不算大了

FLOP(前向传播需要的浮点计算数): AlexNet 比 LeNet 贵了250倍

        这个是真的区别很大!!虽然参数只多了 10 倍,但是因为卷积神经网络所有参数都是乘在一起的,所以导致最后计算量根本不在一个层级上面

虽然但是,这个AlexNet在现在看已经是一个很便宜的神经网络了哈哈哈

总结

  • AlexNet的架构与LeNet相似,但使用了更多的卷积层和更多的参数来拟合大规模的ImageNet数据集。

  • 今天,AlexNet已经被更有效的架构所超越,但它是从浅层网络到深层网络的关键一步。

  • 尽管AlexNet的代码只比LeNet多出几行,但学术界花了很多年才接受深度学习这一概念,并应用其出色的实验结果。这也是由于缺乏有效的计算工具。

  • Dropout、ReLU 和 数据增强 是提升计算机视觉任务性能的其他关键步骤。

代码实现 AlexNet

import torch
from torch import nn
from d2l import torch as d2lnet = nn.Sequential(# 这里使用一个11*11的更大窗口来捕捉对象。# 同时,步幅为4,以减少输出的高度和宽度。# 另外,输出通道的数目远大于LeNetnn.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),  # 到此为止是所有的卷积单元(4D->4D)nn.Flatten(),# 这里,全连接层的输出数量是LeNet中的好几倍。使用dropout层来减轻过拟合nn.Linear(6400, 4096), nn.ReLU(),nn.Dropout(p=0.5),  # 丢弃概率0.5,即有一半的概率把输出置0nn.Linear(4096, 4096), nn.ReLU(),nn.Dropout(p=0.5),# 最后是输出层。由于这里使用Fashion-MNIST,所以用类别数为10,而非论文中的1000nn.Linear(4096, 10))

上面代码最后一层卷积输出应该是384,但由于改了这个后面线性层的输入也要改所以懒得算了.....SORRY

因为这段代码跑的是Fashion-MNIST数据集,所以最后一个mlp输出的类别是10,如果跑ImageNet的话应该是1000 

构造一个单通道数据,来观察每一层输出的形状

X = torch.randn(1, 1, 224, 224)
for layer in net:X=layer(X)print(layer.__class__.__name__,'output shape:\t',X.shape)

QA

1、ImageNet是否已经成为历史了?

绝对没有!!虽然是一个十年前的数据集,但是它还是绝大多数论文来证明自己效果好的数据集。毕竟当时构造的时候也是花了差不多100万美金...当时都是手动标的数据

2、为什么2000年的时候神经网络会被核方法代替

①当时的硬件,深的学不动,浅的效果一般

②核方法理论更漂亮,学术界还是更喜欢理论一些 

 3、其他学习资料里面,AlexNet 会提到里面的 Local Response Normalization 没太懂

没啥用的东西,其实一个网络模型提出,不会去深究里面到底是什么模块起作用了,就是觉得哦好用,发布之后后面的人会一个个模块去研究尝试什么东西是好用的,这个LRM模块后面实验做下来发现没啥用,不懂也没关系

4、为什么AlexNet最后要有两个相同的全连接Dense(4096) ?一个行吗?

密集层(Dense Layer)是深度学习中常用的一种神经网络层,也被称为全连接层(Fully Connected Layer)或线性层(Linear Layer)。

还真不行!你可以自己试一试。效果会差,因为前面的卷积把特征抽的不够好不够深,所以需要两个巨大的全连接层来稳固。

5、为什么 LeNet 不属于深度卷积神经网络

那帮搞深度学习的人,最厉害的不是调参什么的,其实最厉害的是包装——取名大师。老学术了... deep 就是它们想出来的一个很适合市场的词。神经网络在 Attention 和 Transformer 之前没有什么很新的东西。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker-compose安装NebulaGraph 3.8.0

文章目录 一. 安装NebulaGraph1.1 通过 Git 克隆nebula-docker-compose仓库的3.8.0分支到主机1.2 部署1.3 卸载1.4 查看 二. 安装NebulaGraph Studio2.1 下载 Studio 的部署配置文件2.2 创建nebula-graph-studio-3.10.0目录,并将安装包解压至目录中2.3 解压后进入 n…

【鸿蒙学习】HarmonyOS应用开发者高级认证 - 应用性能优化二(代码层面)

学完时间:2024年8月22日 学完排名:第1801名 一、长列表优化概述 列表是应用开发中最常见的一类开发场景,它可以将杂乱的信息整理成有规律、易于理解和操作的形式,便于用户查找和获取所需要的信息。应用程序中常见的列表场景有新…

IDEA 导入 RocketMQ 源码

目录 前言一、RocketMQ 架构二、环境准备三、下载源码四、编译源码4.1 导入源码4.2 目录结构4.3 运行程序1. 启动 Namesrv2. 启动 Broker3. 启动 Producer4. 启动 Consumer 五、监控平台的搭建5.1 下载 console 源码5.2 IDEA 启动 前言 最近项目中有个功能需要在本地调试下 Ro…

验证实战知识点--(2)

1.seq中的pre_start pre_start 是 uvm_sequence 类的一个虚拟方法,用于在序列开始执行之前进行初始化和设置。这个方法在调用 start 方法前立即执行,提供了一个执行自定义初始化代码的机会。 start 方法用于启动序列的执行,而 pre_start 可以…

【MySQL】数据库基础(库的操作)

目录 一、MySQL安装、连接、修改密码操作 二、库的操作 2.1 创建数据库 2.2 字符集和校验规则 2.3 操控数据库 2.4 修改数据库 2.5 删除数据库 2.6 数据库的备份和恢复 2.7 查看连接情况 前情提要: 我的服务器操作系统是Ubuntu20.04,安装的是M…

06--kubernetes.pod管理与投射数据卷

前言:上一章记录了部署k8s常用的两个方式,这一章就简单一些,整理一下k8s资源对象的配置和管理命令。 1、集群状态检查 前天搭建的环境,然后关机了两天今天开启后第一时间需要检查集群环境是否正常 [rootk8s-master1 ~]# kubect…

探索《黑神话·悟空》背后的AI技术支持:英伟达全景光线追踪技术、DLSS 3.5 与帧生成

引言 2023 年,游戏《黑神话悟空》以其震撼的视觉效果和深度沉浸的游戏体验,成为全球玩家热议的焦点。这款游戏在发布初期就取得了惊人的销量:预售阶段便突破 120 万套,而发售首日更是达到 450 万份的惊人成绩。这个现象级作品背后…

大模型微调课程及大模型应用开发课程介绍

大模型实验室是在学校现有的实验室建设基础上,依托行业标杆企业,聚焦行业大模型产业发展方向,建设一个产学研一体化的合作教学平台,形成“教与学紧密结合、理论与实践紧密结合,学校与企业紧密结合”的创新教育模式。大…

初识C++以及安装C++学习工具

C的发展史 C是由Bjarne Stroustrup在20世纪80年代初期于贝尔实验室开发的一种编程语言。它的设计初衷是作为C语言的一个超集,通过添加面向对象编程的特性来增强C语言。C支持多种编程范式,包括过程化编程、面向对象编程和泛型编程。 C的历史可以追溯到1…

[数据集][目标检测]道路积水检测数据集VOC+YOLO格式2699张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2699 标注数量(xml文件个数):2699 标注数量(txt文件个数):2699 标注…

python-逆序数(赛氪OJ)

[题目描述] 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。比如一个元素个数为 4 的数列,其元素为 2,4,3,1,则 (2,…

深度优先搜索-放苹果

放苹果 http://noi.openjudge.cn/ch0205/666/ #include<bits/stdc.h> using namespace std;int dfs(int,int); //第一个赋值为1 其余为0 int a[11]{1},ans,n,m;int main(){ int k; cin>>k; for(int i1;i<k;i){ ans0; cin>>m>>n; dfs(m,1);//m个…

Windows C++控制台菜单库开发与源码展示

Windows C控制台菜单库 声明&#xff1a;演示视频&#xff1a;一、前言二、具体框架三、源码展示console_screen_set.hframeconsole_screen_frame_base.hconsole_screen_frame_char.hconsole_screen_frame_wchar_t.hconsole_screen_frame.h menuconsole_screen_menu_base.hcons…

入门 - Vue中使用axios原理分析及解决前端跨域问题

1. 什么是Axios&#xff1f; Axios&#xff08;ajax i/o system&#xff09;&#xff0c;是Vue创建者主推的请求发送方式&#xff0c;因其简单的配置与良好的性能被前端爱好者所喜爱。众所周知&#xff0c;在进行网页设计时经常需要从后端拿数据&#xff0c;在Web应用初期会将…

计算机网络之TCP序号,确认序号和报文传输时间

开篇提示 本篇适合于了解基础知识&#xff0c;进行扩展提高的使用&#xff0c;附带考研习题以及解析。 TCP序号和确认序号的区别 TCP首部中有序号和确认序号&#xff0c;他们都是4个字节&#xff08;4B&#xff09;&#xff0c;且在数据传输中有很重要的意义&#xff0c;那么两…

0x01 GlassFish 任意文件读取漏洞复现

参考文章&#xff1a; 应用服务器glassfish任意文件读取漏洞 - SecPulse.COM | 安全脉搏 fofa 搜索使用该服务器的网站 网络空间测绘&#xff0c;网络空间安全搜索引擎&#xff0c;网络空间搜索引擎&#xff0c;安全态势感知 - FOFA网络空间测绘系统 "glassfish"&…

用TensorFlow实现线性回归

说明 本文采用TensorFlow框架进行讲解&#xff0c;虽然之前的文章都采用mxnet&#xff0c;但是我发现tensorflow提供了免费的gpu可供使用&#xff0c;所以果断开始改为tensorflow&#xff0c;若要实现文章代码&#xff0c;可以使用colaboratory进行运行&#xff0c;当然&#…

外挂程序:增强点及辅助

1.关于前几篇介绍的外挂程序,SAP中的业务单据还是要区分具体的操作人员。如建立财务凭证,工号A,B,C使用相同的SAP账号,那就没办法知道是谁操作的了啊,所以sap的业务单据需要细分到具体人员的都要增强实现以下: 如生产工单: 具体的增强点: 2.辅助程序:SAP账号自动锁定功…

从新手到专家必读书籍:官方推荐.NET技术体系架构指南

前言 Microsoft 官方推荐了一系列有关 .NET 体系结构的指南&#xff0c;旨在帮助开发人员掌握最新的技术和最佳实践。这些资源覆盖了从微服务架构到云原生应用开发等多个主题&#xff0c;是开发高质量 .NET 应用程序不可或缺的参考资料。 通过这些指南&#xff0c;可以深入了…

瑞幸x《黑神话》周边秒空,联名营销真的是流量密码吗?

​8月19日&#xff0c;瑞幸上线了与国产3A游戏《黑神话&#xff1a;悟空》合作的联名活动&#xff0c;其中包括黑神话腾云美式咖啡及周边产品。很多人为了抢到联名的周边&#xff0c;一大早就在瑞幸卡点下单&#xff0c;更有一些网友早上6点多就在瑞幸门口“蹲点”&#xff0c;…