【超详细】深度学习的Hello World:使用pytroch训练一个自定义的手写体数字识别模型完整流程【附数据集与完整源码】

news2024/9/21 4:23:28

《博主简介》

小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。
👍感谢小伙伴们点赞、关注!

《------往期经典推荐------》

一、AI应用软件开发实战专栏【链接】

项目名称项目名称
1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】
3.【手势识别系统开发】4.【人脸面部活体检测系统开发】
5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】
7.【YOLOv8多目标识别与自动标注软件开发】8.【基于YOLOv8深度学习的行人跌倒检测系统】
9.【基于YOLOv8深度学习的PCB板缺陷检测系统】10.【基于YOLOv8深度学习的生活垃圾分类目标检测系统】
11.【基于YOLOv8深度学习的安全帽目标检测系统】12.【基于YOLOv8深度学习的120种犬类检测与识别系统】
13.【基于YOLOv8深度学习的路面坑洞检测系统】14.【基于YOLOv8深度学习的火焰烟雾检测系统】
15.【基于YOLOv8深度学习的钢材表面缺陷检测系统】16.【基于YOLOv8深度学习的舰船目标分类检测系统】
17.【基于YOLOv8深度学习的西红柿成熟度检测系统】18.【基于YOLOv8深度学习的血细胞检测与计数系统】
19.【基于YOLOv8深度学习的吸烟/抽烟行为检测系统】20.【基于YOLOv8深度学习的水稻害虫检测与识别系统】
21.【基于YOLOv8深度学习的高精度车辆行人检测与计数系统】22.【基于YOLOv8深度学习的路面标志线检测与识别系统】
23.【基于YOLOv8深度学习的智能小麦害虫检测识别系统】24.【基于YOLOv8深度学习的智能玉米害虫检测识别系统】
25.【基于YOLOv8深度学习的200种鸟类智能检测与识别系统】26.【基于YOLOv8深度学习的45种交通标志智能检测与识别系统】
27.【基于YOLOv8深度学习的人脸面部表情识别系统】28.【基于YOLOv8深度学习的苹果叶片病害智能诊断系统】
29.【基于YOLOv8深度学习的智能肺炎诊断系统】30.【基于YOLOv8深度学习的葡萄簇目标检测系统】
31.【基于YOLOv8深度学习的100种中草药智能识别系统】32.【基于YOLOv8深度学习的102种花卉智能识别系统】
33.【基于YOLOv8深度学习的100种蝴蝶智能识别系统】34.【基于YOLOv8深度学习的水稻叶片病害智能诊断系统】
35.【基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统】36.【基于YOLOv8深度学习的智能草莓病害检测与分割系统】
37.【基于YOLOv8深度学习的复杂场景下船舶目标检测系统】38.【基于YOLOv8深度学习的农作物幼苗与杂草检测系统】
39.【基于YOLOv8深度学习的智能道路裂缝检测与分析系统】40.【基于YOLOv8深度学习的葡萄病害智能诊断与防治系统】
41.【基于YOLOv8深度学习的遥感地理空间物体检测系统】42.【基于YOLOv8深度学习的无人机视角地面物体检测系统】
43.【基于YOLOv8深度学习的木薯病害智能诊断与防治系统】44.【基于YOLOv8深度学习的野外火焰烟雾检测系统】
45.【基于YOLOv8深度学习的脑肿瘤智能检测系统】46.【基于YOLOv8深度学习的玉米叶片病害智能诊断与防治系统】
47.【基于YOLOv8深度学习的橙子病害智能诊断与防治系统】48.【车辆检测追踪与流量计数系统】
49.【行人检测追踪与双向流量计数系统】50.【基于YOLOv8深度学习的反光衣检测与预警系统】
51.【危险区域人员闯入检测与报警系统】52.【高密度人脸智能检测与统计系统】
53.【CT扫描图像肾结石智能检测系统】54.【水果智能检测系统】
55.【水果质量好坏智能检测系统】56.【蔬菜目标检测与识别系统】
57.【非机动车驾驶员头盔检测系统】58.【太阳能电池板检测与分析系统】
59.【工业螺栓螺母检测】60.【金属焊缝缺陷检测系统】
61.【链条缺陷检测与识别系统】62.【交通信号灯检测识别】

二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~

《------正文------》

目录

  • 引言
    • 安装PyTorch
    • MNIST 数据集介绍
    • 自定义模型与训练步骤
      • 步骤 1:导入必要的库
      • 步骤2:加载MNIST数据集
      • 步骤 3:构建自己的分类模型
        • 使用GPU 与 CPU
        • 查看模型结构
      • 步骤 4:定义损失函数和优化器
      • 步骤 5:训练模型
      • 步骤 6:绘制训练和验证曲线以检查过度拟合或欠拟合
      • 步骤 7:模型评估
    • 总结

引言

深度学习是一种强大而灵活的方法,框架,它提供了一种在 Python 中构建、训练和评估神经网络的无缝方法。在本文中,我们将详细介绍使用 PyTorch 自定义一个深度学习模型框架、并训练深度学习模型的步骤以及一个示例。

神经网络是一种机器学习模型,其灵感来自人脑的结构和功能。它由多层相互连接的节点(称为神经元)组成,用于处理和传输信息。神经网络特别适合图像和语音识别、自然语言处理以及基于大量数据进行预测等任务。

下面是神经网络的基本结构:包含输入层、隐藏层与输出层。

神经网络 -Geeksforgeeks

安装PyTorch

要安装 PyTorch,您需要在计算机上安装 Python 和 pip(Python 的包管理器)。

您可以通过在命令提示符或终端中运行以下命令来安装 PyTorch 和必要的库:

pip install torch
pip install torchvision
pip install torchsummary

MNIST 数据集介绍

MNIST 数据集是手写数字的数据集,由 60,000 个训练示例和 10,000 个测试示例组成。每个示例都是一个 28×28 的手写数字灰度图像,值范围从 0(白色)到 255(黑色)。每个示例的标签是图像所代表的数字,值范围从 0 到 9。

img

它是常用于训练和评估图像分类模型的数据集,尤其是在计算机视觉领域。它被认为是深度学习的“Hello World”数据集,因为它很小且相对简单,但仍需要大量的预处理和模型架构设计才能实现良好的性能。

自定义模型与训练步骤

步骤 1:导入必要的库

import torch 
import torchvision 
import torch.nn as nn 
import torch.optim as optim 
from torchsummary import summary 
import torch.nn.functional as F

步骤2:加载MNIST数据集

首先,我们需要导入必要的库并加载数据集。我们将使用 PyTorch 中的内置 MNIST 数据集,可以使用 torchvision 库轻松加载该数据集。

注:pytorch内置了Mnist数据集,可以通过以下代码直接下载,也可以直接使用我提供的数据集。

# Load the MNIST dataset 
train_dataset = torchvision.datasets.MNIST(root='./data', 
										train=True, 
										transform=torchvision.transforms.ToTensor(), 
										download=True) 
test_dataset = torchvision.datasets.MNIST(root='./data', 
										train=False, 
										transform=torchvision.transforms.ToTensor(), 
										download=True)

在上面的代码中,torchvision.datasets.MNIST 函数用于加载数据集,它接受几个参数,例如:

  • root:数据集将保存的目录
  • train:一个布尔标志,指示是否加载训练集还是测试集。
  • transform:应用于数据的变换,变为张量
  • download:一个布尔标志,指示如果在根目录中找不到数据集是否下载。

步骤 3:构建自己的分类模型

接下来,我们自己定义一个简单的深度学习模型结构。在这个例子中,我们将使用一个简单的前馈神经网络

  • Python3
class Classifier(nn.Module): 
	def __init__(self): 
		super().__init__() 
		self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1) 
		self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1) 
		self.pool = nn.MaxPool2d(2, 2) 
		self.dropout1 = nn.Dropout2d(0.25) 
		self.dropout2 = nn.Dropout2d(0.5) 
		self.fc1 = nn.Linear(64 * 7 * 7, 128) 
		self.fc2 = nn.Linear(128, 10) 

	def forward(self, x): 
		x = self.pool(F.relu(self.conv1(x))) 
		x = self.dropout1(x) 
		x = self.pool(F.relu(self.conv2(x))) 
		x = self.dropout2(x) 
		x = x.view(-1, 64 * 7 * 7) 
		x = F.relu(self.fc1(x)) 
		x = self.fc2(x) 
		return x

Classifier 类继承自 PyTorch 的 nn.Module 类,并定义 CNN 的架构。创建类的实例时会调用 init 方法,并设置网络的各层。

  1. self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1):此行创建一个 2D 卷积层,该层具有 1 个输入通道、32 个输出通道、内核大小为 3、填充为 1。卷积层将一组过滤器(也称为内核)应用于输入图像以从中提取特征。
  2. self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1):此行创建另一个 2D 卷积层,具有 32 个输入通道、64 个输出通道、内核大小为 3、填充为 1。该层连接到第一个卷积层的输出,允许网络从前一层的输出中学习更复杂的特征。
  3. self.pool = nn.MaxPool2d(2, 2):此行创建一个最大池化层,其内核大小为 2,步长为 2。最大池化是一种下采样操作,它从每个输入通道的小邻域中选择最大值。它有助于降低数据的维度,降低计算成本并有助于防止过度拟合。
  4. self.dropout1 = nn.Dropout2d(0.25):此行创建一个概率为 0.25 的 dropout 层。Dropout 是一种正则化技术,可在训练期间随机丢弃一些神经元,有助于减少过度拟合。
  5. self.dropout2 = nn.Dropout2d(0.5):此行创建另一个概率为 0.5 的 dropout 层
  6. self.fc1 = nn.Linear(64 * 7 * 7, 128):此行创建一个完全连接(线性)层,具有 64 * 7 * 7 个输入特征和 128 个输出特征。完全连接层用于根据前面各层学习到的特征做出最终预测。
  7. self.fc2 = nn.Linear(128, 10):此行创建另一个具有 128 个输入特征和 10 个输出特征的完全连接层。此层将产生具有 10 个类的网络的最终输出。forward 方法定义了

接下来是网络的前向传递方法。它接受输入 x,并应用 init 方法中各层定义的一系列操作。

  1. x = self.pool(F.relu(self.conv1(x))):此行将 ReLU 激活函数 (F.relu) 应用于第一个卷积层 (self.conv1) 的输出,然后将最大池化 (self.pool) 应用于结果。
  2. x = self.dropout1(x):此行将 dropout 应用于第一个池化层的输出。
  3. x = self.pool(F.relu(self.conv2(x))):此行将 ReLU 激活函数应用于第二个卷积层(self.conv2)的输出,然后对结果应用最大池化。
  4. x = self.dropout2(x):此行将 dropout 应用于第二个池化层的输出。
  5. x = x.view(-1, 64 * 7 * 7):此行将张量 x 重塑为一维张量,其中 -1 表示张量中元素的数量是从其他维度推断出来的。
  6. x = F.relu(self.fc1(x)):此行将 ReLU 激活函数应用于第一个全连接层(self.fc1)的输出。
  7. x = self.fc2(x):此行将最终的全连接层(self.fc2)应用于前一层的输出并返回结果,该结果将成为网络的最终输出。
  8. 这种 CNN 架构很简单,可以作为更复杂任务的起点。但是,可以通过添加更多层、使用不同类型的层或调整超参数来改进它,以获得更好的性能。
使用GPU 与 CPU

判断使用GPU还是CPU

device = torch.device("cuda" if torch.cuda.is_available() else "cpu") 
device

输出

device(type='cuda')

这段代码用于选择我们应该在哪个设备上运行我们的模型。如果我们在 google colab 中运行我们的代码,我们可以检查“cuda”设备是否可用,如果可用,我们可以使用它,否则我们可以使用普通 CPU。

CUDA 是针对运行 ML 模型而优化的 GPU

查看模型结构

定义模型后,我们可以使用该类创建模型对象并查看模型的基本结构。 summary 选项可用于打印模型的摘要,如下所示。

  • Python3
# Instantiate the model 
model = Classifier() 

# Move the model to the GPU if available 
model.to(device) 
summary(model, (1, 28, 28))

输出

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1           [-1, 32, 28, 28]             320
         MaxPool2d-2           [-1, 32, 14, 14]               0
         Dropout2d-3           [-1, 32, 14, 14]               0
            Conv2d-4           [-1, 64, 14, 14]          18,496
         MaxPool2d-5             [-1, 64, 7, 7]               0
         Dropout2d-6             [-1, 64, 7, 7]               0
            Linear-7                  [-1, 128]         401,536
            Linear-8                   [-1, 10]           1,290
================================================================
Total params: 421,642
Trainable params: 421,642
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.43
Params size (MB): 1.61
Estimated Total Size (MB): 2.04
----------------------------------------------------------------

步骤 4:定义损失函数和优化器

现在,我们需要定义一个[损失函数]和一个[优化器]。在这个例子中,我们将使用交叉熵损失和 ADAM 优化器。

# Define a loss function and optimizer 
criterion = nn.CrossEntropyLoss() 
optimizer = optim.Adam(model.parameters(), lr=0.001)

代码定义了神经网络的损失函数和优化器。

nn.CrossEntropyLoss() 是一个 PyTorch 函数,用于创建交叉熵损失函数的实例。交叉熵损失通常用于分类问题,因为它可以测量预测类别概率与真实类别之间的差异。它是通过对真实类别的预测类别概率取负对数来计算的。

optimizer = optim.Adam(model.parameters(), lr=0.001):此行创建 optim.Adam 类的实例,该类是常用于深度学习的优化算法。Adam 优化器是随机梯度下降的扩展,它使用参数的移动平均值来提供梯度二阶原始矩的运行估计;术语 Adam 源自自适应矩估计。它要求将模型的参数作为第一个参数传递,并将学习率设置为 0.001。学习率是一个超参数,它控制优化器更新模型参数的步长。

优化器和损失函数分别用于训练过程中更新模型的参数和评估模型的性能。

步骤 5:训练模型

现在,我们可以使用训练数据集训练我们的模型。我们将使用 100 的批处理大小,并将训练模型 10 个epoch。下面的代码使用循环在数据集上训练神经网络,该循环迭代训练时期的数量和训练数据集中的数据。

  1. batch_size = 100 和 num_epochs = 10 定义训练过程的批大小和轮数。批大小是用于神经网络一次前向和后向传递的训练数据集样本数。时期数是整个训练数据集通过网络的次数。
  2. torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True) 为训练数据集创建一个 PyTorch DataLoader。DataLoader 将训练数据集作为输入并返回数据集上的迭代器。迭代器将在每次迭代中返回一组样本(图像和标签),其中样本数量由批次大小决定。通过设置 shuffle=True,DataLoader 将在每个时期之前随机打乱数据集。
  3. 外层循环,for epoch in range(num_epochs),迭代训练周期数。
  4. 内部循环 for i, (images, labels) in enumerate(train_loader) 遍历 DataLoader,返回一批图像和标签。使用输出 = 模型 (images) 将图像传递给模型,以获取模型的预测。
  5. 通过将模型的预测和真实标签传递给损失函数来计算损失,使用 loss = criterion(outputs, labels)。
  6. 优化器用于在最小化损失的方向上更新模型的参数。这通过以下 3 个步骤完成:
    • optimizer.zero_grad() 清除所有可优化参数的梯度。
    • loss.backward() 计算关于模型参数的损失的梯度。
    • optimizer.step() 根据计算的梯度更新模型的参数。
  7. 每个时期结束后,代码会打印当前时期和时期结束时的损失。

在训练过程结束时,模型的参数将被更新,以最大限度地减少训练数据集的损失。

值得注意的是,在训练期间使用验证集来评估模型性能也很有用,这样我们就可以检测过度拟合并相应地调整模型。我们可以通过将训练集分为两部分来实现这一点:训练和验证。然后,使用训练集进行训练,并使用验证集在训练期间评估模型性能。

batch_size=100
num_epochs=10
# Split the training set into training and validation sets 
val_percent = 0.2 # percentage of the data used for validation 
val_size = int(val_percent * len(train_dataset)) 
train_size = len(train_dataset) - val_size 
train_dataset, val_dataset = torch.utils.data.random_split(train_dataset, 
														[train_size, 
															val_size]) 

# Create DataLoaders for the training and validation sets 
train_loader = torch.utils.data.DataLoader(train_dataset, 
										batch_size=batch_size, 
										shuffle=True, 
										pin_memory=True) 
val_loader = torch.utils.data.DataLoader(val_dataset, 
										batch_size=batch_size, 
										shuffle=False, 
										pin_memory=True) 
losses = [] 
accuracies = [] 
val_losses = [] 
val_accuracies = [] 
# Train the model 
for epoch in range(num_epochs): 
	for i, (images, labels) in enumerate(train_loader): 
		# Forward pass 
		images=images.to(device) 
		labels=labels.to(device) 
		outputs = model(images) 
		loss = criterion(outputs, labels) 
		
		# Backward pass and optimization 
		optimizer.zero_grad() 
		loss.backward() 
		optimizer.step() 

		_, predicted = torch.max(outputs.data, 1) 
	acc = (predicted == labels).sum().item() / labels.size(0) 
	accuracies.append(acc) 
	losses.append(loss.item()) 
		
	# Evaluate the model on the validation set 
	val_loss = 0.0
	val_acc = 0.0
	with torch.no_grad(): 
		for images, labels in val_loader: 
			labels=labels.to(device) 
			images=images.to(device) 
			outputs = model(images) 
			loss = criterion(outputs, labels) 
			val_loss += loss.item() 
			
			_, predicted = torch.max(outputs.data, 1) 
		total = labels.size(0) 
		correct = (predicted == labels).sum().item() 
		val_acc += correct / total 
		val_accuracies.append(acc) 
		val_losses.append(loss.item()) 
	
			
	print('Epoch [{}/{}],Loss:{:.4f},Validation Loss:{:.4f},Accuracy:{:.2f},Validation Accuracy:{:.2f}'.format( 
		epoch+1, num_epochs, loss.item(), val_loss, acc ,val_acc))

输出:

Epoch [1/10], Loss:0.2086, Validation Loss:14.6681, Accuracy:0.99, Validation Accuracy:0.94
Epoch [2/10], Loss:0.1703, Validation Loss:11.0446, Accuracy:0.95, Validation Accuracy:0.94
Epoch [3/10], Loss:0.1617, Validation Loss:8.9060, Accuracy:0.98, Validation Accuracy:0.97
Epoch [4/10], Loss:0.1670, Validation Loss:7.7104, Accuracy:0.98, Validation Accuracy:0.97
Epoch [5/10], Loss:0.0723, Validation Loss:7.1193, Accuracy:1.00, Validation Accuracy:0.96
Epoch [6/10], Loss:0.0970, Validation Loss:7.5116, Accuracy:1.00, Validation Accuracy:0.98
Epoch [7/10], Loss:0.1623, Validation Loss:6.8909, Accuracy:0.99, Validation Accuracy:0.96
Epoch [8/10], Loss:0.1251, Validation Loss:7.2684, Accuracy:1.00, Validation Accuracy:0.97
Epoch [9/10], Loss:0.0874, Validation Loss:6.9928, Accuracy:1.00, Validation Accuracy:0.98
Epoch [10/10], Loss:0.0405, Validation Loss:6.0112, Accuracy:0.99, Validation Accuracy:0.99

在此示例中,我们介绍了使用 PyTorch 在 MNIST 数据集上训练深度学习模型的基本步骤。可以使用更复杂的架构、数据增强和其他技术进一步改进此模型。PyTorch 是一个功能强大且灵活的库,可让您构建和训练各种模型,而此示例只是您可以使用它完成的开始。

步骤 6:绘制训练和验证曲线以检查过度拟合或欠拟合

模型训练完成后,我们可以绘制训练和验证损失和准确率曲线。这可以让我们了解模型在未知数据上的表现,以及模型是否过度拟合或欠拟合。

import matplotlib.pyplot as plt 

# Plot the training and validation loss over time 
plt.plot(range(num_epochs), 
		losses, color='red', 
		label='Training Loss', 
		marker='o') 
plt.plot(range(num_epochs), 
		val_losses, 
		color='blue', 
		linestyle='--', 
		label='Validation Loss', 
		marker='x') 
plt.xlabel('Epoch') 
plt.ylabel('Loss') 
plt.title('Training and Validation Loss') 
plt.legend() 
plt.show() 

# Plot the training and validation accuracy over time 
plt.plot(range(num_epochs), 
		accuracies, 
		label='Training Accuracy', 
		color='red', 
		marker='o') 
plt.plot(range(num_epochs), 
		val_accuracies, 
		label='Validation Accuracy', 
		color='blue', 
		linestyle=':', 
		marker='x') 
plt.xlabel('Epoch') 
plt.ylabel('Accuracy') 
plt.title('Training and Validation Accuracy') 
plt.legend() 
plt.show()

输出
训练和验证损失

训练和验证损失 -Geeksforgeeks

训练和验证准确率

训练和验证准确率 -Geeksforgeeks

注意,损失通常会随着每个时期而减少,而准确率则会提高,这是预期的情况。

步骤 7:模型评估

另一个重要方面是评估指标的选择。在此示例中,我们使用准确率作为评估指标,这对于许多问题来说都是一个很好的起点。但是,重要的是要注意,在某些情况下,准确率可能会产生误导,尤其是在类别不平衡的情况下。在这些情况下,应使用其他指标,例如准确率、召回率、F1 分数或 AUC-ROC。

训练模型后,您可以通过进行预测并将其与真实标签进行比较来评估其在测试数据集上的性能。评估分类模型性能的一种方法是使用[分类报告],该报告是模型在所有类别中性能的摘要。

首先是在测试数据集上评估模型,并通过使用 torch.max() 函数将预测标签与真实标签进行比较来计算其整体准确性。

然后,它使用 scikit-learn 库中的 分类_report 函数生成分类报告。分类报告通过计算精度、召回率、f1 分数和支持度等多项指标,为您提供模型在所有类别中的表现摘要。

精确度 – 精确度是真阳性数量除以真阳性数量加上假阳性数量。它衡量了阳性预测中有多少是正确的。

召回率 – 召回率是真阳性数量除以真阳性数量加上假阴性数量。它衡量了实际阳性病例中有多少被正确预测。

F1 分数 – F1 分数是精确度和召回率的调和平均值。它是一个代表精确度和召回率之间平衡的数字。

支持度——支持度是测试集中属于特定类别的实例数。

值得注意的是,分类报告是基于对整个测试集的预测计算的,而不仅仅是测试集的样本。

以下是如何评估模型并生成分类报告的示例:

# Create a DataLoader for the test dataset 
test_loader = torch.utils.data.DataLoader(test_dataset, 
										batch_size=batch_size, 
										shuffle=False) 

# Evaluate the model on the test dataset 
model.eval() 

with torch.no_grad(): 
	correct = 0
	total = 0
	y_true = [] 
	y_pred = [] 
	for images, labels in test_loader: 
		images = images.to(device) 
		labels = labels.to(device) 
		outputs = model(images) 
		_, predicted = torch.max(outputs.data, 1) 
		total += labels.size(0) 
		correct += (predicted == labels).sum().item() 
		predicted=predicted.to('cpu') 
		labels=labels.to('cpu') 
		y_true.extend(labels) 
		y_pred.extend(predicted) 

print('Test Accuracy: {}%'.format(100 * correct / total)) 

# Generate a classification report 

from sklearn.metrics import classification_report 
print(classification_report(y_true, y_pred))

输出

Test Accuracy: 99.1%
              precision    recall  f1-score   support

           0       0.99      1.00      0.99       980
           1       1.00      1.00      1.00      1135
           2       0.99      0.99      0.99      1032
           3       0.99      0.99      0.99      1010
           4       0.99      0.99      0.99       982
           5       0.99      0.99      0.99       892
           6       1.00      0.99      0.99       958
           7       0.98      0.99      0.99      1028
           8       1.00      0.99      0.99       974
           9       0.99      0.99      0.99      1009

    accuracy                           0.99     10000
   macro avg       0.99      0.99      0.99     10000
weighted avg       0.99      0.99      0.99     10000

最后,重要的是要记住,深度学习模型需要大量数据和计算资源来训练。在大型数据集上训练模型可能需要很长时间,并且需要强大的 GPU。还有一些家云提供商提供可用于训练深度学习模型的 GPU 实例,如果您没有资源在本地训练模型,这可能是一个不错的选择。

总结

总而言之,使用 PyTorch 进行深度学习是一种强大的工具,可用于构建和训练各种模型。MNIST 数据集是学习基础知识的一个很好的起点,但重要的是要记住,在处理现实世界的数据集和问题时,还有许多其他方面需要考虑。有了正确的知识和资源,深度学习可以成为解决复杂问题和做出高精度预测的强大工具。


关于本文的数据集已经打包好了,需要的小伙伴可以自行获取学习。

关注下方名片GZH:【阿旭算法与机器学习】,并发送【手写体数字识别】即可获取

在这里插入图片描述

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

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

相关文章

Unet改进15:添加TripletAttention||减少冗余计算和同时存储访问

本文内容:在不同位置添加TripletAttention注意力机制 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 由于注意机制具有在通道或空间位置之间建立相互依赖关系的能力,近年来在各种计算机视觉任务中得到了广泛的研究和应用。在本文中,我们研究了轻量级但…

龙芯+FreeRTOS+LVGL实战笔记(新)——01准备开发环境

本专栏是笔者另一个专栏《龙芯RT-ThreadLVGL实战笔记》的姊妹篇,主要的区别在于实时操作系统的不同,章节的安排和任务的推进保持一致,并对源码做了改进和优化,各位可以先到本人主页下去浏览另一专栏的博客列表(目前已撰…

C++STL之vector类:相关习题解析

目录 只出现一次的数字| 只出现一次的数字|| 只出现一次的数字||| 杨辉三角(vector>的理解) 删除排序数组中的重复项 删除排序数组中的重复项|| 数组中出现次数超过一半的数字 只出现一次的数字| . - 力扣(LeetCode) 思路: 我们都…

★ 算法OJ题 ★ 力扣15 - 三数之和

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;芝麻凛将和大家一起做一道双指针算法题--三数之和~ 目录 一 题目 二 算法解析 三 编写算法 一 题目 15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 二 算法解析 解法一&#xff1a;排序 暴力枚举 利…

JavaEE:多线程进阶(常见的锁策略)

文章目录 常见的锁策略各种锁的概念 synchronized特点加锁过程 锁消除(编译器的优化策略)锁粗化(编译器的优化策略) 常见的锁策略 锁是一个非常广义的问题. synchronized只是市面上五花八门的锁的一种典型的实现.它是Java内置的,推荐使用的锁. 各种锁的概念 下面这些概念,一…

JavaScript程序结构

程序结构有三种&#xff1a;选择结构、循环结构 、顺序结构 一、选择结构 1、简介 根据条件进行判断&#xff0c;从而执行不同的操作&#xff0c;称为选择结构&#xff08;分支结构&#xff09;&#xff0c;其实就是条件判断 选择结构的类型&#xff1a;if、switch 2、if结…

第十七篇——九变篇:紧扣战略重心,别跑题

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 九变种前面偏向宏观给讲解了九变的含义&#xff1b;这一篇通过更加微观的…

如何基于numpy和scipy实现曲面的最大梯度计算与显示

大家在做三维可视化研究过程中,经常需要做三维曲面的绘制和相交分析,在不知道三维曲面方程的情况下,如何基于曲面散点数据计算曲面的最大梯度点和梯度线的三维可视化是大家基于曲面分析研究中的重点关注的问题,本文在python环境下,基于numpy、pandas、scipy和matplotlib等…

MYSQL————联合查询

联合多个表进行查询 设计数据时把表进行拆分&#xff0c;为了消除表中字段的依赖关系&#xff0c;比如部分函数依赖&#xff0c;传递依赖&#xff0c;这时会导致一条SQL查出来的数据&#xff0c;对于业务来说是不完整的&#xff0c;我们就可以使用联合查询把关系中的数据全部查…

dk安装redis

docker search redis docker pull redis 由于我是使用的镜像 所以我的拉取命令就是 docker pull dockerpull.com/redis 拉下镜像之后&#xff0c;点击下面地址选择自己需要的 redis 版本的配置文件 redis/redis.conf at 6.2.6 redis/redis GitHubRedis is an in-memory data…

Python和Java及MATLAB和CUDA显微镜导图

&#x1f3af;要点 交互式设备控制和图像处理图像背景和阴影校正可视化萤光团位置算法和读取光学图像读写转换显微镜图像生物医学细胞图像分析荧光图像算法计算亮度数据和模拟表征新型染料和缓冲液强度估计细菌图像分析扫描透射和高分辨率透射图像模拟多模态成像分割可视化透射…

python安装protobuf记录

需求背景 客户需要protobuf环境配置以及插件安装&#xff0c;我主要通过在pycharm里面配置参数&#xff0c;将问题解决&#xff01; 导语 Python中的protobuf(Protocol Buffers)是一种用于序列化结构化数据的语言无关、平台无关、可扩展的机制。它能够让您在不同的应用程序和语…

搭建基于QT的TCP服务器与客户端

1、实现功能 1、服务器和客户端能够建立连接 2、服务器可以给客户端发送信息 3、客户端可以给服务器发送信息 2、server 2-1、widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> QT_BEGIN_NA…

2024 年 IBM 量子开发者大会:等你来

在 2024 年 IBM Quantum™ 开发者大会上&#xff0c;与会者将获得 IBM Quantum 尖端工具和即将推出的路线图更新的独家、亲身预览&#xff0c;所有这些都围绕一个主题 — — Qiskit 的性能。 2024 年 IBM 量子开发者大会 在此申请 重要日期 7 月 24 日&#xff1a; 开放申请 8 …

leetcode 902. Numbers At Most N Given Digit Set

题目链接 Given an array of digits which is sorted in non-decreasing order. You can write numbers using each digits[i] as many times as we want. For example, if digits [1,3,5], we may write numbers such as 13, 551, and 1351315. Return the number of posit…

Docker续6:容器网络

1.bridge-utils 一个用于Linux系统的网络桥接工具集。它提供了一些命令行工具&#xff0c;帮助用户创建、管理和配置网络桥接。网络桥接是一种将多个网络接口连接在一起&#xff0c;以使它们能够作为单个网络段进行通信的技术。 bridge-utils 常用的命令包括&#xff1a; b…

大阪OSAKA分子泵电源TC163HTC203TC353TC523TC1104TC553TC1813手侧

大阪OSAKA分子泵电源TC163HTC203TC353TC523TC1104TC553TC1813手侧

六、泛型事件框架

一、创建一个BaseEventSO的 基类 写一个泛型事件《T》 启动事件?.Invoke 二、创建一个监听类 同样泛型匹配Event的监听事件 创建OnEable在其中注册事件&#xff1b;OnDisable中注销事件 写一个if语句进行判断是否为空 三、创建一个ObjectEvent 传递Object 原因&#xf…

axios发送post请求实例

在body中的数据格式又有两种&#xff0c;一种是 json 数据格式&#xff0c;另一种是 字符串。具体要用哪种格式取决于后端入参的格式。 如果后端接收json数据类型&#xff0c;post 的 headers 需要设置 { ‘content-type’: ’application/json’ }&#xff0c;传给后端的数…

初学流量分析

一、基本知识 比赛中提供一个包含流量数据的 PCAP 文件&#xff0c;有时候也会需要选手们先进行修复或重构传输文件后&#xff0c;再进行分析。 PCAP 这一块作为重点&#xff0c;复杂的地方在于数据包里充满着大量无关的流量信息&#xff0c;因此如何分类和过滤数据是参赛者需…