PyTorch实战-手写数字识别-MLP模型

devtools/2024/11/6 13:55:06/

1 需求

包懂,40分钟掌握PyTorch深度学习框架,对应神经网络算法理论逐行讲解用PyTorch实现图像分类代码_哔哩哔哩_bilibili


10分钟入门神经网络 PyTorch 手写数字识别_哔哩哔哩_bilibili

pytorch tutorial: PyTorch 手写数字识别 教程代码


从零设计并训练一个神经网络,你就能真正理解它了_哔哩哔哩_bilibili

https://github.com/xhh890921/mnist_network


2 接口


3 豆包生成代码

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms# 定义超参数
batch_size = 128
learning_rate = 0.001
num_epochs = 10# 数据预处理
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))
])# 加载 MNIST 数据集
train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transform)train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)# 定义 MLP 模型
class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.fc1 = nn.Linear(784, 512)self.fc2 = nn.Linear(512, 256)self.fc3 = nn.Linear(256, 10)def forward(self, x):x = x.view(-1, 784)x = torch.relu(self.fc1(x))x = torch.relu(self.fc2(x))x = self.fc3(x)return x# 实例化模型
model = MLP()# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)# 训练模型
for epoch in range(num_epochs):for batch_idx, (data, targets) in enumerate(train_loader):# 前向传播outputs = model(data)loss = criterion(outputs, targets)# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()if batch_idx % 100 == 0:print(f'Epoch [{epoch + 1}/{num_epochs}], Step [{batch_idx + 1}/{len(train_loader)}], Loss: {loss.item()}')# 在测试集上评估模型
model.eval()
with torch.no_grad():correct = 0total = 0for data, targets in test_loader:outputs = model(data)_, predicted = torch.max(outputs.data, 1)total += targets.size(0)correct += (predicted == targets).sum().item()accuracy = correct / totalprint(f'Test Accuracy: {accuracy * 100:.2f}%')

3  

import torch
from torch.utils.data import DataLoader
from torchvision import transforms
from torchvision.datasets import MNIST
import matplotlib.pyplot as pltclass Net(torch.nn.Module):def __init__(self):super().__init__()self.fc1 = torch.nn.Linear(28 * 28, 64)self.fc2 = torch.nn.Linear(64, 64)self.fc3 = torch.nn.Linear(64, 64)self.fc4 = torch.nn.Linear(64, 10)def forward(self, x):x = torch.nn.functional.relu(self.fc1(x))x = torch.nn.functional.relu(self.fc2(x))x = torch.nn.functional.relu(self.fc3(x))x = torch.nn.functional.log_softmax(self.fc4(x), dim=1)return xdef get_data_loader(is_train):to_tensor = transforms.Compose([transforms.ToTensor()])data_set = MNIST("", is_train, transform=to_tensor, download=True)return DataLoader(data_set, batch_size=15, shuffle=True)def evaluate(test_data, net):n_correct = 0n_total = 0with torch.no_grad():for (x, y) in test_data:outputs = net.forward(x.view(-1, 28 * 28))for i, output in enumerate(outputs):if torch.argmax(output) == y[i]:n_correct += 1n_total += 1return n_correct / n_totaldef main():train_data = get_data_loader(is_train=True)test_data = get_data_loader(is_train=False)net = Net()print("initial accuracy:", evaluate(test_data, net))optimizer = torch.optim.Adam(net.parameters(), lr=0.001)for epoch in range(2):for (x, y) in train_data:net.zero_grad()output = net.forward(x.view(-1, 28 * 28))loss = torch.nn.functional.nll_loss(output, y)loss.backward()optimizer.step()print("epoch", epoch, "accuracy:", evaluate(test_data, net))for (n, (x, _)) in enumerate(test_data):if n > 3:breakpredict = torch.argmax(net.forward(x[0].view(-1, 28 * 28)))plt.figure(n)plt.imshow(x[0].view(28, 28))plt.title("prediction: " + str(int(predict)))plt.show()if __name__ == "__main__":main()

4 参考资料

PyTorch——手写数字识别_pytorch 手写数字-CSDN博客

Python :MNIST手写数据集识别 + 手写板程序 最详细,直接放心,大胆地抄!跑不通找我,我包教!_手写数字数据集-CSDN博客

Python人工智能--实现手写数字识别-CSDN博客


http://www.ppmy.cn/devtools/131777.html

相关文章

数据结构的双向链表

1、头插法创建双向链表,节点是学生信息(学号,分数,姓名) 2、调用函数遍历链表所有信息 3、调用函数,求出分数是完数的学生,并输出该学生所有信息 4、调用函数,按照姓名查找某个学…

富格林:揭露欺诈陷阱用心追损

富格林指出,现货黄金投资作为一种比较受青睐的投资方式,已经赢得了很多投资理财者的关注了。但是投资现货黄金需要对黄金相关的交易操作和技巧有深入的了解,才能够规避欺诈陷阱用心追损。事实上,掌握一定的交易技巧对于规避欺诈陷…

unity3d————线性插值知识点

一、线性插值的基本概念 线性插值是指在两个已知点之间,按照某种线性关系插入一个新的点的过程。在Unity3D中,线性插值通常用于在两个数值、向量、颜色等之间平滑过渡。 二、Unity3D中的线性插值函数 Unity3D提供了多个线性插值函数,以满足…

第三十三章:docker 启动mysql web管理工具- MyWebSQL

mysql web管理工具- MyWebSQL 目标 掌握docker 安装 mywebsqlMyWebSQL介绍 MyWebSQL 是一个基于 Web 的数据库管理工具,它允许用户通过浏览器管理 MySQL 数据库。与 Navicat 这样的桌面 SQL 客户端工具相比,MyWebSQL 有一些明显的优势和劣势: 优势: 跨平台性:MyWebSQL 作…

气膜网球馆:城市文体生活的新标杆—轻空间

在城市的喧嚣中,气膜网球馆为广大运动爱好者提供了一个理想的锻炼空间。宽阔的标准网球场地铺设着专业的运动地胶,确保每一次击球都伴随着畅快的回响,让您在运动中尽情释放热情。 满足多样化的需求 气膜网球馆不仅适合日常锻炼,还…

信息安全技术

信息安全技术 网络安全漏洞分类分级指南 网络技术漏洞分级指标 代码问题:代码开发设计产生的漏洞 资源管理错误:系统资源(内存、硬盘、cpu等)的错误管理 输入验证错误:缺少数据的正确形式验证 缓存区…

迅为RK3588开发板Android多屏显示之多屏同显和多屏异显

迅为RK3588开发板是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像…

构建您自己的 RAG 应用程序:使用 Ollama、Python 和 ChromaDB 在本地设置 LLM 的分步指南

在数据隐私至关重要的时代,建立自己的本地语言模型 (LLM) 为公司和个人都提供了至关重要的解决方案。本教程旨在指导您完成使用 Ollama、Python 3 和 ChromaDB 创建自定义聊天机器人的过程,所有这些机器人都托管在您的系统本地。以…