任务·
** 第一个实战练习:手写数字识别
根据下面的链接博文,完成程序复现(有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