当前位置: 首页 > news >正文

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

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

文章目录

  • 前言
  • 一、学习表征
  • 二、AlexNet实现
    • 2.1. 模型设计
    • 2.2. 激活函数
    • 2.3. 容量控制与预处理
    • 2.4. 训练模型
  • 总结


前言

在前面学习了卷积神经网络的基本原理,之后将继续学习现代卷积神经网络架构。而本章将学习其中的AlexNet模型。

参考书:
《动手学深度学习》


一、学习表征

在2012年前,图像特征都是机械地计算出来的。事实上,设计一套新的特征函数、改进结果,并撰写论文是盛极一时的潮流。SIFT 、SURF、HOG(定向梯度直方图)、bags of visual words和类似的特征提取方法占据了主导地位。

有一组研究人员,想法则与众不同:他们认为特征本身应该被学习。此外,他们还认为,在合理地复杂性前提下,特征应该由多个共同学习的神经网络层组成,每个层都有可学习的参数。在机器视觉中,最底层可能检测边缘、颜色和纹理。

事实上,Alex Krizhevsky、Ilya Sutskever和Geoff Hinton提出了一种新的卷积神经网络变体AlexNet。在2012年ImageNet挑战赛中取得了轰动一时的成绩。

AlexNet的更高层建立在这些底层表示的基础上以表示更大的特征,如眼睛、鼻子、草叶等等。而更高的层可以检测整个物体,如人、飞机、狗或飞盘。最终的隐藏神经元(位于全连接层)可以学习图像的综合表示,从而使属于不同类别的数据易于区分

二、AlexNet实现

AlexNet和LeNet的架构非常相似,AlexNet使用了8层卷积神经网络,并以很大的优势赢得了2012年ImageNet图像识别挑战赛。

在这里插入图片描述

AlexNet和LeNet的设计理念非常相似,但也存在显著差异:

  1. AlexNet比相对较小的LeNet5要深得多。AlexNet由八层组成:五个卷积层、两个全连接隐藏层和一个全连接输出层。

  2. AlexNet使用ReLU而不是sigmoid作为其激活函数。

2.1. 模型设计

在AlexNet的第一层,卷积窗口的形状是 11 × 11 11\times11 11×11

由于ImageNet中大多数图像的宽和高比MNIST图像的多10倍以上,因此,需要一个更大的卷积窗口来捕获目标。

第二层中的卷积窗口形状被缩减为 5 × 5 5\times5 5×5,然后是 3 × 3 3\times3 3×3

此外,在第一层、第二层和第五层卷积层之后,加入窗口形状为 3 × 3 3\times3 3×3、步幅为2的最大汇聚层。
而且,AlexNet的卷积通道数目是LeNet的10倍。

在最后一个卷积层后有两个全连接层,分别有4096个输出。

这两个巨大的全连接层拥有将近1GB的模型参数。
由于早期GPU显存有限,原版的AlexNet采用了双数据流设计,使得每个GPU只负责存储和计算模型的一半参数。

2.2. 激活函数

AlexNet将sigmoid激活函数改为更简单的ReLU激活函数。

  1. 一方面,ReLU激活函数的计算更简单,它不需要如sigmoid激活函数那般复杂的求幂运算。
  2. 另一方面,当使用不同的参数初始化方法时,ReLU激活函数使训练模型更加容易。
    当sigmoid激活函数的输出非常接近于0或1时,这些区域的梯度几乎为0,因此反向传播无法继续更新一些模型参数。
    相反,ReLU激活函数在正区间的梯度总是1。

2.3. 容量控制与预处理

AlexNet通过暂退法控制全连接层的模型复杂度,而LeNet只使用了权重衰减。
为了进一步扩充数据,AlexNet在训练时增加了大量的图像增强数据,如翻转、裁切和变色。这使得模型更健壮,更大的样本量有效地减少了过拟合。

代码生成模型架构:

import torch
from torch import nn
from d2l import torch as d2lnet = nn.Sequential(#开始使用一个11×11的卷积窗口来捕获对象,同时步幅为4,以减少输出的宽度和高度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),#使用3个连续的卷积层和较小的卷积窗口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(),#这里,全连接层的输出数量太多,使用暂退层来缓解过拟合nn.Linear(6400,4096),nn.ReLU(),nn.Dropout(p=0.5), #有50%的概率在训练过程中将特征随机置为0nn.Linear(4096,4096),nn.ReLU(),nn.Dropout(p=0.5),#最后的输出层,因为我们使用的是Fashion-MNIST,所以类别数为10,而非论文中的1000nn.Linear(4096,10)
)
#构造一个高度和宽度都为224的单通道数据,来观察每一层输出的形状
X = torch.randn(1,1,224,224)
for layer in net:X = layer(X)print(layer.__class__.__name__,"输出形状为:\t", X.shape)#结果:
Conv2d 输出形状为:	 torch.Size([1, 96, 54, 54])
ReLU 输出形状为:	 torch.Size([1, 96, 54, 54])
MaxPool2d 输出形状为:	 torch.Size([1, 96, 26, 26])
Conv2d 输出形状为:	 torch.Size([1, 256, 26, 26])
ReLU 输出形状为:	 torch.Size([1, 256, 26, 26])
MaxPool2d 输出形状为:	 torch.Size([1, 256, 12, 12])
Conv2d 输出形状为:	 torch.Size([1, 384, 12, 12])
ReLU 输出形状为:	 torch.Size([1, 384, 12, 12])
Conv2d 输出形状为:	 torch.Size([1, 384, 12, 12])
ReLU 输出形状为:	 torch.Size([1, 384, 12, 12])
Conv2d 输出形状为:	 torch.Size([1, 256, 12, 12])
ReLU 输出形状为:	 torch.Size([1, 256, 12, 12])
MaxPool2d 输出形状为:	 torch.Size([1, 256, 5, 5])
Flatten 输出形状为:	 torch.Size([1, 6400])
Linear 输出形状为:	 torch.Size([1, 4096])
ReLU 输出形状为:	 torch.Size([1, 4096])
Dropout 输出形状为:	 torch.Size([1, 4096])
Linear 输出形状为:	 torch.Size([1, 4096])
ReLU 输出形状为:	 torch.Size([1, 4096])
Dropout 输出形状为:	 torch.Size([1, 4096])
Linear 输出形状为:	 torch.Size([1, 10])

手写计算:

在这里插入图片描述

2.4. 训练模型

将AlexNet直接应用于Fashion-MNIST的一个问题是,[Fashion-MNIST图像的分辨率](28×28像素)
(低于ImageNet图像。) 为了解决这个问题,(我们将它们增加到224×224)
(通常来讲这不是一个明智的做法,但在这里这样做是为了有效使用AlexNet架构)

#读取数据集
batch_size = 128
train_iter,test_iter = d2l.load_data_fashion_mnist(batch_size,resize=224)#训练
lr,num_epochs = 0.01,10
d2l.train_ch6(net,train_iter,test_iter,num_epochs,lr,d2l.try_gpu())d2l.plt.show()#结果:
loss 0.328, train acc 0.879, test acc 0.870
26.0 examples/sec on cpu

在这里插入图片描述


总结

AlexNet的架构与LeNet相似,但使用了更多的卷积层和更多的参数来拟合大规模数据集。虽然它已经被更有效的架构所超越,但它是从浅层网络到深层网络的关键一步。
Dropout、ReLU和预处理是提升计算机视觉任务性能的其他关键步骤。

是以圣人不行而知,不见而明,不为而成。

–2023-10-14 进阶篇

相关文章:

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

深度学习——深度卷积神经网络(AlexNet) 文章目录 前言一、学习表征二、AlexNet实现2.1. 模型设计2.2. 激活函数2.3. 容量控制与预处理2.4. 训练模型 总结 前言 在前面学习了卷积神经网络的基本原理,之后将继续学习现代卷积神经网络架构。而本章将学习其…...

提高编程效率-Vscode实用指南

您是否知道全球73%的开发人员依赖同一个代码编辑器? 是的,2023 年 Stack Overflow 开发者调查结果已出炉,Visual Studio Code 迄今为止再次排名第一最常用的开发环境。 “Visual Studio Code 仍然是所有开发人员的首选 IDE,与专业…...

ES 数据库

ES 数据库 通过 API 查询通过 JSON 查询 熟悉 es 的同学都知道 es 一般有两种查询方式 1,在 java 中构建查询对象,调用 es 提供的 api 做查询 2,使用 json 调用接口做查询 查询语句无非是将足够的信息丢给数据库,但是它却和 SQL …...

面试经典150题——Day14

文章目录 一、题目二、题解 一、题目 134. Gas Station There are n gas stations along a circular route, where the amount of gas at the ith station is gas[i]. You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from the ith stati…...

Pika v3.5.1发布!

Pika 社区很高兴宣布,我们今天发布已经过我们生产环境验证 v3.5.1 版本,https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1 。 该版本不仅做了很多优化工作,还引入了多项新功能。这些新功能包括 动态关闭 WAL、ReplicationID…...

Kotlin中的数组

数组是一种常见的数据结构,用于存储相同类型的多个元素。在 Kotlin 中,我们可以使用不同的方式声明、初始化和操作数组。 在 Kotlin 中,有多种方式可以定义和操作数组。我们将通过以下示例代码来展示不同的数组操作: fun main()…...

(3) OpenCV图像处理kNN近邻算法-识别摄像头数字

目录 一、代码简介 二、程序代码 三、使用的图片资源 1、图片digits.png...

上海亚商投顾:沪指震荡调整 转基因概念股逆势大涨

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日低开低走,深成指、创业板指均跌超1%,双双创出年内新低。转基因概念股逆势大涨…...

abap中程序跳转(全)

1.常用 1.CALL TRANSACTION 1.CALL TRANSACTION ta WITH|WITHOUT AUTHORITY-CHECK [AND SKIP FIRST SCREEN]. 其中ta为事务码tcode使用时要打单引号() 2. CALL TRANSACTION ta WITH|WITHOUT AUTHORITY-CHECK USING bdc_tab { {[MODE mode] [UPDATE u…...

启动速度提升 10 倍:Apache Dubbo 静态化方案深入解析

作者:华钟明 文章摘要: 本文整理自有赞中间件技术专家、Apache Dubbo PMC 华钟明的分享。本篇内容主要分为五个部分: -GraalVM 直面 Java 应用在云时代的挑战 -Dubbo 享受 AOT 带来的技术红利 -Dubbo Native Image 的实践和示例 -Dubbo…...

PCB命名规则-allegro

PCB命名规则-allegro 一、焊盘命名规则 1、 贴片矩形焊盘 命名规则:SMD长(L)宽(W)(mil) 举例:SMD90X60 2、 贴片圆焊盘 命名规则:SMDC焊盘直径(D&…...

[架构之路-240]:目标系统 - 纵向分层 - 应用层 - 应用层协议与业务应用程序的多样化,与大自然生物的丰富多彩,异曲同工

目录 前言: - 倒金子塔结构 - 大自然的组成 一、应用层在计算机系统中的位置 1.1 计算机应用程序的位置 1.1.1 业务应用程序概述 1.1.2 应用程序的分类 - 按照计算机作用范围 1.1.3 业务应用程序分类 - 按照行业分类 1.2 网络应用协议的位置 1.2.1 网络协…...

探索数字时代的核心:服务器如何塑造未来并助你成就大业

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...

spring6-资源操作:Resources

资源操作:Resources 1、Spring Resources概述2、Resource接口3、Resource的实现类3.1、UrlResource访问网络资源3.2、ClassPathResource 访问类路径下资源3.3、FileSystemResource 访问文件系统资源3.4、ServletContextResource3.5、InputStreamResource3.6、ByteAr…...

C语言 内存

内存分配 内存分配的类型 C/C中内存分为5个区,分别为栈区、堆区、全局/静态存储区、常量存储区、代码区 静态内存分配:编译时分配,包括全局、静态全局、静态局部三种变量。 动态内存分配:运行时分配,包括栈&#x…...

Java设计模式之备忘录模式

备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不暴露对象内部状态的情况下捕获和恢复对象的内部状态。该模式通过在对象之外保存和恢复对象的状态,使得对象可以在需要时回滚到之前的状态。 在备忘录模式中&#xff…...

深度学习 | Pytorch深度学习实践

一、overview 基于pytorch的深度学习的四个步骤基本如下: 二、线性模型 Linear Model 基本概念 数据集分为测试集和训练集(训练集、开发集)训练集(x,y)测试集只给(x)过拟合&#xf…...

Elasticsearch7.9.3保姆级安装教程

Linux版本Elasticsearch版本(待安装)Kibana版本(待安装)CentOS 77.9.37.9.3 一、下载地址 1、官网下载 打开地址 https://www.elastic.co/cn/downloads/past-releases#elasticsearch,按如图所示选择对应版本即可 2、采用wget下载 为了不必要的麻烦,建…...

深入使用探讨 PuppeteerSharp 抓取 LinkedIn 页面的步骤

LinkedIn是全球最大的职业社交平台之一,拥有大量的用户和企业信息。用户可以在上面建立个人职业资料、与其他用户建立联系、分享职业经验和获取行业动态。由于其庞大的用户群体和丰富的数据资源,开发者们对于获取LinkedIn数据的需求日益增长。 Puppeteer…...

联合体(共用体)

1. 联合类型的定义 联合也是一种特殊的自定义类型。 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间。 2.联合大小的计算 联合的大小 至少是最大成员的大小 。 当最大成员大小不是最大对齐数的整数倍的时候,就要对 齐到最大对齐数…...

TypeScript组件库终极指南:Arco Design类型定义与接口设计最佳实践

TypeScript组件库终极指南:Arco Design类型定义与接口设计最佳实践 【免费下载链接】arco-design A comprehensive React UI components library based on Arco Design 项目地址: https://gitcode.com/gh_mirrors/ar/arco-design Arco Design是一个基于TypeS…...

随着AI和电商重塑消费者购买行为,全球美妆市场增长10%

随着数字优先和AI影响下的全球电商加速发展,线上销售额增速达到线下门店的6倍 全球消费者情报领军企业NielsenIQ (NYSE:NIQ)今日发布《2026年美妆行业现状报告》。报告显示,全球美妆市场同比增长10%,电商销售额增速达到线下门店的6倍。该结果…...

MATLAB图像锐化避坑指南:为什么你的拉普拉斯算子效果总是不对?

MATLAB图像锐化实战:拉普拉斯算子常见误区与专业解决方案 当你在MATLAB中尝试用拉普拉斯算子锐化图像时,是否遇到过这些情况:锐化后图像反而模糊、边缘出现光晕、或者整体对比度异常?这些现象往往源于数据类型处理、核函数选择、叠…...

AMD Ryzen处理器深度调试指南:解锁硬件性能的终极利器

AMD Ryzen处理器深度调试指南:解锁硬件性能的终极利器 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…...

查文献、搭框架、写综述太耗时?试试百考通AI开题报告,高效又安全

开题报告是毕业论文或学位研究的“第一张学术蓝图”,它不仅决定你的选题能否获批,更直接影响后续研究的逻辑性、深度与完成质量。然而,许多学生在撰写时常常感到无从下手:问题意识模糊、文献综述堆砌无主线、研究方法描述空泛、结…...

阿里云物联网平台OTA升级避坑指南:从版本号上报到Bin文件拉取的全流程排错

阿里云物联网平台OTA升级全链路排错实战手册 当设备固件需要远程更新时,OTA技术无疑是救星。但现实往往比理想骨感——版本号莫名失踪、升级包半路"走失"、设备在关键时刻"装聋作哑"。这些问题不仅耽误进度,更可能让生产线停摆。本文…...

炸锅!Claude Code 完整源码意外泄露,51 万行核心代码直接开源!

突发!Claude Code 意外开源 51 万行源码全网曝光 2026 年 3 月 31 日,AI 圈迎来重磅事件 ——Anthropic 旗下 Claude Code 因 npm 配置失误,通过 source map 文件意外泄露全部源码,超 1900 个文件、51.2 万行 TypeScript 代码公开…...

Analog入门指南:如何在5分钟内搭建你的第一个Angular全栈应用

Analog入门指南:如何在5分钟内搭建你的第一个Angular全栈应用 【免费下载链接】analog The fullstack meta-framework for Angular. Powered by Vite and Nitro 项目地址: https://gitcode.com/gh_mirrors/an/analog Analog是一个功能强大的Angular全栈元框架…...

5大理由选择Blueman:Linux蓝牙管理工具的最优解

5大理由选择Blueman:Linux蓝牙管理工具的最优解 【免费下载链接】blueman Blueman is a GTK Bluetooth Manager 项目地址: https://gitcode.com/gh_mirrors/bl/blueman Blueman作为基于GTK框架的Linux蓝牙管理工具,以其深度的桌面环境整合能力、完…...

【微信小程序更新机制全解析】原理、实践与最佳实践

前言 微信小程序的更新机制,是连接开发者版本迭代与用户体验的核心桥梁。它设计的核心逻辑是**“自动无感更新为主,手动强制更新为辅”,在保证小程序快速启动、稳定可用**的前提下,尽可能让用户使用最新版本;同时为开…...