揭秘 DCNN——AlexNet

来源 — gifs.com

一、说明 

        还记得 2012 年的 ImageNet 视觉识别挑战赛吗?当然,你知道!经过大量的反复试验和实验,研究员 Alex Krizhevsky 及其合著者 Ilya Sutskever 和 Geoffrey E. Hinton(他真正理解了深度学习中的“深度”)引入了 AlexNet 架构,该架构以第一作者的名字命名,并赢得了 ImageNet 挑战赛,从而开创了利用深度卷积神经网络进行物体检测的深度迁移学习的新时代!

        在这篇博客中,我们将揭开 AlexNet 论文的神秘面纱并深入讨论其架构,然后亲自实践我们所学到的知识!

二、预备知识⏮️

        本文假设您非常了解 -

  1. 卷积运算
  2. 最大池化、步幅、内核、填充
  3. 神经网络 (CNN) 和激活函数(Softmax、ReLU)
  4. CNN(卷积神经网络) 

如果您已经了解先决条件,请跳过此部分

让我附上一些我学习深度学习基础知识的资源,以帮助您。

  1. 卷积运算——看这个
  2. 卷积神经网络 —观看此内容
  3. 要学习激活函数,请访问我的博客

三、破解八层神兽🤖

        为了更容易理解复杂的架构,我绘制了一个更容易理解的模型架构。在整个博客中仔细遵循架构!

        AlexNet 架构简化(来源-作者)

        让我们把它分解并逐步理解架构——

  1. 从上面绘制的架构中,观察224 x 224 维度以及 3 个通道(红色 (R)、绿色 (G) 和蓝色 (B))的 RGB 图像。它代表任何彩色图像,因此代表我们的输入。
  2. 第 1 层- 在第一层中,我们应用步幅大小为 4 的卷积运算,并具有 96 个大小为 11 x 11 的内核。应用这些操作时,会生成 96 个大小为 55 x 55 的图像(因为我们的内核有 96 个通道) )。这只是一个 3D 张量。
  3. 然后我们应用内核大小为 3x3 且步幅大小为 2 的最大池化。这会生成大小为 27x27、具有 96 个通道的图像。
  4. 第 2 层- 在 AlexNet 的第 2 层中,我们再次应用卷积以及使用 256 个大小为 5x5 的内核进行填充。请注意,我在图中的卷积旁边提到了“相同”。填充中的SAME意味着过滤器将应用于输入的所有元素,并且在模型训练阶段应将填充设置为 SAME。这可确保输出尺寸与输入尺寸相同。这再次产生大小为 27 x 27 的 3D 张量,具有 256 个这样的通道。
  5. 再次,我们应用内核大小为 3x3 的最大池层和大小为 2 的步长,就像我们在第 1 层之后所做的那样。这会生成大小为 13x13、具有 256 个通道的图像。
  6. 第 3 层- 在 AlexNet 的第 3 层中,我们再次应用具有相同填充(如第 2 层中所述)的卷积,其中包含 384 个大小为 3x3 的内核。这会产生大小为13x13、具有 384 个通道的 3D 张量。
  7. 第 4 层- 在第 4 层中,我们应用具有相同填充的卷积,其中包含 384 个大小为 3x3 的内核。这再次产生大小为13x13、具有 384 个通道的 3D 张量。
  8. 第 5 层- 在第 5 层中,我们应用具有相同填充的卷积,其中包含 256 个大小为 3x3 的内核。这再次产生大小为13x13、具有 256 个通道的 3D 张量。
  9. 现在我们再次应用步幅大小为 2 的最大池和 3x3 最大池过滤器(内核)。这会生成尺寸为 6x6、具有 256 个通道的图像。
  10. 第 6,7,8 层 -在 6x6x256 (= 9216) 3D 张量上应用展平操作(尺寸的简单乘积)时,我们只需得到 2 个完全连接的层,然后是最终的 softmax 层来输出我们的类。(请注意,该图有 1000 个输出类,因为它用于对 ImageNet 问题进行分类,该问题有 1000 个类需要识别)

因此,基本上,AlexNet 有 5 个卷积层,后跟 2 个全连接层,最后是用于生成输出的 Softmax 层。

四、为什么 AlexNet 如此酷?!

咬碎纸……

        让我们讨论一些即使在今天也广泛用于深度学习和目标检测的最重要的概念,这些概念在AlexNet论文中介绍过——

  1. AlexNet 论文是第一篇使用强大的非线性激活函数ReLU概念的论文。
  2. Dropout用于防止过度拟合并确保模型在学习中的稳健性和泛化性。
  3. 数据增强用于将数据转换为各种形式(水平/垂直翻转、旋转等),以增强训练数据的多样化。
  4. 使用多个 GPU来训练模型以获得良好的性能指标。

除此之外,AlexNet 论文还使用了一个名为“局部响应归一化”(LRN)的概念,该概念虽然作为一个概念值得注意,但已被“批量归一化”等先进技术进一步取代。

        就我个人而言,我在解决深度学习问题时确实更喜欢批量归一化,但 LRN 的概念是如此美丽,以至于我在研究 AlexNet 论文时无法跳过它。

五、LRN 将神经科学与人工智能连接起来🔮🪄

        我们知道,在使用任何激活函数之前,神经网络的隐藏层希望我们将高维数据归一化为零均值和单位方差,以正确地对数据进行建模。标准化会转换数据集中列的值并对其进行缩放,而不会扭曲值范围的差异或丢失信息。

        使用ReLU之后,即f(x)=max(0,x),你会发现使用ReLU之后得到的值没有像tanh和sigmoid函数那样的范围。因此,ReLU 之后必须进行归一化。研究人员在 AlexNet 论文中提到了一种名为“局部响应归一化”的方法,这对我来说似乎相当有趣,因为它是受到神经科学中一个名为“横向抑制”的重要概念的启发,该概念讨论了活跃神经元对其的作用。周围神经元对特定刺激做出反应。

        假设您已经了解 ReLU 的工作原理,则数据应在 0 和 1 之间标准化,因为在 ReLU 理论中任何 <0 的值都是 0。对于像 ReLU 这样的无界函数(没有最大值),LRN 用于标准化 ReLU 给出的无界激活。

您会惊讶地发现人工神经网络中的 LRN 概念改编自称为横向抑制的神经科学概念。

横向抑制涉及通过兴奋神经元来抑制远处的神经元。

        在我们的中枢神经系统中,兴奋或受刺激的神经元往往会抑制远处神经元的活动,这有助于增强我们的感官知觉(回想一下,当您的注意力集中在目标物体上时,您仍然可以模糊地识别周围环境 - 您仍然可以感知周围的环境)树,同时看着鸟)。这种视觉抑制反过来又增强了视觉图像的感知和对比度。它有助于改善我们观看时的视力和视力(以及听觉、嗅觉等)!

        但是,LRN 与横向抑制有何关联?

来源——作者

        局部响应归一化也是一个涉及卷积神经网络输入特征(特征图)对比度增强的过程。LCN 在特征图(图像)的局部邻域中执行,考虑到每个像素。

        总体概念是增强输入图像或特征图上的“峰值”并抑制“平坦”响应,因为峰值与目标对象或刺激的存在呈正相关,而不是平坦但高频的响应,而不会给出许多数据涉及物体或刺激是否实际存在。因此,LRN 增加了神经感觉对所需刺激的敏感性。

        综上所述,我们可以推断,如果与目标对象/刺激(峰值)存在强相关性,则图像的该局部块(或邻域)中的神经元之间的模拟使得强相关性将抑制弱相关性,从而提升峰值。但如果存在平坦但强的相关性,那么每个强相关性将几乎同等地相互抑制,从而使整个邻域受到阻尼

LRN 过程因此增强了对象检测和识别。

LRN 概念被即将到来的层和批量标准化概念所掩盖(它的影响很小),它标准化特征图的整个层或创建小批量的特征图并标准化每个批次,并且在几乎所有情况下都工作得很好到目前为止的每个神经网络。

至此,我们基本上就完成了研究论文。现在让我们进入有趣的部分。

六、AlexNet 的实践实现👩🏼‍💻

        只需查看架构,我们就可以轻松编写 AlexNet 的架构。下面是相同的代码 -

#import dependencies
import tensorflow as tf
tf.__version__
'2.2.0'
import tensorflow.keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, Dropout, Flatten,Conv2D, MaxPooling2D,BatchNormalization#Create a sequential model
model = Sequential()# 1st Convolutional Layer
model.add(Conv2D(filters=96, input_shape=(227,227,3), kernel_size=(11,11),\strides=(4,4), padding='valid'))
model.add(Activation('relu'))
# Pooling 
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))
# Batch Normalisation before passing it to the next layer
model.add(BatchNormalization())# 2nd Convolutional Layer
model.add(Conv2D(filters=256, kernel_size=(11,11), strides=(1,1), padding='valid'))
model.add(Activation('relu'))
# Pooling
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))
# Batch Normalisation
model.add(BatchNormalization())# 3rd Convolutional Layer
model.add(Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(Activation('relu'))
# Batch Normalisation
model.add(BatchNormalization())# 4th Convolutional Layer
model.add(Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(Activation('relu'))
# Batch Normalisation
model.add(BatchNormalization())# 5th Convolutional Layer
model.add(Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(Activation('relu'))
# Pooling
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))
# Batch Normalisation
model.add(BatchNormalization())# Passing it to a dense layer
model.add(Flatten())
# 1st Dense Layer
model.add(Dense(4096, input_shape=(224*224*3,)))
model.add(Activation('relu'))
# Add Dropout to prevent overfitting
model.add(Dropout(0.4))
# Batch Normalisation
model.add(BatchNormalization())# 2nd Dense Layer
model.add(Dense(4096))
model.add(Activation('relu'))
# Add Dropout
model.add(Dropout(0.4))
# Batch Normalisation
model.add(BatchNormalization())# 3rd Dense Layer
model.add(Dense(1000))
model.add(Activation('relu'))
# Add Dropout
model.add(Dropout(0.4))
# Batch Normalisation
model.add(BatchNormalization())# Output Layer
model.add(Dense(17))
model.add(Activation('softmax'))model.summary()

七、结论 

        希望您在学习 AlexNet 过程中获得乐趣!如果您希望我介绍任何其他神经网络架构或研究论文,请在评论中告诉我!

就这样吧!传奇的 AlexNet 触手可及!

八、参考资料 

我使用了以下资源并附加了链接,以供参考-

  1. AlexNet 论文 (2012)
  2. 横向抑制
  3. LRN

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

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

相关文章

【科研新手指南4】ChatGPT的prompt技巧 心得

ChatGPT的prompt心得 写在最前面chatgpt咒语1&#xff08;感觉最好用的竟然是这个&#xff0c;简单方便快捷&#xff0c;不需要多轮对话&#xff09;chatgpt思维链2&#xff08;复杂任务更适用&#xff0c;简单任务把他弄复杂了&#xff09;机理chatgpt完整咒语1&#xff08;感…

Maven依赖管理项目构建工具的安装与配置

本篇来自尚硅谷的笔记&#xff0c;在线视频观看&#xff1a;Maven依赖管理项目构建工具&#xff0c;更多笔记欢迎访问&#xff1a;小熊学Java 一、Maven简介 1、为什么学习Maven 1.1、Maven是一个依赖管理工具 ①jar 包的规模 随着我们使用越来越多的框架&#xff0c;或者框…

微服务简单理解与快速搭建

分布式和微服务 含义 微服务架构 微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法&#xff0c;每个服务运行在自己的进程中&#xff0c;服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服…

消息队列简介

什么是消息队列?&#xff08;Message queue&#xff0c;简称MQ&#xff09; 从字面理解就是一个保存消息的一个容器。那么我们为何需要这样一个容器呢&#xff1f; 其实就是为了解耦各个系统&#xff0c;我们来举个例子&#xff1a; 有这么一个简单的场景&#xff0c;系统A负…

OpenAI调查ChatGPT故障;向量搜索的优势与局限

&#x1f989; AI新闻 &#x1f680; OpenAI调查ChatGPT故障&#xff0c;发布新AI产品GPTs和GPT-4 Turbo 摘要&#xff1a;OpenAI的ChatGPT和其他服务出现故障&#xff0c;经过调查后发现是由于DDoS攻击导致的异常流量模式。OpenAI在首届开发者大会上发布了新的AI产品GPTs&am…

基于入侵杂草算法优化概率神经网络PNN的分类预测 - 附代码

基于入侵杂草算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于入侵杂草算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于入侵杂草优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

如何使用Cpolar+Tipask,在ubuntu系统上搭建一个私人问答网站

文章目录 前言2.Tipask网站搭建2.1 Tipask网站下载和安装2.2 Tipask网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3 Cpolar稳定隧道&#xff08;本地设置&#xff09; 4. 公网访问测试5. 结语 前…

记忆科技携手中国电信,一站式存储打造坚实数字底座

11月10日&#xff0c;以“数字科技 焕新启航”为主题的2023数字科技生态大会在广州盛大开幕&#xff0c;本次大会由中国电信、广东省人民政府联合举办&#xff0c;是一场数字科技领域的年度盛会。忆联母公司记忆科技作为中国电信的合作伙伴之一受邀参会&#xff0c;深度参与了大…

刘家窑中医医院:鲁卫星主任团队走进社区,免费义诊送健康"

北京丰台刘家窑中医医院&#xff0c;前身为中国医学会航空医学会专家门诊&#xff0c;是一家医保单位&#xff0c;无需定点即可享受医保服务。这是一家集医疗、科研、预防、保健为一体的国家非营利性特色中医院。为了更好地服务社区群众&#xff0c;提高社区居民对健康的关注&a…

数据结构与算法(二)动态规划(Java)

目录 一、简介1.1 什么是动态规划&#xff1f;1.2 动态规划的两种形式1&#xff09;自顶向下的备忘录法&#xff08;记忆化搜索法&#xff09;2&#xff09;自底向上的动态规划3&#xff09;两种方法对比 1.3 动态规划的 3 大步骤 二、小试牛刀&#xff1a;钢条切割2.1 题目描述…

Python开源项目RestoreFormer(++)——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践

有关 Python 和 Anaconda 及 RestoreFormer 运行环境的安装与设置请参阅&#xff1a; Python开源项目CodeFormer——人脸重建&#xff08;Face Restoration&#xff09;&#xff0c;模糊清晰、划痕修复及黑白上色的实践https://blog.csdn.net/beijinghorn/article/details/134…

vscode设置vue3代码格式化

vscode设置vue3代码格式化 vscode设置vue3代码格式化 下载插件设置格式化时选用的插件实际使用 使用Prettier默认配置使用Prettier添加自定义配置使用Volar 完整配置文件参考链接 下载插件 可以使用Volar或Prettier 设置格式化时选用的插件 mac&#xff1a;【shift】【op…

java实现快速排序

图解 快速排序是一种常见的排序算法&#xff0c;它通过选取一个基准元素&#xff0c;将待排序的数组划分为两个子数组&#xff0c;一个子数组中的元素都小于基准元素&#xff0c;另一个子数组中的元素都大于基准元素。然后递归地对子数组进行排序&#xff0c;直到子数组的长度为…

[文件读取]shopxo 文件读取(CNVD-2021-15822)

1.1漏洞描述 漏洞编号CNVD-2021-15822漏洞类型文件读取漏洞等级⭐⭐漏洞环境VULFOCUS攻击方式 描述: ShopXO是一套开源的企业级开源电子商务系统。 ShopXO存在任意文件读取漏洞&#xff0c;攻击者可利用该漏洞获取敏感信息。 1.2漏洞等级 高危 1.3影响版本 ShopXO 1.4漏洞复现…

java实现冒泡排序

冒泡排序是一种简单的排序算法&#xff0c;以下是Java实现示例代码&#xff1a; public static void bubbleSort(int[] array) {int n array.length;for (int i 0; i < n - 1; i) {for (int j 0; j < n - i - 1; j) {// 如果前面的元素比后面的元素大&#xff0c;就交…

行业追踪,2023-11-13

自动复盘 2023-11-13 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

Java怎么对复杂的数据类型排序和比大小

目录 一.对复杂的数据类型比大小 Comparable接口 compareTo方法 二.对复杂数据类型排序 三.总结 一.对复杂的数据类型比大小 假如我们现在有个学生类&#xff0c;并且我们实例化出了俩个学生对象&#xff0c;他们各自有各自的名字和年龄属性&#xff0c;我们如何对他们进…

[文件读取]Druid 任意文件读取 (CVE-2021-36749)

1.1漏洞描述 漏洞编号CVE-2021-36749漏洞类型文件读取漏洞等级⭐⭐⭐漏洞环境VULFOCUS攻击方式 描述: 由于用户指定 HTTP InputSource 没有做出限制&#xff0c;可以通过将文件 URL 传递给 HTTP InputSource 来绕过应用程序级别的限制。攻击者可利用该漏洞在未授权情况下&…

Qt QTableWidget表格的宽度

本文归属于 Qt实验室-CSDN博客 系列文章 默认值 QTableWIdget的表格宽度默认是一个给定值&#xff0c;可以手动调整每列的宽度&#xff0c;也不填满父窗口 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {this->resize(800,600);QStringList contents{&q…

Peter算法小课堂—自定义容器

太戈编程第308题 暴力法 cin>>n>>m; for(int i0;i<n;i) cin>>name[i]>>year[i]; for(int i0;i<m;i){int x;string y;cin>>x>>y;int OK0;for(int j0;j<n;j){if(name[j]y&&year[j]x){OK1;break;}}cout<<OK<<…