手写数字识别

任务·
** 第一个实战练习:手写数字识别
根据下面的链接博文,完成程序复现(有github源码):
https://www.cnblogs.com/xiaohuiduan/p/16023895.html

相关程序做如下修改和补充:
1、MNIST训练程序.ipynb程序:
(1)训练轮数epoch:原值较大,先改为 10 次快速出结果,然后再用原值看看自己机器速度如何,需要补充:输出每轮的train loss、train acc以及test acc
(2)查阅资料:如何用tensorboard显示保存的训练结果
(3)增加推理:自己手绘数字图片(测试test.png),看看预测结果
2、MNIST验证程序.ipynb程序:
(1)增加 混淆矩阵 可视化 (参考:https://blog.csdn.net/baoli8425/article/details/119740795)
**
在jupyter notebook或者pycharm都可以实现,导入文件,导入相关pytorch库,即可运行

mnist训练程序增加功能

(1)输出每轮的训练情况
在这里插入图片描述
(https://img-blog.csdnimg.cn/717b575a3e1c40f8a3114cbb488d3803.png)
(2)如何用tensorboard显示保存的训练结果
在相关文件的控制台中输入:tensorboard --logdir=“./runs”
在这里插入图片描述
输入网址会出现测试的动态情况。
在这里插入图片描述

(3)增加推理,手绘数字图片进行识别,查看预测结果。
识别的图片必须是黑底白字,28*28像素点(错误点)
图片的数字过于虚化,会发生识别错误,所以图片中的数字必须非常清晰(失误点)
测试如下:
在这里插入图片描述
相关代码

import torch
import torchvision.transforms as transforms
import cv2
import numpy as np

# 加载模型
model = torch.load('mnist.h5')

# 定义变化
transform = transforms.Compose([
    transforms.Grayscale(num_output_channels=1),
    transforms.Resize((28,28)),
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])

# 读取图像
img = cv2.imread('2.png')

# 转换图像至模型输入张量
img_pil = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换为灰度图
img_pil = Image.fromarray(img_pil)  # 将numpy数组转为PIL图片
img_tensor = transform(img_pil).unsqueeze(0)  # 转为torch.Tensor并增加一个维度

# 使用模型进行预测
with torch.no_grad():
    outputs = model(img_tensor)

# 获取预测结果
_, predicted = torch.max(outputs.data, 1)

# 显示结果
print('预测结果:', predicted.item())

mnist验证增加功能

1,混淆矩阵可视化
在这里插入图片描述
代码修改:

from torch.utils.data import TensorDataset
import numpy as np
import pandas as pd
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
import matplotlib.pyplot as plt
import seaborn as sns
import copy
import time
import torch
import torch.nn as nn
from torch.optim import Adam
import torch.utils.data as Data
from torchvision import transforms
from torchvision.datasets import FashionMNIST
from torch.utils.data import TensorDataset

testDataset = MnistDataset(test_img,test_label,my_transforms)
test_loader = DataLoader(testDataset,256)

def test_loss_acc():
    correct = 0
    total = 0
    predicted_labels = []
    true_labels = []

    for data in test_loader:
        test_imgs, test_labels = data
        test_imgs = test_imgs.type(torch.FloatTensor)
        outputs = myNet(test_imgs.to(device)).to("cpu")
        _, predict_labels = torch.max(outputs, 1)
        total += test_labels.size(0)
        mask = predict_labels == test_labels
        correct += mask.sum().item()

        predicted_labels.extend(predict_labels.tolist())
        true_labels.extend(test_labels.tolist())

    print("测试集正确率:{}%".format(100.0 * correct / total))

    # 计算混淆矩阵
    cm = confusion_matrix(true_labels, predicted_labels)

    # 创建标签列表
    labels = list(range(10))  # 假设有10个类别,可以根据实际情况修改

    # 创建混淆矩阵的数据框
    df_cm = pd.DataFrame(cm, index=labels, columns=labels)

    # 可视化混淆矩阵
    plt.figure(figsize=(10, 7))
    sns.heatmap(df_cm, annot=True, fmt='d', cmap='Reds')
    plt.title('Confusion Matrix')
    plt.xlabel('Predicted Label')
    plt.ylabel('True Label')
    plt.show()

    return total, correct


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值