【自学记录5】【Pytorch2.0深度学习从零开始学 王晓华】第五章 基于Pytorch卷积层的MNIST分类实战

本文主要是介绍【自学记录5】【Pytorch2.0深度学习从零开始学 王晓华】第五章 基于Pytorch卷积层的MNIST分类实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

5.1.2 PyTorch2.0中卷积函数实现详解

1、torch.nn.Conv2d

in_channels=3: 输入的通道数,对应图像的3个颜色通道。
out_channels=10: 输出的通道数,即卷积后我们想要得到的特征图的数量。
kernel_size=3: 卷积核的大小,这里使用的是3x3的卷积核。
stride=2: 卷积核移动的步长,这里步长为2,意味着卷积核每次移动2个像素。
padding=1: 在图像边缘添加的填充像素数。这通常用于保持输出尺寸,或确保卷积核可以到达图像的边缘。

源码\第二章\ 5_1_2.py

import torch
image = torch.randn(size=(5,3,128,128))
#下面是定义的卷积层例子
"""
输入维度:3
输出维度:10
卷积核大小:3
步长:2
补偿方式:维度不变补偿(指的是图像大小(宽高))
"""
conv2d = torch.nn.Conv2d(3,10,kernel_size=3,stride=2,padding=1)
image_new = conv2d(image)
print(image_new.shape)

2、池化torch.nn.AvgPool2d

pool = torch.nn.AvgPool2d(kernel_size=3,stride=2,padding=0)
创建一个AvgPool2d对象,用于对image进行平均池化。参数说明:
kernel_size=3:池化窗口的大小是3x3。
stride=2:池化窗口的步长是2,意味着池化窗口每次移动2个像素。
padding=0:不使用填充。

image_pooled = torch.nn.AdaptiveAvgPool2d(1)(image)#全局池化
AdaptiveAvgPool2d是一种特殊的池化层,它可以将任何大小的输入张量调整为指定的输出大小。这里,我们指定输出大小为(1, 1)`,这实际上是一个全局池化操作,因为无论输入张量的空间维度是多少,输出都只有一个元素。这通常用于从特征图中提取全局特征。

import torch
image =torch.full((1, 3, 5, 5), 10.0)  #生成大小为(1, 3, 3, 3),元素全为3的数组
pool = torch.nn.AvgPool2d(kernel_size=3,stride=2,padding=0)
image_pooled = pool(image)
print(image_pooled.shape)
print(image_pooled)image_pooled = torch.nn.AdaptiveAvgPool2d(1)(image)#全局池化
print(image_pooled.shape)
print(image_pooled)

5.2 实战:基于卷积的MNIST手写体分类

5.2.1数据准备

前几章是对数据进行“折叠”处理

# 数据处理
# 1. 改变输入数据尺寸, (图片数量,28,28) -> (图片数量,784) ,即图片由平面变成了直线
x_train = x_train.reshape(-1,784)
x_test = x_test.reshape(-1,784)

现在需要对数据升维,突出通道。(图片数量,28,28) -> (图片数量,1,28,28),第二维指的是图片的维度/通道,channel=1。

x_train = np.expand_dims(x_train,axis=1)

以上都是对数据进行修正,能够更好的适应不同的模型嘛!

5.2.2 模型设计

源码\第三章\5_2_2.py

import torch
import torch.nn as nn
import numpy as np
import einops.layers.torch as eltclass MnistNetword(nn.Module):def __init__(self):super(MnistNetword, self).__init__()self.convs_stack = nn.Sequential(nn.Conv2d(1,12,kernel_size=7),  #第一个卷积层nn.ReLU(),nn.Conv2d(12,24,kernel_size=5),  #第二个卷积层nn.ReLU(),nn.Conv2d(24,6,kernel_size=3)  #第三个卷积层)#最终分类器层self.logits_layer = nn.Linear(in_features=1536,out_features=10)def forward(self,inputs):image = inputsx = self.convs_stack(image)#elt.Rearrange的作用是对输入数据维度进行调整,读者可以使用torch.nn.Flatten函数完成此工作x = elt.Rearrange("b c h w -> b (c h w)")(x)logits = self.logits_layer(x)return logits
model = MnistNetword()
torch.save(model,"model.pth")

5.2.3基于卷积的MNIST分类模型

没有什么特别难的,就是用了卷积处理图像,再把数据送到全连接层,除了模型设计,之后的操作(分类、训练、backward跟第三章一样)

import torch
import torch.nn as nn
import numpy as np
import einops.layers.torch as elt#载入数据
x_train = np.load("../dataset/mnist/x_train.npy")
y_train_label = np.load("../dataset/mnist/y_train_label.npy")x_train = np.expand_dims(x_train,axis=1)
print(x_train.shape)class MnistNetword(nn.Module):def __init__(self):super(MnistNetword, self).__init__()self.convs_stack = nn.Sequential(nn.Conv2d(1,12,kernel_size=7),nn.ReLU(),nn.Conv2d(12,24,kernel_size=5),nn.ReLU(),nn.Conv2d(24,6,kernel_size=3))self.logits_layer = nn.Linear(in_features=1536,out_features=10)def forward(self,inputs):image = inputsx = self.convs_stack(image)x = elt.Rearrange("b c h w -> b (c h w)")(x)logits = self.logits_layer(x)return logitsdevice = "cuda" if torch.cuda.is_available() else "cpu"
#注意记得需要将model发送到GPU计算
model = MnistNetword().to(device)
#model = torch.compile(model)
loss_fn = nn.CrossEntropyLoss()optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)batch_size = 128
for epoch in range(42):train_num = len(x_train)//128train_loss = 0.for i in range(train_num):start = i * batch_sizeend = (i + 1) * batch_sizex_batch = torch.tensor(x_train[start:end]).to(device)y_batch = torch.tensor(y_train_label[start:end]).to(device)pred = model(x_batch)loss = loss_fn(pred, y_batch)optimizer.zero_grad()loss.backward()optimizer.step()train_loss += loss.item()  # 记录每个批次的损失值# 计算并打印损失值train_loss /= train_numaccuracy = (pred.argmax(1) == y_batch).type(torch.float32).sum().item() / batch_sizeprint("epoch:",epoch,"train_loss:", round(train_loss,2),"accuracy:",round(accuracy,2))

这篇关于【自学记录5】【Pytorch2.0深度学习从零开始学 王晓华】第五章 基于Pytorch卷积层的MNIST分类实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/871790

相关文章

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Pandas使用AdaBoost进行分类的实现

《Pandas使用AdaBoost进行分类的实现》Pandas和AdaBoost分类算法,可以高效地进行数据预处理和分类任务,本文主要介绍了Pandas使用AdaBoost进行分类的实现,具有一定的参... 目录什么是 AdaBoost?使用 AdaBoost 的步骤安装必要的库步骤一:数据准备步骤二:模型

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor