【一起深度学习——沐的Resnet】

ops/2024/10/19 9:44:08/

沐神的Resnet

  • 原理图:
  • 实现:
    • 定义残差块:
    • 定义Resnet模型:
    • 运行测试:
    • 输出结果:

原理图:

在这里插入图片描述

实现:

定义残差块:

class Residual(nn.Module):def __init__(self,input_channels,num_channels,use_1x1conv=False,strides=1):super().__init__()"""blk = Residual(3,3)X = torch.rand(4, 3, 6, 6)  (样本数量,通道,高度,宽度)"""# in_channels = 3, num_channels = 3  H2 = (6 -3 + 2*1)/1 +1 = 6 W2 = 6# [4,3,6,6] => [4,3,6,6]self.conv1 = nn.Conv2d(input_channels,num_channels,kernel_size=3,padding=1,stride=strides)# H2 = (6 -3 + 2*1)/1 +1 = 6 W2 = 6# [4,3,6,6] => [4,3,6,6]self.conv2 = nn.Conv2d(num_channels,num_channels,kernel_size=3,padding=1)#若使用1x1的卷积层if use_1x1conv:# H2 = (6- 1) / 1 +1 =6   W2 = 6# [4,3,6,6] => [4,3,6,6]self.conv3 = nn.Conv2d(input_channels,num_channels,kernel_size=1,stride=strides)else:self.conv3 = Noneself.bn1 = nn.BatchNorm2d(num_channels)self.bn2 = nn.BatchNorm2d(num_channels)self.relu = nn.ReLU(inplace=True)def forward(self,x):Y = F.relu(self.bn1(self.conv1(x)))Y = self.bn2(self.conv2(Y))if self.conv3:x = self.conv3(x)Y += xreturn F.relu(Y)

其中,该代码实现了两种不同的网络,一种是x直接传送,另一种是x经过卷积后再进行传送。原理图如下:
在这里插入图片描述

定义Resnet模型:

b1 = nn.Sequential(nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3),nn.BatchNorm2d(64), nn.ReLU(),nn.MaxPool2d(kernel_size=3, stride=2, padding=1))b2 = nn.Sequential(*resnet_block(64, 64, 2, first_block=True))
b3 = nn.Sequential(*resnet_block(64, 128, 2))
b4 = nn.Sequential(*resnet_block(128, 256, 2))
b5 = nn.Sequential(*resnet_block(256, 512, 2))net = nn.Sequential(b1, b2, b3, b4, b5,nn.AdaptiveAvgPool2d((1,1)),nn.Flatten(), nn.Linear(512, 10))

运行测试:


lr, num_epochs, batch_size = 0.05, 10, 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=96)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

输出结果:

loss 0.013, train acc 0.997, test acc 0.917
936.3 examples/sec on cuda:0


http://www.ppmy.cn/ops/38872.html

相关文章

Spark云计算平台Databricks使用,第一个Spark应用程序WordCount

1 上传文件 上传words.txt文件:Spark云计算平台Databricks使用,上传文件-CSDN博客 上传的文件的路径是/FileStore/tables/words.txt,保存在AWS的S3 hello world hello hadoop hello world hello databricks hadoop hive hbase yarn spark …

自存angular 自定义snackbar

定义 1.自定义样式 2.自定义组件 就在要使用snackbar的组件中 在module中引入该组件(重新写一个组件也行的 直接引入就好) 打开这个组件 给这个自定义的组件传参 这个自定义组件接参(类似对话框接参) 使用参数 在这个自定义组件中 做了点击如何关闭s…

【Linux】Centos7配置JDK

1.启动虚拟机、Xshell、Xftp 2.在Xshell中新建一个会话,用于连接到虚拟机中 3.因为虚拟机里自带有JDK,所以需要先卸载自带的JDK 3.1.查询已安装的 jdk 列表 rpm -qa | grep jdk3.2.将查询到的全部删除 yum -y remove XXX(上面查询到的 j…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第18课-购买头榜解密文件锁

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第18课-购买头榜解密文件锁 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世…

【个人博客搭建】(18)使用Quartz.NET 定时备份数据库

Quartz.NET在系统主要承担的一些关键功能: 任务调度:Quartz.NET 允许开发人员创建、调度和管理定时任务,支持简单触发器和Cron表达式等多样化的触发策略。灵活性:Quartz.NET 提供了灵活的任务安排机制,不仅支持基于时间…

最新版rancher环境配置安装和集群搭建详细教程记录

🚀 作者 :“二当家-小D” 🚀 博主简介:⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人,8年开发架构经验,精通java,擅长分布式高并发架构,自动化压力测试,微服务容器化k…

9.为什么有时候会“烫烫烫”——之函数栈桢

目录 1. 什么是函数栈帧 2. 理解函数栈帧能解决什么问题呢? 3. 函数栈帧的创建和销毁解析 3.1 什么是栈? 3.2 认识相关寄存器和汇编指令 3.3 解析函数栈帧的创建和销毁 小知识:烫烫烫~ Q&A 1. 什么是函数栈帧 我们在写C语言代码…

React 基础案例

React的特点&#xff1a; 1、声明式编程 2、组件化开发 3、多平台适配yuan 原生实现&#xff1a; <h2 class"title"></h2><button class"btn">改变文本</button><script>let msg "Hello World";const titleEl d…