基于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()
相关推荐
哔哩哔哩技术3 分钟前
从JS云函数到MCP:打造跨平台AI Agent工具的工程实践
人工智能
aaaa_a13328 分钟前
The lllustrated Transformer——阅读笔记
人工智能·深度学习·transformer
jinxinyuuuus34 分钟前
文件格式转换工具:数据序列化、Web Worker与离线数据处理
人工智能·自动化
言之。39 分钟前
Dropbear远程连接
python
易天ETU40 分钟前
短距离光模块 COB 封装与同轴工艺的区别有哪些
网络·人工智能·光模块·光通信·cob·qsfp28·100g
秋刀鱼 ..44 分钟前
第二届光电科学与智能传感国际学术会议(ICOIS 2026)
运维·人工智能·科技·机器学习·制造
郭庆汝44 分钟前
(九)自然语言处理笔记——命名实体的识别
人工智能·自然语言处理·命名实体识别
Oxo Security1 小时前
【AI安全】拆解 OWASP LLM Top 10 攻击架构图
人工智能·安全
Math_teacher_fan1 小时前
第二篇:核心几何工具类详解
人工智能·算法