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

动手学深度学习(pytorch)学习记录27-深度卷积神经网络(AlexNet)[学习记录]

目录

  • 创建模型
  • 读取数据集
  • 训练AlexNet

AlexNet 是由 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 在 2012 年提出的深度卷积神经网络,它在当年的 ImageNet 大规模视觉识别挑战赛(ILSVRC)中取得了显著的成绩,从而引起了深度学习和卷积神经网络(CNN)在计算机视觉领域的广泛关注。AlexNet 的成功标志着深度学习在图像识别和分类任务中的一个重大突破,它采用了以下关键技术和创新:

  • ReLU激活函数:AlexNet 首次在大规模的深度网络中使用了 Rectified Linear Unit(ReLU)激活函数,这有助于解决梯度消失问题,并加速了网络的训练过程。
  • Dropout 正则化:为了防止过拟合,AlexNet 引入了 Dropout 技术,这是一种在训练过程中随机丢弃一部分神经元的技术。
  • 最大池化层:AlexNet 使用了最大池化层来降低特征的空间尺寸,同时保持重要的特征信息。
    数据增强:为了提高模型的泛化能力,AlexNet 采用了图像数据增强技术,包括随机裁剪和水平翻转。
  • GPU 加速:AlexNet 利用了 GPU 并行计算的能力,显著提高了训练速度。
  • 深度架构:AlexNet 采用了8层深度网络结构,包括5个卷积层和3个全连接层,这在当时是一个相对较深的网络。
  • 局部响应归一化(LRN):在某些卷积层之后,AlexNet 使用了局部响应归一化来增强网络的泛化能力。

AlexNet 的成功不仅推动了深度学习在图像识别领域的研究,也为后续的深度学习模型,如 VGG、GoogLeNet 和 ResNet 等奠定了基础。它的出现是深度学习历史上的一个重要里程碑。

import torch
from torch import nn
from d2l import torch as d2l

创建模型

# 搭建网络
net = 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),nn.Flatten(),# 这里,全连接层的输出数量是LeNet中的好几倍。使用dropout层来减轻过拟合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,而非论文中的1000nn.Linear(4096, 10))

构造高度和宽度都为224的单通道数据,观察每一层的输出形状是否符合预期

X = torch.randn(1, 1, 224, 224)
for layer in net:X=layer(X)print(layer.__class__.__name__,'output shape:\t',X.shape)
Conv2d output shape:	 torch.Size([1, 96, 54, 54])
ReLU output shape:	 torch.Size([1, 96, 54, 54])
MaxPool2d output shape:	 torch.Size([1, 96, 26, 26])
Conv2d output shape:	 torch.Size([1, 256, 26, 26])
ReLU output shape:	 torch.Size([1, 256, 26, 26])
MaxPool2d output shape:	 torch.Size([1, 256, 12, 12])
Conv2d output shape:	 torch.Size([1, 384, 12, 12])
ReLU output shape:	 torch.Size([1, 384, 12, 12])
Conv2d output shape:	 torch.Size([1, 384, 12, 12])
ReLU output shape:	 torch.Size([1, 384, 12, 12])
Conv2d output shape:	 torch.Size([1, 256, 12, 12])
ReLU output shape:	 torch.Size([1, 256, 12, 12])
MaxPool2d output shape:	 torch.Size([1, 256, 5, 5])
Flatten output shape:	 torch.Size([1, 6400])
Linear output shape:	 torch.Size([1, 4096])
ReLU output shape:	 torch.Size([1, 4096])
Dropout output shape:	 torch.Size([1, 4096])
Linear output shape:	 torch.Size([1, 4096])
ReLU output shape:	 torch.Size([1, 4096])
Dropout output shape:	 torch.Size([1, 4096])
Linear output shape:	 torch.Size([1, 10])

读取数据集

本文使用Fashion-MNIST, 为了利用AlexNet的架构,将Fashion-MNIST的图像放大到224×224

batch_size = 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)

训练AlexNet

经验表明,随着网络规模的增大,适当降低学习率有助于获得更好的训练结果,与前一篇文章相比,使用了更低的学习率

lr, num_epochs = 0.01, 10
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

在这里插入图片描述

· 本文使用了大量d2l包,这极大地减少了代码编辑量,需要安装d2l包才能运行本文代码

封面图片来源
欢迎点击我的主页查看更多文章。
本人学习地址https://zh-v2.d2l.ai/
恳请大佬批评指正。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 农业小气候观测站
  • 【python】 @property属性详解 and mysql的sqlalchemy的原生sql
  • PIN AI获得a16z CSX、Hack VC和全明星天使的1000万美元融资,推出个人AI开放平台
  • HarmonyOS开发之Swiper的使用(跳转到指定索引的方法)
  • 【百日算法计划】:每日一题,见证成长(011)
  • 第二章:表操作
  • 从生成器函数Generator出发,聊聊Async await
  • 多线程相关面试题
  • 免费扫描试卷的软件有哪些?5个软件帮助你轻松进行试卷扫描
  • GO HTTP库使用
  • Jmeter_循环获取请求接口的字段,并写入文件
  • golang学习笔记11——Go 语言的并发与同步实现详解
  • 信号与槽,QMainWindow中常用类的使用
  • SpringCache源码解析(三)——@EnableCaching
  • Vue 中实现视频播放的艺术
  • 分享的文章《人生如棋》
  • [译]前端离线指南(上)
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 07.Android之多媒体问题
  • 0基础学习移动端适配
  • angular2 简述
  • AWS实战 - 利用IAM对S3做访问控制
  • axios 和 cookie 的那些事
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • express如何解决request entity too large问题
  • Java多线程(4):使用线程池执行定时任务
  • java小心机(3)| 浅析finalize()
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • redis学习笔记(三):列表、集合、有序集合
  • Shadow DOM 内部构造及如何构建独立组件
  • ucore操作系统实验笔记 - 重新理解中断
  • VuePress 静态网站生成
  • Web Storage相关
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 给初学者:JavaScript 中数组操作注意点
  • 码农张的Bug人生 - 初来乍到
  • 前端性能优化--懒加载和预加载
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 数组的操作
  • 提醒我喝水chrome插件开发指南
  • 鱼骨图 - 如何绘制?
  • 《码出高效》学习笔记与书中错误记录
  • 翻译 | The Principles of OOD 面向对象设计原则
  • #include<初见C语言之指针(5)>
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $forceUpdate()函数
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (vue)页面文件上传获取:action地址
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联