pytorch手写识别学习

Pytorch实现手写数字识别【基于全连接神经网络】 构建全连接神经网络模型,使用pytroch实现手写数字识别 阅读详情
  • 🍨 本文为🔗365天深度学习训练营中的学习记录博客
  • 🍖 原作者:K同学啊
  • 1.设置gpu,macbook不支持只能使用cpu

  • 2.导入数据

    train_ds = torchvision.datasets.MNIST(
        root='/Users/qiang/PycharmProjects/PythonProject3/data',                      # 替换为你的数据集路径
        train=True,
        transform=transforms.ToTensor(),
        download=False                    # 设置为 False,不再自动下载
    )

    test_ds = torchvision.datasets.MNIST(
        root='/Users/qiang/PycharmProjects/PythonProject3/data',                      # 替换为你的数据集路径
        train=False,
        transform=transforms.ToTensor(),
        download=False                    # 设置为 False,不再自动下载
    ) 

    batch_size = 32

    train_dl = torch.utils.data.DataLoader(train_ds,#torch.utils.data.DataLoader数据加载器其中batch_size为每批
                                           #加载多少数据,shuffle=true代表数据随机打乱,num_workers=4可以设置同时加载个数
                                           batch_size=batch_size,
                                           shuffle=True)

    test_dl  = torch.utils.data.DataLoader(test_ds,
                                           batch_size=batch_size)

    imgs, labels = next(iter(train_dl))#iter表示把数据加载转换为迭代,next表示取下一次给imgs,labels
    print(imgs.shape)#for imgs, labels in train_dl:

  • 正常直接下载数据时会报错,采取把数据下载到本地然后把该数据移动到project文件夹里,这里通过后续尝试后,只要移动到project里了,可以直接使用相对路径,把root=相对路径即可,不需要使用绝对路径。

  • 然后加载数据时用的dataloader,其中参数shuffle控制的是数据的随机性,当shuffle=False时数据不再变化 

  • imgs,lables一个记录图像,一个记录标签。

  • 3.数据可视化

  • import numpy as np

    # 指定图片大小,图像大小为20宽、5高的绘图(单位为英寸inch)
    plt.figure(figsize=(20, 5))
    for i, imgs in enumerate(imgs[:20]):
        # 维度缩减
        npimg = np.squeeze(imgs.numpy())
        plt.subplot(2, 10, i + 1)#图像大小 # 将整个figure分成2行10列,绘制第i+1个子图。
        plt.imshow(npimg, cmap=plt.cm.binary)  #nping提供一个能够代表颜色的数组
        #cmap颜色背景#plt.cm.binary黑白图像展示
        plt.axis('off') #关掉坐标轴
    plt.show()

  • 这里plt.c,.binary换成不同的代码可以换成不同颜色,下图是彩色的

  • 4.构建CNN网络

  • import torch.nn.functional as F

    num_classes = 10  # 图片的类别数

    class Model(nn.Module):
        def __init__(self):
            super().__init__()
            # 特征提取网络
            self.conv1 = nn.Conv2d(1, 32, kernel_size=3)  # 第一层卷积,  卷积核大小为3*3#在没有填充时通过卷积,图像尺寸会变小,因为边缘的数据无法读取
            self.pool1 = nn.MaxPool2d(2)  # 设置池化层,池化核大小为2*2
            self.conv2 = nn.Conv2d(32, 64, kernel_size=3)  # 第二层卷积,卷积核大小为3*3
            self.pool2 = nn.MaxPool2d(2)

            # 分类网络
            self.fc1 = nn.Linear(1600, 64)
            self.fc2 = nn.Linear(64, num_classes)

        # 前向传播
        def forward(self, x):
            x = self.pool1(F.relu(self.conv1(x)))
            x = self.pool2(F.relu(self.conv2(x)))

            x = torch.flatten(x, start_dim=1)

            x = F.relu(self.fc1(x))
            x = self.fc2(x)

            return x

  • from torchinfo import summary
        # 将模型转移到GPU中(我们模型运行均在GPU中进行)
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    model = Model().to(device)
    summary(model)

  • 首先特征提取网络对卷积层池化层初始化,前向传播时传入x,F.relu调用激活函数,先卷积后池化,把图片中的最突出特征识别出来

  • 5.训练函数以及测试函数

  • def train(dataloader, model, loss_fn, optimizer):
        size = len(dataloader.dataset)  # 训练集的大小,一共60000张图片
        num_batches = len(dataloader)  # 批次数目,1875(60000/32)
        train_loss, train_acc = 0, 0  # 初始化训练损失和正确率
        for X, y in dataloader:  # 获取图片及其标签
            X, y = X.to(device), y.to(device)
            # 计算预测误差
            pred = model(X)  # 网络输出
            loss = loss_fn(pred, y)  # 计算网络输出和真实值之间的差距,targets为真实值,计算二者差值即为损失

            # 反向传播
            optimizer.zero_grad()  # grad属性归零
            loss.backward()  # 反向传播
            optimizer.step()  # 每一步自动更新

            # 记录acc与loss
            train_acc += (pred.argmax(1) == y).type(torch.float).sum().item()#pred.argmax预测最大概率的数在列表的第几个位置上(1)表示从第一个位置开始,==y和真实数据标签进行比较,如果正确输出True,而type则是对刚刚的结果转换成浮点型,也就是True会变成1.0,而sum().item()则转化为计算机可识别的信息

  •         train_loss += loss.item()

        train_acc /= size
        train_loss /= num_batches

        return train_acc, train_loss

    def test(dataloader, model, loss_fn):
        size = len(dataloader.dataset)  # 测试集的大小,一共10000张图片
        num_batches = len(dataloader)  # 批次数目,313(10000/32=312.5,向上取整)
        test_loss, test_acc = 0, 0

        # 当不进行训练时,停止梯度更新,节省计算内存消耗
        with torch.no_grad():#禁用梯度计算with表示上下文管理器
            for imgs, target in dataloader:
                imgs, target = imgs.to(device), target.to(device)

                # 计算loss
                target_pred = model(imgs)
                loss = loss_fn(target_pred, target)

                test_loss += loss.item()
                test_acc += (target_pred.argmax(1) == target).type(torch.float).sum().item()

        test_acc /= size
        test_loss /= num_batches

        return test_acc, test_loss

  • 这里训练和测试几乎没什么区别,测试时不需要反向传播更改梯度了。

  • 6.正式训练

  • epochs = 5
    train_loss = []#通过列表初始化训练测试损失和准确率
    train_acc = []
    test_loss = []
    test_acc = []

    for epoch in range(epochs):#添加数据并打印数据
        model.train()
        epoch_train_acc, epoch_train_loss = train(train_dl, model, loss_fn, opt)

        model.eval()
        epoch_test_acc, epoch_test_loss = test(test_dl, model, loss_fn)

        train_acc.append(epoch_train_acc)
        train_loss.append(epoch_train_loss)
        test_acc.append(epoch_test_acc)
        test_loss.append(epoch_test_loss)

        template = ('Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Test_acc:{:.1f}%,Test_loss:{:.3f}')
        print(template.format(epoch + 1, epoch_train_acc * 100, epoch_train_loss, epoch_test_acc * 100, epoch_test_loss))
    print('Done')

  • 进行五次训练,每次训练输出一个训练和测试的准确率以及损失函数

  • 7.结果可视化

  • import matplotlib.pyplot as plt
    #隐藏警告
    import warnings
    warnings.filterwarnings("ignore")               #忽略警告信息
    plt.rcParams['axes.unicode_minus'] = False      # 用来正常显示负号
    plt.rcParams['figure.dpi']         = 100

    epochs_range = range(epochs)#横坐标变化范围

    plt.figure(figsize=(12, 3))#两幅图的大小
    plt.subplot(1, 2, 1)#表明要绘制1行两幅图,选择第一幅图

    plt.plot(epochs_range, train_acc, label='Training Accuracy')#绘制第一份图x,y,以及图像名训练准确率
    plt.plot(epochs_range, test_acc, label='Test Accuracy')#测试准确率
    plt.legend(loc='lower right')
    plt.title('Training and Validation Accuracy')

  • plt.subplot(1, 2, 2)
    plt.plot(epochs_range, train_loss, label='Training Loss')
    plt.plot(epochs_range, test_loss, label='Test Loss')
    plt.legend(loc='upper right')
    plt.title('Training and Validation Loss')
    from matplotlib import rcParams
    plt.show()

7.遇到的问题 

macbook在最后绘图时,字体出现问题,尝试多种方法还没有解决,很多字体会报错,我的解决方法是直接把字体那一行删掉了。

PyTorch深度学习入门:从环境搭建到实战MNIST手写识别 深度学习作为机器学习的重要分支,通过多层神经网络自动从数据中学习特征,已在计算机视觉、自然语言处理等领域广泛应用。其核心训练与推理过程涉及前向传播、损失计算、反向传播与参数更新,而PyTorch凭借动态计算图等特性,成为初学者快速上手的理想框架。掌握张量、自动求导、nn.Module等基础概念,并结合CNN等经典模型进行实战,就能逐步构建完整的深度学习知识体系。从手写数字识别到YOLO目标检测,PyTorch都能提供统一而高效的开发体验。本文围绕PyTorch入门,详细介绍了环境搭建、核心组件和MNIST实 阅读详情

相关推荐

深度学习手写识别实战:CNN、RNN与CTC原理及PyTorch实现

光学字符识别(OCR)是人工智能领域的基础技术,而手写识别因其字形多变、字符粘连和笔画随意性,长期被视为最具挑战性的子问题。传统方法依赖人工特征设计与字符切分,泛化能力有限;深度学习的引入从根本上改变了这一局面。卷积神经网络(CNN)自动提取视觉特征,循环神经网络(RNN)建模序列上下文,CTC损失函数则巧妙解决输入输出长度不对齐的难题,三者结合的CRNN架构成为端到端手写识别的经典范式。该技术广泛应用于票据识别、笔记电子化、古籍数字化等场景。本文以技术演变为线索,梳理核心原理,并基于PyTorch提供从手

weixin_34268843的博客 433

PyTorch——手写数字识别

目录PyTorch 学习 —— 手写数字识别Ⅰ. 数据读取器1. 训练集2. 验证集和测试集Ⅱ. 搭建网络Ⅲ. 模型训练1. 开始训练2. 模型验证Ⅲ. 模型测试Ⅳ. 绘制图像Ⅴ. 完整代码 PyTorch 学习 —— 手写数字识别   MNIST 数据集,其包含70000 个28×28 的手写数字的数据集,其中又分为60000 个训练样本与10000 个测试样本。 Ⅰ. 数据读取器 import torch from torch import nn from torch import optim fro

原谅我这一生不羁放纵爱自由 2万+

PyTorch深度学习实战入门:从MNIST手写识别到真实项目迁移

神经网络是深度学习的核心计算范式,其本质是通过多层可微函数拟合高维非线性映射。理解其工作原理需穿透框架封装,直击张量运算、自动微分与梯度更新的底层逻辑。PyTorch凭借原生API的透明性与CUDA生态的调试友好性,成为入门首选——它让权重初始化、前向传播、loss计算与反向传播全过程可见可调。这种可解释性不仅支撑教学,更直接转化为工程能力:当面对非标准数据(如CSV行为日志或手机拍摄图像)时,你能基于手动数据pipeline和归一化原理快速适配,而非依赖黑盒加载器。本文以MNIST为锚点,覆盖环境配置、模

chenzhuofei4155的博客 709

PyTorch深度学习入门 深度学习基础 2.8 手写字体识别

PyTorch深度学习入门 深度学习基础 2.8 手写字体识别

代码改变世界 2428

CPU环境PyTorch安装与MNIST手写识别实战:零GPU入门深度学习

深度学习作为人工智能的核心技术,其核心原理是通过神经网络模型从数据中自动学习特征与规律。在工程实践中,PyTorch因其动态计算图和易用性成为主流框架之一。对于初学者、原型验证及边缘部署场景,CPU环境下的PyTorch不仅能够完整支持张量运算、自动求导等核心功能,还能避免复杂的GPU环境配置问题,显著降低学习门槛。本文以MNIST手写数字识别为应用场景,详细演示如何在CPU上快速安装PyTorch、构建数据管道、定义多层感知机模型并完成训练与评估,同时分析CPU与GPU在并行计算能力上的本质差异,为后续可

weixin_29045585的博客 254

pytorch识别手写数字成功

pytorch识别手写数字成功

【机器学习】PyTorch-MNIST-手写字识别

注意:本代码需要安装PyTorch未安装请看之前的文章https://blog.youkuaiyun.com/qq_39583774/article/details/132070870MNIST(Modified National Institute of Standards and Technology)是一个常用于机器学习和计算机视觉领域的数据集,用于手写数字识别。它包含了一系列28x28像素大小的灰度图像,每个图像都表示了一个手写的数字(0到9之间)。

信安是不可或缺的一部分! 5594

pytorch版本手写体识别MNIST.zip

手写体识别数据!应用于pytorch版本的,pytorch版本1.31,代码在博客中,有问题欢迎留言 python版本3.74,代码软件pycharm

【Pytorch-手写字体识别】手写字体识别项目

Pytorch进行手写数字识别

weixin_71003977的博客 3779

Chinese_character_recognition:Pytorch 实现中文手写汉字识别

汉字识别 Pytorch实现中文手写汉字识别 环境 的Ubuntu的:16.04 的Python:3.5.2 PyTorch:1.0.1 gpu 数据集 将数据分为训练和测试文件夹。 在每个文件夹中,将相同类别的图像放在相同的子文件夹中,并用整数标记它们。 像这样: 在这个项目中,我们使用来自 , 的数据集。 也可以使用以下方法下载它: wget http://www.nlpr.ia.ac.cn/databases/download/feature_data/HWDB1.1trn_gnt.zip wget http://www.nlpr.ia.ac.cn/databases/download/feature_data/HWDB1.1tst_gnt.zip 该数据集总共包含3755个类。 为了处理它,我们使用来自的python程序。 该博客还使用TensorFlow实现了该数据集

pytorch cnn 识别手写的字实现自建图片数据

主要介绍了pytorch cnn 识别手写的字实现自建图片数据,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

PyTorch CPU版安装与MNIST手写识别实战:零基础深度学习入门指南

深度学习框架是机器学习领域的核心工具,它通过封装底层计算和自动微分机制,大幅降低了神经网络模型的开发门槛。其工作原理在于提供张量计算、动态计算图和模块化网络构建能力,使得研究人员和工程师能够高效实现复杂模型。从技术价值看,这类框架不仅加速了算法迭代,还推动了人工智能在计算机视觉、自然语言处理等领域的工程化落地。对于初学者而言,环境配置往往是第一道难关,尤其是GPU版本涉及的CUDA和cuDNN依赖管理较为复杂。因此,从CPU环境入手成为了一条高效的入门路径,它绕开了硬件兼容性问题,让学习者能快速聚焦于算法原

weixin_29056101的博客 332

sklearn2pmml xgboost缺失值(missing)处理的坑

sklearn2pmml xgboost缺失值(missing)如何处理 今天同事在部署xgboost pmml模型时遇到了大坑,线上spark预测和本地python预测结果怎么都不对应,记录一下处理过程。 看了下同事的代码,貌似也没有问题 from sklearn2pmml import PMMLPipeline from sklearn2pmml import sklearn2pmml fro...

Skycrab 8969

零基础入门AI:Python+PyTorch七天实战学习路径(含MNIST手写识别)

人工智能技术正快速渗透各行各业,但零基础学习者常被Python环境搭建、机器学习概念和深度学习框架等门槛绊住脚步。机器学习本质上是通过数据驱动模型自动发现规律,而深度学习则依赖多层神经网络实现特征提取与表征学习。PyTorch凭借动态计算图和人性化API,成为入门深度学习的首选框架,其张量操作与自动求导机制让训练过程透明可控。从线性回归理解训练流程,到用卷积神经网络完成图像分类,AI应用场景覆盖计算机视觉、自然语言处理等领域。本文聚焦零基础场景,梳理一条从Python基础、NumPy操作、机器学习核心概念到

weixin_34289454的博客 339

Multisim仿真电路:(十二)MOS管缓启动电路设计与优化

本文详细介绍了基于Multisim的MOS管缓启动电路设计与优化方法。通过分析米勒平台效应,探讨RC参数选择、多级设计和有源电路等技巧,有效抑制冲击电流并优化开关损耗。文章结合仿真实例,提供实用的设计策略和实际应用注意事项,帮助工程师提升电源管理系统的可靠性。

pytorch8learner的博客 237

模拟CMOS集成电路设计入门学习(1)

模拟CMOS集成电路设计入门学习(1):二级效应

qq_61052827的博客 3084

PyTorch深度学习实战:从MNIST手写识别到模型优化

深度学习框架作为现代AI开发的核心工具,其动态计算图机制极大提升了模型开发效率。PyTorch凭借Pythonic设计哲学和即时执行模式,成为学术界和工业界首选。在计算机视觉领域,MNIST数据集作为经典入门案例,包含了图像分类任务的所有关键要素。通过PyTorch的torch.nn模块构建神经网络,配合交叉熵损失和Adam优化器,可以快速实现高精度手写数字识别。工程实践中需要注意内存管理、过拟合防治等关键问题,这些技术同样适用于更复杂的工业级应用场景。

weixin_29309785的博客 274

WSL 运行make提示/lib/modules/xxx/build: No such file or directory. Stop.错误解决办法

WSL运行make提示/lib//modules/xxx文件或目录不存在。 WSL2的内核是修改过的,无法使用 ubuntu上游的内核头文件和modules文件,因此,我们需要手动编译并安装一个版本。

weixin_45668903的博客 1万+

PyTorch深度学习实践---以MNIST手写识别训练为例

以MNIST数据集为例,学习简单的卷积神经网络,代码原理基本掌握,参考PyTorch文档可以重复代码,共同学习互勉

qq_54441735的博客 810

#Linux内存管理# 用一个案例详细介绍ARMv7-A架构 缺页中断处理的原理

跳转到异常向量:根据 异常向量表基地址(通常配置在 VBAR 寄存器中,例如 0xFFFF0000) + 数据中止异常的偏移量 0x10,跳转到数据中止异常的处理程序入口点 0xFFFF0010(实践中,这个入口通常是一条跳转到更复杂处理函数的指令)。malloc 通常不会立即分配物理内存页,它只是在内核为该进程维护的虚拟地址空间中找到一段足够大的空闲虚拟地址区域(比如 0x00008000 - 0x00008FFF),标记为已用,并返回起始地址(例如 0x00008000)给程序。

sinat_37817094的博客 993

博途PLC S7-1200/1500 ModbusTcp通信SCL代码篇(轮询)

博途PLC MODBUS TCP的详细讲解和注意事项,可以参看下面这篇博文,这里不在赘述。这篇作为SCL代码篇主要给出SCL语言下的轮训写法和注意事项。博途PLC1200/1500PLC ModbusTcp通信(轮询处理)_RXXW_Dor的博客-优快云博客。............

RXXW_Dor的博客 8423

机器学习第一周(基于Pytorch实现mnist手写识别)

设置硬件设备,如果有GPU则使用,没有则使用cpudevice返回device(type='cuda')代表使用了GPU。

fwc的专栏 396

AI产品经理面试宝典第94天:RAG知识库构建与预处理策略面试指南

本文深入解析RAG知识库构建的核心挑战与预处理策略,涵盖文档格式转换、问答对生成及自动化测试全流程,为AI产品经理提供面试必备的实战方法论与避坑指南,助你精准应对技术深度类问题。

打造全国最全的AI Agent开发知识领域的博客 312

【PyTorch学习笔记】开始MNIST手写识别数字实战

分类问题 图像表示 每一张手写数字的图片在MNIST中图片大小是28×28的单通道图片 我们可以把这个图片打平成一个长度为784长度为784长度为784的数组,也就是忽略它的二维之间的相关性。 然后在前面插入一个维度就变成了一个[1,784][1,784][1,784]的一个矩阵。 单个线性模型无法解决这个问题,所以目前使用三个线性模型进行嵌套 X=[v1,v2,...,v784]X=[v_1,v_2,...,v_{784}]X=[v1​,v2​,...,v784​] x:[1,784]x

weixin_45709330的博客 650

【Proteus仿真】74HC595+74LS154驱动显示16X16点阵

【Proteus仿真】74HC595+74LS154驱动显示16X16点阵

perseverance51博客 2893

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

PyTorch深度学习入门实战:从Tensor到MNIST手写识别

深度学习的本质是拟合一个函数,神经网络通过大量参数调整不断逼近真实映射关系。要快速入门这一领域,PyTorch凭借动态图机制和自动求导能力,成为最适合初学者的主流框架。Tensor作为核心数据结构,不仅支持GPU加速,还能自动记录计算历史,配合反向传播算法,让梯度计算完全自动化。本文从最基础的Tensor创建、shape匹配讲起,逐步拆解自动求导原理、模型定义、损失函数与优化器的协作流程,并以MNIST手写数字识别为实战案例,用不到60行代码跑通完整训练循环。通过数据加载、前向传播、反向更新到准确率评估的全

weixin_32487557的博客 171

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

下一篇: CIFAR10彩色图片识别
sunboon
博客等级 码龄20年 81粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值