基于pytorch的手写数字识别-训练+使用

python 复制代码
import pandas as pd
import numpy as np
import torch
import matplotlib
import matplotlib.pyplot as plt
from torch.utils.data import TensorDataset, DataLoader

matplotlib.use('tkAgg')

# 设置图形配置
config = {
    "font.family": 'serif',
    "mathtext.fontset": 'stix',
    "font.serif": ['SimSun'],
    'axes.unicode_minus': False
}
matplotlib.rcParams.update(config)

def mymap(labels):
    return np.where(labels < 10, labels, 0)

# 数据加载
path = "d:\\JD\\Documents\\大学等等等\\自学部分\\机器学习自学画图\\手写数字识别\\ex3data1.xlsx"
data = pd.read_excel(path)
data = np.array(data, dtype=np.float32)
x = data[:, :-1]
labels = data[:, -1]
labels = mymap(labels)

# 转换为Tensor
x = torch.tensor(x, dtype=torch.float32)
labels = torch.tensor(labels, dtype=torch.long)

# 创建Dataset和Dataloader
dataset = TensorDataset(x, labels)
train_loader = DataLoader(dataset, batch_size=20, shuffle=True)

# 检查GPU是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# 定义模型
my_nn = torch.nn.Sequential(
    torch.nn.Linear(400, 128),
    torch.nn.Sigmoid(),
    torch.nn.Linear(128, 256),
    torch.nn.Sigmoid(),
    torch.nn.Linear(256, 512),
    torch.nn.Sigmoid(),
    torch.nn.Linear(512, 10)
).to(device)

# 加载预训练模型
my_nn.load_state_dict(torch.load('model.pth'))
my_nn.eval()  # 切换至评估模式

# 准备选取数据进行预测
sample_indices = np.random.choice(len(dataset), 50, replace=False)  # 随机选择50个样本
sample_images = x[sample_indices].to(device)  # 选择样本并移动到GPU
sample_labels = labels[sample_indices].numpy()  # 真实标签

# 进行预测
with torch.no_grad():  # 禁用梯度计算
    predictions = my_nn(sample_images)
    predicted_labels = torch.argmax(predictions, dim=1).cpu().numpy()  # 获取预测的标签

# 绘制图像
plt.figure(figsize=(10, 10))
for i in range(50):
    plt.subplot(10, 5, i + 1)  # 10行5列的子图
    plt.imshow(sample_images[i].cpu().reshape(20, 20), cmap='gray')  # 还原为20x20图像
    plt.title(f'Predicted: {predicted_labels[i]}', fontsize=8)
    plt.axis('off')  # 关闭坐标轴

plt.tight_layout()  # 调整子图间距
plt.show()

Iteration 0, Loss: 0.8472495079040527

Iteration 20, Loss: 0.014742681756615639

Iteration 40, Loss: 0.00011596851982176304

Iteration 60, Loss: 9.278443030780181e-05

Iteration 80, Loss: 1.3701709576707799e-05

Iteration 100, Loss: 5.019319928578625e-07

Iteration 120, Loss: 0.0

Iteration 140, Loss: 0.0

Iteration 160, Loss: 1.2548344585638915e-08

Iteration 180, Loss: 1.700657230685465e-05

预测准确率: 100.00%

下面使用已经训练好的模型,进行再次测试:

python 复制代码
import pandas as pd
import numpy as np
import torch
import matplotlib
import matplotlib.pyplot as plt
from torch.utils.data import TensorDataset, DataLoader

matplotlib.use('tkAgg')

# 设置图形配置
config = {
    "font.family": 'serif',
    "mathtext.fontset": 'stix',
    "font.serif": ['SimSun'],
    'axes.unicode_minus': False
}
matplotlib.rcParams.update(config)

def mymap(labels):
    return np.where(labels < 10, labels, 0)

# 数据加载
path = "d:\\JD\\Documents\\大学等等等\\自学部分\\机器学习自学画图\\手写数字识别\\ex3data1.xlsx"
data = pd.read_excel(path)
data = np.array(data, dtype=np.float32)
x = data[:, :-1]
labels = data[:, -1]
labels = mymap(labels)

# 转换为Tensor
x = torch.tensor(x, dtype=torch.float32)
labels = torch.tensor(labels, dtype=torch.long)

# 创建Dataset和Dataloader
dataset = TensorDataset(x, labels)
train_loader = DataLoader(dataset, batch_size=20, shuffle=True)

# 检查GPU是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# 定义模型
my_nn = torch.nn.Sequential(
    torch.nn.Linear(400, 128),
    torch.nn.Sigmoid(),
    torch.nn.Linear(128, 256),
    torch.nn.Sigmoid(),
    torch.nn.Linear(256, 512),
    torch.nn.Sigmoid(),
    torch.nn.Linear(512, 10)
).to(device)

# 加载预训练模型
my_nn.load_state_dict(torch.load('model.pth'))
my_nn.eval()  # 切换至评估模式

# 准备选取数据进行预测
sample_indices = np.random.choice(len(dataset), 50, replace=False)  # 随机选择50个样本
sample_images = x[sample_indices].to(device)  # 选择样本并移动到GPU
sample_labels = labels[sample_indices].numpy()  # 真实标签

# 进行预测
with torch.no_grad():  # 禁用梯度计算
    predictions = my_nn(sample_images)
    predicted_labels = torch.argmax(predictions, dim=1).cpu().numpy()  # 获取预测的标签

plt.figure(figsize=(16, 10))
for i in range(20):
    plt.subplot(4, 5, i + 1)  # 4行5列的子图
    plt.imshow(sample_images[i].cpu().reshape(20, 20), cmap='gray')  # 还原为20x20图像
    plt.title(f'True: {sample_labels[i]}, Pred: {predicted_labels[i]}', fontsize=12)  # 标题中显示真实值和预测值
    plt.axis('off')  # 关闭坐标轴

plt.tight_layout()  # 调整子图间距
plt.show()
相关推荐
咖啡星人k7 分钟前
2026 文生视频:让 AI 把文字变成电影,MonkeyCode 免费上手
人工智能·深度学习·机器学习·计算机视觉·自然语言处理
ZGIAI12 分钟前
ZGI 父子分块:连接检索片段与完整上下文
人工智能·架构
ZGIAI13 分钟前
ZGI 文件解析:知识入库前的质量门
人工智能·架构
算AI18 分钟前
基于LLM的无人机仿真测试:新方法竞赛夺佳绩
人工智能·深度学习·算法·机器学习·ai
小白说大模型35 分钟前
AI驱动的个性化学习路径:知识图谱与知识点关联的存储与推理
大数据·人工智能·学习·mysql·机器学习·prompt·知识图谱
Groundwork Explorer37 分钟前
W5500 网卡编程初始化与使用指南
python·单片机
王大大的刀37 分钟前
Spring AI 重试引起的 LLM 重复调用
java·人工智能
howdoyoudo2026061 小时前
AI审计手记 #01(数据补全版):107小时、17,600次操作——OpenAI越狱案完整攻击链量化分析
大数据·人工智能·安全·ai·语言模型
hrrrrxeeeee1 小时前
不同基础怎么报考 CAIE 认证|Level I 与 Level II 报考指南
大数据·人工智能·产品经理
Tangyuewei1 小时前
388 个 PR:AI 自主运维实测
运维·人工智能