7.1 动手实现AlexNet

AlexNet引入了dropput层
在这里插入图片描述

代码


import torch
from torch import nn
from d2l import torch as d2lnet = nn.Sequential(# 样本数为1,通道数为96,11x11的卷积核,步幅为4,减少输出的高度和深度。 LeNet的通道数才6,此处96,为什么要增加这么多通道呢?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(),# 相对于LeNet,全连接增加了几倍,用dropout来减少过拟合nn.Linear(6400,4096),nn.ReLU(),nn.Dropout(p=0.5),nn.Linear(4096,4096),nn.ReLU(),nn.Dropout(p=0.5),nn.Linear(4096,10)
)# 样本数为1,通道数为1,224x224
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的图片是28x28,为了满足AlexNet的输出,resize为224x224,通常来说这样并不好
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,device=d2l.try_gpu())

运行结果:

在这里插入图片描述

当训练轮数增加到20的结果

# 训练
lr,num_epochs = 0.01,20
d2l.train_ch6(net,train_iter,test_iter,num_epochs,lr,device=d2l.try_gpu())

在这里插入图片描述
结果提升了2点多。

改变模型的前两层,使模型可以直接输入28x28的图片

# 将输入由224变成28
net = nn.Sequential(nn.Conv2d(1,96,kernel_size=5,padding=2),nn.ReLU(),# 样本数为1,通道数为96,11x11的卷积核,步幅为4,减少输出的高度和深度。 LeNet的通道数才6,此处96,为什么要增加这么多通道呢?nn.MaxPool2d(kernel_size=3,stride=1),# 减小卷积窗口,使用填充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(),# 相对于LeNet,全连接增加了几倍,用dropout来减少过拟合nn.Linear(6400,4096),nn.ReLU(),nn.Dropout(p=0.5),nn.Linear(4096,4096),nn.ReLU(),nn.Dropout(p=0.5),nn.Linear(4096,10)
)
X = torch.randn(1,1,28,28)
for layer in net:X = layer(X)print(layer.__class__.__name__,'output shape:\t',X.shape)
Conv2d output shape:	 torch.Size([1, 96, 28, 28])
ReLU output shape:	 torch.Size([1, 96, 28, 28])
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的图片是28x28,为了满足AlexNet的输出,resize为224x224,通常来说这样并不好
batch_size = 128
# train_iter,test_iter = d2l.load_data_fashion_mnist(batch_size,resize=224)
train_iter,test_iter = d2l.load_data_fashion_mnist(batch_size)# 训练
lr,num_epochs = 0.01,20
d2l.train_ch6(net,train_iter,test_iter,num_epochs,lr,device=d2l.try_gpu())

在这里插入图片描述
结果下降了1点左右

AlexNet哪一部分主要占用显存?哪一层占用最多的显存?

AlexNet里面不同层需要的参数大小决定了占用显存的大小

  第一层卷积层卷积核参数个数:11x11x3x96=34,848第二层卷积层卷积核参数个数:5x5x96x256=614,400第三层卷积层卷积核参数个数:3x3x256x384=884,736第四层卷积层卷积核参数个数:3x3x384x384=1,327,104第五层卷积层卷积核参数个数:3x3x384x256=884,736第一层全连层参数(权重+偏移):6400x4096+4096=26,218,496第二层全连层参数(权重+偏移):4096x4096+4096=16,781,312第三层全连层参数(权重+偏移):4096x1000+1000=4,100,096

所以是第一层全连层占用了最多的显存

在AlexNet中主要是哪部分需要更多的计算?

把运算分为乘法运算、加法运算和特殊运算(ReLu、池化)卷积层的计算次数:Ci x Co x Kw x Kh x Nw x Nh + Ci x Co x (Kw x Kh -1)x Nw x Nh + Co x (Ci-1) x Nw x Nh
池化层的计算次数:Nh x Nw x Ci
全连接层的计算次数:权重与变量相乘、结果相加、偏置项第一层卷积层计算次数:3x96x(2x11x11-1)x54x54+96x2x54x54=202,953,600
第一层卷积层的池化层计算次数:26x26x96=64896
第二层卷积层卷计算次数:96*256*(2*5*5-1)*26*26+256*95*26*26=830,495,744
第二层卷积层的池化层计算次数:12x12x256=36864
第三层卷积层计算次数:256*384*(2*3*3-1)*12*12+384*255*12*12=254748672
第四层卷积层计算次数:384*384*(2*3*3-1)*12*12+384*383*12*12=382150656
第五层卷积层计算次数:384*256*(2*3*3-1)*12*12+256*383*12*12=254767104
第五层卷积层池化层计算次数:5x5x256=6400
第一层全连层计算次数:6400*4096+4096*(6400-1)+4096=52,428,800
第二层全连层计算次数:4096*4096+4096*(4096-1)+4096=33,554,432
第三层全连层计算次数:1000*4096+1000*4095+1000=8,192,000第二层卷积层需要最多次数的计算,卷积层的运算次数与输入通道数、输出通道数、图片大小、卷积核大小都有关。

参考链接

【动手学深度学习】之 现代卷积神经网络 AlexNet VGGNet NIN 习题解答
https://blog.csdn.net/weixin_51580530/article/details/128619145

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

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

相关文章

Python-OpenCV中的图像处理-颜色空间转换

Python-OpenCV中的图像处理-颜色空间转换 颜色空间转换获取HSV的值 颜色空间转换 在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会 发现我们经常用到的也就两种: BGR G r a y 和 B G R Gray 和 BGR Gray和BGRHSV。 注意:在 OpenCV 的…

python ffmpeg合并ts文件

当你从网站下载了一集动漫,然后发现是一堆ts文件,虽然可以打开,但是某个都是10秒左右,很不方便。 这时,可以用python合并ts文件。 (1)安装配置ffmpeg 官网下载ffmpeg-2023-08-07-git-d295b6b…

【80天学习完《深入理解计算机系统》】第二天 2.2 整数的表示【有符号数,无符号数,符号数的扩展,有无符号数的转变】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

鉴源实验室丨SOME/IP协议安全攻击

作者 | 张昊晖 上海控安可信软件创新研究院工控网络安全组 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 01 引 言 随着汽车行业对于数据通信的需求不断增加,SOME/IP作为支持汽车以太网进程和设备间通信的一种通信协议应…

python爬虫3:requests库-案例1

python爬虫3:requests库-案例1 前言 ​ python实现网络爬虫非常简单,只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点,方便以后复习。 申明 ​ 本系列所涉及的代码仅用于个人研究与讨论,并不会对网…

.NET 应用程序 部署

**硬件支持型号 点击 查看 硬件支持 详情** DTU701 产品详情 DTU702 产品详情 DTU801 产品详情 DTU802 产品详情 DTU902 产品详情 G5501 产品详情 本文内容 在设备上部署 dotnet应用,与任何其他平台的部署相同,可以2种方式: 依赖于框…

百度智能创做AI平台

家人们好,在数字化时代,人工智能正引领着一场前所未有的创新浪潮。今天,我们将为大家介绍百度智能创做AI平台,这个为创意赋能、助力创作者的强大工具。无论你是创意工作者、内容创作者,还是想要释放内心创造力的个人&a…

功能上新|全新GPU性能优化方案

GPU优化迎来了全新的里程碑!我们深知移动游戏对高品质画面的追求日益升温,因此UWA一直着眼于移动设备GPU性能优化,以确保您的游戏体验尽善尽美。然而,不同GPU芯片之间的性能差异及可能导致的GPU瓶颈问题,让优化工作变得…

【网络】自定义协议 | 序列化和反序列化 | Jsoncpp

本文首发于 慕雪的寒舍 以tcpServer的计算器服务为例,实现用jsoncpp来进行序列化和反序列化 阅读本文之前,请先阅读 自定义协议 | 序列化和反序列化 | 以tcpServer为例 1.安装jsoncpp 我所用的系统是centos7.6,先用下面的命令查找相关的包 …

解决GitHub超时上不去

Github对于开发者开发者开发者来说肯定不陌生,但是Github 经常连接不上显示超时,一般都是节点ip的问题。本文主要介绍一下如何通过修改 Hosts 提升 Github 访问速度。之前在 Hosts 文件有加入过节点,不过容易失效,所以自己得常更新…

HR专家:未来零代码开发将成求职热门,你准备好了吗?

一名五十五岁的农民,毫无程式设计经验,靠著自己自学零码开发,竟为他的家乡建起了六个数位资讯系统,其中一个更是带动了乡村“厕所革命”。阿里云说,“也许10-15年以前,公司的招聘会要求员工能够使用 WORD, …

中级课程——XSS

文章目录 介绍挖掘思路分类反射型存储型dom类型 介绍 挖掘思路 注入点:各种输入框 测试代码(poc):js语句 分类 反射型 存储型 dom类型

【并发编程】无锁环形队列Disruptor并发框架使用

Disruptor 是苹国外厂本易公司LMAX开发的一个高件能列,研发的初夷是解决内存队列的延识问顾在性能测试中发现竟然与10操作处于同样的数量级),基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCn演讲后,获得了业界关注…

Unity面板究极优化

首先对于大项目来说UI首选一定的UGUI,目前没有啥可选的余地。多一点都是对性能的负担,UGUI底层基于多线程技术,可以有效分担压力,对于一些不是那么重的面板几乎无感。 无论其他面板只是在此基础上修改的,但每多一层&am…

【李宏毅机器学习·学习笔记】Tips for Training: Adaptive Learning Rate

本节课主要介绍了Adaptive Learning Rate的基本思想和方法。通过使用Adaptive Learning Rate的策略,在训练深度神经网络时程序能实现在不同参数、不同iteration中,学习率不同。 本节课涉及到的算法或策略有:Adgrad、RMSProp、Adam、Learning …

数据结构之时间复杂度-空间复杂度

大家好,我是深鱼~ 目录 1.数据结构前言 1.1什么是数据结构 1.2什么是算法 1.3数据结构和算法的重要性 1.4如何学好数据结构和算法 2.算法的效率 3.时间复杂度 3.1时间复杂度的概念 3.2大O的渐进表示法 【实例1】:双重循环的时间复杂度&#xf…

一文解决JWT相同签名不匹配问题【JWT signature does not match locally computed signature.】

今天做项目的时候,涉及到一个支付记账的功能,想着不能将这些金额数据显示暴露的通过常规的请求体封装来进行传输,想着要是被中途抓包修改了不就麻烦了,所以考虑到这种安全性的需求,就利用上了JWT来进行数据的封装传递&…

Dubbo基于springboot学习笔记

本文参考:【优极限】最透彻的Dubbo教程(dubbo经典之作完整版),阿里分布式框架dubbo零基础实战教学_手把手地啊你读懂底层源码【完整版】_哔哩哔哩_bilibili 1、 互联网架构演变 (1)单一应用架构 把系统中…

AWS——03篇(AWS之Amazon S3(云中可扩展存储)-01入门)

AWS——03篇(AWS之Amazon S3(云中可扩展存储)-01入门) 1. 前言2. 关于 Amazon S32.1 介绍2.1.1 简述2.1.2 详细介绍 2.2 Amazon S3 好处和功能2.3 3. 创建S3存储桶3.1 创建存储桶3.2 修改访问权限 4. 简单实用4.1 上传图片文件4.2…

2023年深度学习最新研究成果

LLMs领域 AGI领域 无剑芯片设计平台 三级标题 四级标题 五级标题 六级标题