PyTorch使用神经网络进行手写数字识别实战(附源码,包括损失图像和准确率图像)

简介: PyTorch使用神经网络进行手写数字识别实战(附源码,包括损失图像和准确率图像)

全部源码请点赞关注收藏后评论区留言即可~~~

下面使用torchvision.datasets.MNIST构建手写数字数据集。

1:数据预处理

PyTorch提供了torchvision.transforms用于处理数据及数据增强,它可以将数据从[0,255]映射到[0,1]

2:读取训练数据

准备好处理数据的流程后,就可以读取用于训练的数据了,torch.util.data.DataLoader提供了迭代数据,随机抽取数据,批量化数据等等功能 读取效果如下

预处理过后的数据如下

3:构建神经网络模型

下面构建用于识别手写数字的神经网络模型

class MLP(nn.Module):
    def __init__(self):
        super(MLP,self).__init__()
        self.inputlayer=nn.Sequential(nn.Linear(28*28,256),nn.ReLU(),nn.Dropout(0.2))
        self.hiddenlayer=nn.Sequential(nn.Linear(256,256),nn.ReLU(),nn.Dropout(0.2))
        self.outputlayer=nn.Sequential(nn.Linear(256,10))
    def forward(self,x):
        x=x.view(x.size(0),-1)
        x=self.inputlayer(x)
        x=self.hiddenlayer(x)
        x=self.outputlayer(x)
        return x

可以直接通过打印nn.Module的对象看到其网络结构

4:模型评估

在准备好数据和模型后,就可以训练模型了,下面分别定义了数据处理和加载流程,模型,优化器,损失函数以及用准确率评估模型能力。

得到的结果如下

训练一次 可以看出比较混乱 没有说明规律可言

训练五次的损失函数如下 可见随着训练次数的增加是逐渐收敛的,规律也非常明显

 

准确率图像如下

最后 部分源码如下

import torch
import torchvision
import  torch.nn as nn
from torch import  optim
from tqdm import  tqdm
import torch.utils.data.dataset
mnist=torchvision.datasets.MNIST(root='~',train=True,download=True)
for i,j in enumerate(np.random.randint(0,len(mnist),(10,))):
    data,label=mnist[j]
    plt.subplot(2,5,i+1)
    plt.show()
trans=transforms.Compose(
    [
        transforms.ToTensor(),
        transforms.Normalize((0.1307,),(0.3081,))
    ]
)
normalized=trans(mnist[0][0])
from torchvision import  transforms
mnist=torchvision.datasets.MNIST(root='~',train=True,download=True,transform=trans)
def imshow(img):
    img=img*0.3081+0.1307
    npimg=img.numpy()
    plt.imshow(np.transpose(npimg,(1,2,0)))
dataloader=DataLoader(mnist,batch_size=4,shuffle=True,num_workers=0)
images,labels=next(iter(dataloader))
imshow(torchvision.utils.make_grid(images))
class MLP(nn.Module):
    def __init__(self):
        super(MLP,self).__init__()
        self.inputlayer=nn.Sequential(nn.Linear(28*28,256),nn.ReLU(),nn.Dropout(0.2))
        self.hiddenlayer=nn.Sequential(nn.Linear(256,256),nn.ReLU(),nn.Dropout(0.2))
        self.outputlayer=nn.Sequential(nn.Linear(256,10))
    def forward(self,x):
        x=x.view(x.size(0),-1)
        x=self.inputlayer(x)
        x=self.hiddenlayer(x)
        x=self.outputlayer(x)
        return x
print(MLP())
trans=transforms.Compose(
    [
        transforms.ToTensor(),
        transforms.Normalize((0.1307,),(0.3081,))
    ]
)
al=torchvision.datasets.MNIST(root='~',train=False,download=True,transform=trans)
trainloader=DataLoader(mnist_train,batch_size=16,shuffle=True,num_workers=0)
valloader=DataLoader(mnist_val,batch_size=16,shuffle=True,num_workers=0)
#模型
model=MLP()
#优化器
optimizer=oD(model.parameters(),lr=0.01,momentum=0.9)
#损失函数
celoss=nn.ssEntropyLoss()
best_acc=0
#计算准确率
def accuracy(pred,target):
    pred_label=torch.amax(pred,1)
    correct=sum(pred_label==target).to(torch.float)
    return correct,len(pred)
acc={'train':[],"val}
loss_all={'train':[],"val":[]}
for epoch in tqdm(range(5)):
    model.eval()
    numer_val,denumer_val,loss_tr=0.,0.,0.
    with torch.no_grad():
        for data,target in valloader:
            output=model(data)
            loss=celoss(output,target)
            loss_tr+=loss.data
            num,denum=accuracy(output,target)
            numer_val+=num
            denumer_val+=denum
    #设置为训练模式
    model.train()
    numer_tr,denumer_tr,loss_val=0.,0.,0.
    for data,target in trainloader:
        optizer.zero_grad()
        output=model(data)
        loss=celoss(output,target)
        loss_val+=loss.data
        loss.backward()
        optimer.step()
        num,denum=accuracy(output,target)
        numer_tr+=num
        denumer_tr+=denum
    loss_all['train'].append(loss_tr/len(trainloader))
    loss_all['val'].aend(lss_val/len(valloader))
    acc['train'].pend(numer_tr/denumer_tr)
    acc['val'].append(numer_val/denumer_val)
"""
plt.plot(loss_all['train'])
plt.plot(loss_all['val'])
"""
plt.plot(acc['train'])
plt.plot(acc['val'])
plt.show()

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
3月前
|
运维 Kubernetes 前端开发
如何用 eBPF 实现 Kubernetes 网络可观测性?实战指南
本文深入探讨了Kubernetes网络观测的挑战与eBPF技术的应用。首先分析了传统工具在数据碎片化、上下文缺失和性能瓶颈上的局限性,接着阐述了eBPF通过零拷贝观测、全链路关联和动态过滤等特性带来的优势。文章进一步解析了eBPF观测架构的设计与实现,包括关键数据结构、内核探针部署及生产环境拓扑。实战部分展示了如何构建全栈观测系统,并结合NetworkPolicy验证、跨节点流量分析等高级场景,提供具体代码示例。最后,通过典型案例分析和性能数据对比,验证了eBPF方案的有效性,并展望了未来演进方向,如智能诊断系统与Wasm集成。
116 0
|
5天前
|
机器学习/深度学习 人工智能 算法
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic带你深入卷积神经网络(CNN)核心技术,从生物启发到数学原理,详解ResNet、注意力机制与模型优化,探索视觉智能的演进之路。
76 11
|
2月前
|
机器学习/深度学习 人工智能 PyTorch
零基础入门CNN:聚AI卷积神经网络核心原理与工业级实战指南
卷积神经网络(CNN)通过局部感知和权值共享两大特性,成为计算机视觉的核心技术。本文详解CNN的卷积操作、架构设计、超参数调优及感受野计算,结合代码示例展示其在图像分类、目标检测等领域的应用价值。
164 7
|
3月前
|
机器学习/深度学习 移动开发 供应链
基于时间图神经网络多的产品需求预测:跨序列依赖性建模实战指南
本文展示了如何通过学习稀疏影响图、应用图卷积融合邻居节点信息,并结合时间卷积捕获演化模式的完整技术路径,深入分析每个步骤的机制原理和数学基础。
113 1
|
4月前
|
机器学习/深度学习 自然语言处理 PyTorch
基于Pytorch Gemotric在昇腾上实现GAT图神经网络
本实验基于昇腾平台,使用PyTorch实现图神经网络GAT(Graph Attention Networks)在Pubmed数据集上的分类任务。内容涵盖GAT网络的创新点分析、图注意力机制原理、多头注意力机制详解以及模型代码实战。实验通过两层GAT网络对Pubmed数据集进行训练,验证模型性能,并展示NPU上的内存使用情况。最终,模型在测试集上达到约36.60%的准确率。
|
3月前
|
机器学习/深度学习
解决神经网络输出尺寸过小的实战方案
在CIFAR10分类模型训练中,因网络结构设计缺陷导致“RuntimeError: Given input size: (256x1x1). Calculated output size: (256x0x0)”错误。核心问题是六层卷积后接步长为2的池化层,使特征图尺寸过度缩小至归零。解决方案包括调整池化参数(如将部分步长改为1)和优化网络结构(采用“卷积-卷积-池化”模块化设计)。两种方案均可消除报错,推荐方案二以平衡特征表达与计算效率。
|
9月前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
221 17
|
9月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
174 10
|
9月前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
9月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
177 10

热门文章

最新文章

推荐镜像

更多