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.mzph.cn/news/28139.shtml

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

相关文章

MIT 6.830数据库系统 -- lab six

MIT 6.830数据库系统 -- lab six 项目拉取引言steal/no-force策略redo log与undo log日志格式和检查点 开始回滚练习1:LogFile.rollback() 恢复练习2:LogFile.recover() 测试结果疑问点分析 项目拉取 原项目使用ant进行项目构建,我已经更改为…

在python中使用nvidia的VPF库对RTSP流进行硬解码并使用opencv进行显示

解码并处理视频流的多线程应用 随着视频处理技术的不断发展,越来越多的应用需要对视频流进行解码和处理。在本文中,我们将介绍一个基于Python的多线程应用程序,该应用程序可以解码并处理多个RTSP视频流,同时利用GPU加速&#xff0…

use gnustep objective-c

first app #import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {NSAutoreleasePool *pool [NSAutoreleasePool new];NSLog("first start");[pool drain];return 0; }tech 专注于概念&#xff0c;而不是迷失在语言技术细节中编程语言…

微服务技术栈(1.0)

微服务技术栈 认识微服务 单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署 优点&#xff1a; 架构简单部署成本低 缺点&#xff1a; 耦合度高 分布式架构 分布式架构&#xff1a;根据业务功能对系统进行拆分&#xff0c…

npm四种下载方式的区别

npm install moduleName 命令 安装模块到项目node_modules目录下。 不会将模块依赖写入devDependencies或dependencies 节点。 运行 npm install 初始化项目时不会下载模块。npm install -g moduleName 命令 安装模块到全局&#xff0c;不会在项目node_modules目录中保存模块包…

如何在 Spring Boot 中集成日志框架 SLF4J、Log4j

文章目录 具体步骤附录 笔者的操作环境&#xff1a; Spring Cloud Alibaba&#xff1a;2022.0.0.0-RC2 Spring Cloud&#xff1a;2022.0.0 Spring Boot&#xff1a;3.0.2 Nacos 2.2.3 Maven 3.8.3 JDK 17.0.7 IntelliJ IDEA 2022.3.1 (Ultimate Edition) 具体步骤 因为 …

Java课题笔记~ 使用 Spring 的事务注解管理事务(掌握)

通过Transactional 注解方式&#xff0c;可将事务织入到相应 public 方法中&#xff0c;实现事务管理。 Transactional 的所有可选属性如下所示&#xff1a; propagation&#xff1a;用于设置事务传播属性。该属性类型为 Propagation 枚举&#xff0c; 默认值为 Propagation.R…

【学习日记】【FreeRTOS】链表结构体及函数详解

写在前面 本文主要是对于 FreeRTOS 中链表相关内容的详细解释&#xff0c;代码大部分参考了野火FreeRTOS教程配套源码&#xff0c;作了一小部分修改。 一、结构体定义 主要包含三种结构体&#xff1a; 普通节点结构体结尾节点&#xff08;mini节点&#xff09;结构体链表结…

awk经典实战、正则表达式

目录 1.筛选给定时间范围内的日志 2.统计独立IP 案列 需求 代码 运行结果 3.根据某字段去重 案例 运行结果 4.正则表达式 1&#xff09;认识正则 2&#xff09;匹配字符 3&#xff09;匹配次数 4&#xff09;位置锚定&#xff1a;定位出现的位置 5&#xff09;分组…

ESP32 Max30102 (3)修复心率误差

1. 运行效果 2. 新建修复心率误差.py 代码如下: from machine import sleep, SoftI2C, Pin, Timer from utime import ticks_diff, ticks_us from max30102 import MAX30102, MAX30105_PULSE_AMP_MEDIUM from hrcalc import calc_hr_and_spo2BEATS = 0 # 存储心率 FINGER_F…

如何识别手机是否有灵动岛(dynamic island)

如何识别手机是否有灵动岛&#xff08;dynamic island&#xff09; 灵动岛是苹果2022年9月推出的iPhone 14 Pro、iPhone 14 Pro Max首次出现&#xff0c;操作系统最低是iOS16.0。带灵动岛的手机在竖屏时顶部工具栏大于等于51像素。 #define isHaveDynamicIsland ({ BOOL isH…

Taro保存图片到手机

萌新亚历山大啊&#xff0c;搞了一下午&#xff0c;真多坑 Taro.downloadFile({url: res,filePath: Taro.env.USER_DATA_PATH /xcxcode.jpg,success: res > {if (res.statusCode 200) {console.log(res)const tempFilePath res.filePath; // 获取下载的临时文件路径// …

编程(Leetcode, SQL)知识

有志者&#xff0c;事竟成 1. Nim游戏 2. sql中求连续时间的问题 思路&#xff1a;一般来说&#xff0c;有两种方向。一种如果是日期的格式&#xff0c;求连续时间可以先提取出日期中的月份或者天&#xff0c;然后减去row_number()生成的rank&#xff0c;以此来计算分组或者不…

微信小程序的项目解构

视频链接 黑马程序员前端微信小程序开发教程&#xff0c;微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)_哔哩哔哩_bilibili 接口文档 https://www.escook.cn/docs-uni-shop/mds/1.start.html 1&#xff1a;微信小程序宿主环境 1&#xff1a;常见的宿…

如何创建Google test shared library(dll)和static library(lib),并编写测试用例

从Github下载google test源码确保本地安装Visual Studio和CMake GUI&#xff0c;本次测试使用VS2017及Cmake GUI 3.20.5解压googletest-main&#xff0c;打开Cmake GUI&#xff0c;配置源码路径&#xff08;googletest-main路径&#xff09;&#xff0c;和生成路径&#xff08;…

安达发制造工业迈向智能化:APS高级计划排程助力提升生产效率

随着市场竞争的加剧&#xff0c;制造企业纷纷寻求提高生产效率和降低成本的方法。近年来&#xff0c;越来越多的制造企业开始采用APS(高级计划与排程)系统&#xff0c;以优化生产计划和排程&#xff0c;提高生产效率&#xff0c;并在竞争中取得优势。 现代制造业通常面临复杂的…

【第一阶段】kotlin的range表达式

range:范围&#xff1a;从哪里到哪里的意思 in:表示在 !in&#xff1a;表示不在 … :表示range表达式 代码示例&#xff1a; fun main() {var num:Int20if(num in 0..9){println("差劲")}else if(num in 10..59){println("不及格")}else if(num in 60..89…

【深入了解pytorch】PyTorch强化学习:强化学习的基本概念、马尔可夫决策过程(MDP)和常见的强化学习算法

【深入了解pytorch】PyTorch强化学习:强化学习的基本概念、马尔可夫决策过程(MDP)和常见的强化学习算法 PyTorch强化学习:介绍强化学习的基本概念、马尔可夫决策过程(MDP)和常见的强化学习算法引言强化学习的基本概念状态(State)动作(Action)奖励(Reward)策略(Pol…

c语言每日一练(3)

前言&#xff1a;每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;暑假时三天之内必有一更&#xff0c;到了开学之后&#xff0c;将看学业情…

MySQL数据库的操作

MySQL 连接服务器 库的操作创建数据库数据库删除查看数据库进入数据库查看所在的数据库修改数据库显示创建语句查看连接情况 表的操作创建表查看数据库所有的表查看表的详细信息查看创建表时的详细信息删除表修改表名向表中插入数据在表结构中新增一列对表结构数据的修改删除表…