广告
返回顶部
首页 > 资讯 > 后端开发 > Python >PyTorch实现手写数字识别的示例代码
  • 151
分享到

PyTorch实现手写数字识别的示例代码

2024-04-02 19:04:59 151人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录加载手写数字的数据数据加载器(分批加载)建立模型模型训练测试集抽取数据,查看预测结果计算模型精度自己手写数字进行预测加载手写数字的数据 组成训练集和测试集,这里已经下载好了,所以

加载手写数字的数据

组成训练集和测试集,这里已经下载好了,所以download为False

import torchvision

# 是否支持gpu运算
# device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# print(device)
# print(torch.cuda.is_available())


# 加载训练集的数据  使用torchvision自带的MNIST数据集
train_dataset = torchvision.datasets.MNIST(root='./data1',
                                           train=True,
                                           transfORM=torchvision.transforms.ToTensor(),
                                           download=False
                                           )

# 加载测试集的数据  创建测试集
test_dataset = torchvision.datasets.MNIST(root='./data1',
                                          train=False,
                                          transform=torchvision.transforms.ToTensor(),
                                          download=False
                                          )

数据加载器(分批加载)

# 加载数据的批次 一批有多少条数据
batch_size = 100
# 创建数据加载器shuffle为True 加载时打乱
train_loader = DataLoader(dataset=train_dataset,
                          batch_size=batch_size,
                          shuffle=True
                          )
test_loader = DataLoader(dataset=test_dataset,
                         batch_size=batch_size,
                         shuffle=True
                         )
# 数据加载器生成的对象转为迭代器
examples = iter(test_loader)
# 使用next方法获取到一批次的数据
example_data, example_targets = examples.next()
# 遍历获取到6条数据 展示观察一下
for i in range(6):
    plt.subplot(2, 3, i + 1)
    plt.imshow(example_data[i][0], cmap='gray')
    # 查看图片的大小 方便建立模型时输入的大小
    print(example_data[i][0].shape)

plt.show()

建立模型

建立模型之前定义输入大小和分类类别输出大小

通过上边查看图片的大小为28*28*1,所以输入大小为784

数字识别只有0~9所以为10个类别的多分类问题

input_size = 784
num_classes = 10

创建模型类

class NeuralNet(torch.nn.Module):
    def __init__(self, n_input_size, hidden_size, n_num_classes):
        """
        神经网络类初始化
        :param n_input_size: 输入
        :param hidden_size: 隐藏层
        :param n_num_classes: 输出
        """
        # 调用父类__init__方法
        super(NeuralNet, self).__init__()
        self.input_size = input_size
        # 第一层线性模型 传入输入层和隐藏层
        self.l1 = torch.nn.Linear(n_input_size, hidden_size)
        # relu激活函数层
        self.relu = torch.nn.ReLU()
        # 第二层线性模型 传入隐藏层和输出层
        self.l2 = torch.nn.Linear(hidden_size, n_num_classes)

    def forward(self, x):
        """
        重写正向传播函数  获取到预测值
        :param x: 数据
        :return: 预测值
        """
        # 线性模型
        out = self.l1(x)
        # 激活函数
        out = self.relu(out)
        # 线性模型2
        out = self.l2(out)
        # 返回预测值
        return out


# 获取到gpu设备
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# 创建模型并把模型放到当前支持的gpu设备中
model = NeuralNet(input_size, 500, num_classes).to(device)
print(model)

  • 可以看出模型一共三层
  • 输入层(节点数量和图小大小相同)
  • 隐藏层(节点数为500)
  • 输出层(输出节点数量为10 0~9

定义损失函数和优化

  • 因为是多分类问题,所以使用交叉熵函数的多分类损失函数
  • 因为传统的梯度下降存在一定缺陷,比如学习速率一直不变,所以使用PyTorch中梯度下降的优化算法Adam算法
# 定义学习率
learning_rate = 0.01
# 损失函数
criterion = torch.nn.CrossEntropyLoss()
# 定义优化器 参数1为模型的参数 lr为学习率
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

模型训练

训练步骤:

  • 通过模型类正向传播获取到预测结果
  • 通过损失函数传入预测结果和真实值计算损失
  • 通过反向传播获取梯度
  • 通过梯度下降更新模型参数的权重
  • 梯度清空,防止下次梯度累加
  • 循环,降低损失为我们想要的结果(提高模型精度)
# 定义训练的次数
num_epochs = 10
# 训练集数据的总长度
total_steps = len(train_loader)
# 遍历训练次数
for epoch in range(num_epochs):
    # 每次从数据加载器中取出一批数据  每批次100条
    for i, (images, labels) in enumerate(train_loader):
        # 把图片降维到一维数组  加载到gpu
        images = images.reshape(-1, 28 * 28).to(device)
        # 真实值加载到gpu
        labels = labels.to(device)
        # 正向传播 获取到预测值
        outputs = model(images)
        # 通过损失函数获取到损失值
        loss_val = criterion(outputs, labels)
        # 清空梯度
        optimizer.zero_grad()
        # 进行反向传播
        loss_val.backward()
        # 梯度下降更新参数
        optimizer.step()
        # 打印每次训练的损失值
        if i % 100 == 0:
            print(f'Loss:{loss_val.item():.4f}')

print('训练完成')
# 训练完之后保存模型
torch.save(model.state_dict(), './last.pt')

  • 损失值很明显的在收敛
  • 生成了pt模型文件

测试集抽取数据,查看预测结果

# 把测试集的数据加载器转为生成器
examples = iter(test_loader)
# next()方法获取一批数据
example_data, example_targets = examples.next()

# 拿出前三条
for i in range(3):
    # 画图展示
    plt.subplot(1, 3, i + 1)
    plt.imshow(example_data[i][0], cmap='gray')
plt.show()

images = example_data
# 图片将为加载到GPU
images = images.reshape(-1, 28 * 28).to(device)
# 正向传播获取预测结果
outputs = model(images)
# 打印结果 detach()方法结果不会计算梯度更新 转为numpy
print(f'真实结果:{example_targets[0:3].detach().numpy()}')
# 预测完的结果为10个数字的概率 使用argmax()根据行归一化并求自变量的概率最大值
print(f'预测结果:{np.argmax(outputs[0:3].cpu().detach().numpy(), axis=1)}')

计算模型精度

# 用测试集的数据,校验模型的准确率
with torch.no_grad():
    n_correct = 0
    n_samples = 0
    # 取出测试集数据
    for images, labels in test_loader:
        # 和训练代码一致
        images = images.reshape(-1, 28 * 28).to(device)
        labels = labels.to(device)
        outputs = model(images)

        # 返1 最大值 返2 索引                0每列最大值  1每行最大值
        _, predicted = torch.max(outputs.data, 1)
        n_samples += labels.size(0)
        n_correct += (predicted == labels).sum().item()
    # 计算模型精度
    acc = 100.0 * n_correct / n_samples
    print(f"准确率:{acc}%")

自己手写数字进行预测

import cv2
import numpy as np

import torch

from 手写数字神经网络结构 import NeuralNet

# 获取到gpu设备
device = torch.device('cuda')
# 加载保存好的模型
input_size = 784
num_classes = 10
model = NeuralNet(input_size, 500, num_classes)
# 因为保存模型时在GPU所以要指定map_location='cuda:0'
model.load_state_dict(torch.load('./last.pt', map_location='cuda:0'))
# 加载到gpu上
model.to(device)

# 局域内不计算梯度
with torch.no_grad():
    # cv2读取图片 灰度方式
    images = cv2.imread('./number_four.png', cv2.IMREAD_GRAYSCALE)
    # 使用大津算法进行二值化处理 并反转
    ret, thresh_img = cv2.threshold(images, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
    # 展示处理过后的图片
    cv2.imshow('png1', thresh_img)
    cv2.waiTKEy()
    # 图片降维 把拍的图片降维到和训练时的图片大小一样
    my_image = cv2.resize(thresh_img, (28, 28))
    # 转为numpy
    my_image = np.array(my_image, np.float32)
    # 转为torch的张量
    my_image = torch.from_numpy(my_image)
    # 降维
    my_image = my_image.reshape(-1, 28 * 28).to(device)
    # 正向传播获取预测值
    outputs = model(my_image)
    # 取出预测结果
    pred = np.argmax(outputs.cpu().detach().numpy(), axis=1)
    print(f'预测结果为:{pred[0]}')

 到此这篇关于PyTorch实现手写数字识别的示例代码的文章就介绍到这了,更多相关PyTorch 手写数字识别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: PyTorch实现手写数字识别的示例代码

本文链接: https://www.lsjlt.com/news/118455.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PyTorch实现手写数字识别的示例代码
    目录加载手写数字的数据数据加载器(分批加载)建立模型模型训练测试集抽取数据,查看预测结果计算模型精度自己手写数字进行预测加载手写数字的数据 组成训练集和测试集,这里已经下载好了,所以...
    99+
    2022-11-11
  • pytorch教程实现mnist手写数字识别代码示例
    目录1.构建网络2.编写训练代码3.编写测试代码4.指导程序train和test5.完整代码 1.构建网络 nn.Moudle是pytorch官方指定的编写Net模块,在init函数...
    99+
    2022-11-12
  • 超详细PyTorch实现手写数字识别器的示例代码
    前言 深度学习中有很多玩具数据,mnist就是其中一个,一个人能否入门深度学习往往就是以能否玩转mnist数据来判断的,在前面很多基础介绍后我们就可以来实现一个简单的手写数字识别的网...
    99+
    2022-11-11
  • pytorch实现手写数字图片识别
    本文实例为大家分享了pytorch实现手写数字图片识别的具体代码,供大家参考,具体内容如下 数据集:MNIST数据集,代码中会自动下载,不用自己手动下载。数据集很小,不需要GPU设备...
    99+
    2022-11-12
  • pytorch实现mnist手写彩色数字识别
    目录前言一 前期工作1.设置GPU或者cpu2.导入数据二 数据预处理1.加载数据2.可视化数据3.再次检查数据三 搭建网络四 训练模型1.设置学习率2.模型训练五 模型评估1.Lo...
    99+
    2022-11-11
  • pytorch如何实现手写数字图片识别
    这篇文章给大家分享的是有关pytorch如何实现手写数字图片识别的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下数据集:MNIST数据集,代码中会自动下载,不用自己手动下载。数据集很小,不需要GPU设备...
    99+
    2023-06-15
  • PyTorch简单手写数字识别的实现过程
    目录一、包导入及所需数据的下载关于数据集引入的改动二、进行数据处理变换操作三、数据预览测试和数据装载四、模型搭建和参数优化关于模型搭建的改动总代码:测试总结具体流程: ① 导入相应...
    99+
    2022-11-12
  • Python+Opencv实现数字识别的示例代码
    一、什么是数字识别?   所谓的数字识别,就是使用算法自动识别出图片中的数字。具体的效果如下图所示: 上图展示了算法的处理效果,算法能够自动的识别到LC...
    99+
    2022-11-11
  • PyTorch实现MNIST数据集手写数字识别详情
    目录一、PyTorch是什么?二、程序示例1.引入必要库2.下载数据集3.加载数据集4.搭建CNN模型并实例化5.交叉熵损失函数损失函数及SGD算法优化器6.训练函数7.测试函数8....
    99+
    2022-11-11
  • PyTorch实现手写数字的识别入门小白教程
    目录手写数字识别(小白入门)1.数据预处理2.训练模型3.测试模型,保存4.调用模型5.完整代码手写数字识别(小白入门) 今早刚刚上了节实验课,关于逻辑回归,所以手有点刺挠就想发个博...
    99+
    2022-11-11
  • PyTorch简单手写数字识别的实现过程是怎样的
    本篇文章给大家分享的是有关PyTorch简单手写数字识别的实现过程是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、包导入及所需数据的下载torchvision包的主要...
    99+
    2023-06-25
  • Python实现识别图片为文字的示例代码
    目录1、环境准备2、业务实现3、效果展示本来想着做一个将图片识别为文字的小功能,本想到Google上面第一页全是各种收费平台的广告。 这些平台提供的基本都是让我们通过调用相关的三方接...
    99+
    2022-11-11
  • Java实现BP神经网络MNIST手写数字识别的示例详解
    目录一、神经网络的构建二、系统架构服务器客户端采用MVC架构一、神经网络的构建 (1):构建神经网络层次结构 由训练集数据可知,手写输入的数据维数为784维,而对应的输出结果为分别为...
    99+
    2023-01-31
    Java实现手写数字识别 Java手写数字识别 Java数字识别
  • JavaScript实现手写promise的示例代码
    目录背景需求then的链式调用Promise.all背景 promise 作为前端开发中常用的函数,解决了 js 处理异步时回调地狱的问题,大家应该也不陌生了,今天来学习一下 pro...
    99+
    2023-05-15
    JavaScript手写promise JavaScript promise
  • C++编程模板匹配超详细的识别手写数字实现示例
    首先,本篇文章用到的方法是模板匹配,而不是基于神经网络的,还请各位注意了!(模板匹配还请自行了解,站上有很多介绍)我刚开始做实验的时候只有一点c++基础,对于文件和opencv我一点...
    99+
    2022-11-12
  • python实现图像识别的示例代码
    一、安装库 首先我们需要安装PIL和pytesseract库。 PIL:(Python Imaging Library)是Python平台上的图像处理标准库,功能非常强大。 pyte...
    99+
    2022-11-11
  • Unity实现动物识别的示例代码
    接口介绍: 识别近八千种动物,接口返回动物名称,并可获取识别结果对应的百科信息;还可使用EasyDL定制训练平台,定制识别分类标签。适用于拍照识图、幼教科普、图像内容分析等场景 创建...
    99+
    2022-11-13
  • Unity实现菜品识别的示例代码
    接口介绍: 识别超过9千种菜品,支持客户创建属于自己的菜品图库,可准确识别图片中的菜品名称、位置、卡路里信息,并获取百科信息,适用于多种客户识别菜品的业务场景中。 创建应用: &nb...
    99+
    2022-11-13
  • Unity实现红酒识别的示例代码
    接口介绍: 识别图像中的红酒标签,返回红酒名称、国家、产区、酒庄、类型、糖分、葡萄品种、酒品描述等信息,可识别数十万中外红酒;支持自定义红酒图库,在自建库中搜索特定红酒信息。 创建应...
    99+
    2022-11-13
  • Unity实现车型识别的示例代码
    接口介绍: 该请求用于检测一张车辆图片的具体车型。即对于输入的一张图片(可正常解码,且长宽比适宜),输出图片的车辆品牌及型号。 创建应用: 在产品服务中搜索图像识别,创建应用,获取A...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作