附源码|paddle paddle实现手写数字识别

paddlepaddle手写字体识别 本文利用多层感知器训练(DNN)模型,用于预测手写数字图片,示例如下: 实践总体过程和步骤 首先导入必要的包 #导入需要的包 import numpy as np import paddle as paddle import paddle.fluid as fluid from PIL import Image import matplotlib.pyplot as plt import os... 阅读详情

本文是基于paddle paddle采用多层感知器实现手写数字识别问题。

#导入需要的包
import numpy as np
import paddle as paddle
import paddle.fluid as fluid
from PIL import Image
import matplotlib.pyplot as plt
import os

Step1:准备数据。

(1)数据集介绍

MNIST数据集包含60000个训练集和10000测试数据集。分为图片和标签,图片是28*28的灰度图像,标签为0~9共10个数字。

train_reader = paddle.batch(paddle.reader.shuffle(paddle.dataset.mnist.train(),buf_size=512),batch_size=128)
test_reader = paddle.batch(paddle.dataset.mnist.test(),batch_size=128)  
BATCH_SIZE = 128

Step2.网络配置

以下的代码判断就是定义一个简单的多层感知器,一共有三层,两个大小为100的隐层和一个大小为10的输出层,因为MNIST数据集是手写0到9的灰度图像,类别有10个,所以最后的输出大小是10。最后输出层的激活函数是Softmax,所以最后的输出层相当于一个分类器。加上一个输入层的话,多层感知器的结构是:输入层–>>隐层–>>隐层–>>输出层。
在这里插入图片描述

# 定义多层感知器
def multilayer_perceptron(input):
    #请在此完成感知器模型定义
      # 第一个全连接层,激活函数为ReLU
    hidden1 = fluid.layers.fc(input=input, size=100, act='relu')
    # 第二个全连接层,激活函数为ReLU
    hidden2 = fluid.layers.fc(input=hidden1, size=100, act='relu')
    # 以softmax为激活函数的全连接输出层,大小为10
    prediction = fluid.layers.fc(input=hidden2, size=10, act='softmax')
    return prediction

(2)定义数据层

输入的是图像数据。图像是2828的灰度图,所以输入的形状是[1, 28, 28],如果图像是32*32的彩色图,那么输入的形状是[3. 32, 32],因为灰度图只有一个通道,而彩色图有RGB三个通道。

# 定义输入输出层
image = fluid.layers.data(name='image', shape=[1, 28, 28], dtype='float32')#单通道,28*28像素值
label = fluid.layers.data(name='label', shape=[1], dtype='int64')          #图片标签
# 获取分类器
predict = multilayer_perceptron(image)
print(predict)

(4)定义损失函数和准确率

这次使用的是交叉熵损失函数,该函数在分类任务上比较常用。

定义了一个损失函数之后,还有对它求平均值,因为定义的是一个Batch的损失值。

同时我们还可以定义一个准确率函数,这个可以在我们训练的时候输出分类的准确率。

# 获取损失函数和准确率函数
cost = fluid.layers.cross_entropy(input=predict, label=label)  #使用交叉熵损失函数,描述真实样本标签和预测概率之间的差值
avg_cost = fluid.layers.mean(cost)
acc = fluid.layers.accuracy(input=predict, label=label)

(5)定义优化方法

这次我们使用的是Adam优化方法,同时指定学习率为0.001

# 定义优化方法
optimizer = fluid.optimizer.AdamOptimizer(learning_rate=0.004)   #使用Adam算法进行优化
opts = optimizer.minimize(avg_cost)

在上述模型配置完毕后,得到两个fluid.Program:fluid.default_startup_program() 与fluid.default_main_program() 配置完毕了。

参数初始化操作会被写入fluid.default_startup_program()

fluid.default_main_program()用于获取默认或全局main program(主程序)。该主程序用于训练和测试模型。fluid.layers 中的所有layer函数可以向 default_main_program 中添加算子和变量。default_main_program 是fluid的许多编程接口(API)的Program参数的缺省值。例如,当用户program没有传入的时候, Executor.run() 会默认执行 default_main_program 。

Step3.模型训练 and Step4.模型评估

(1)创建Executor

首先定义运算场所 fluid.CPUPlace()和 fluid.CUDAPlace(0)分别表示运算场所为CPU和GPU

Executor:接收传入的program,通过run()方法运行program。

# 定义一个使用CPU的解析器
place = fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())

(2)定义数据映射器

feeder = fluid.DataFeeder(place=place, feed_list=[image, label])

(3)展示模型训练曲线

all_train_iter=0
all_train_iters=[]
all_train_costs=[]
all_train_accs=[]

def draw_train_process(title,iters,costs,accs,label_cost,lable_acc):
    plt.title(title, fontsize=24)
    plt.xlabel("iter", fontsize=20)
    plt.ylabel("cost/acc", fontsize=20)
    plt.plot(iters, costs,color='red',label=label_cost) 
    plt.plot(iters, accs,color='green',label=lable_acc) 
    plt.legend()
    plt.grid()
    plt.show()

(4)训练并保存模型

Executor接收传入的program,并根据feed map(输入映射表)和fetch_list(结果获取表) 向program中添加feed operators(数据输入算子)和fetch operators(结果获取算子)。

feed map为该program提供输入数据。fetch_list提供program训练结束后用户预期的变量。

EPOCH_NUM=10
model_save_dir = "/home/aistudio/data/hand.inference.model"
for pass_id in range(EPOCH_NUM):
    # 进行训练
    for batch_id, data in enumerate(train_reader()):                         #遍历train_reader
        train_cost, train_acc = exe.run(program=fluid.default_main_program(),#运行主程序
                                        feed=feeder.feed(data),              #给模型喂入数据
                                        fetch_list=[avg_cost, acc])          #fetch 误差、准确率  
        
        all_train_iter=all_train_iter+BATCH_SIZE
        all_train_iters.append(all_train_iter)
        all_train_costs.append(train_cost[0])
        all_train_accs.append(train_acc[0])
        
        # 每100个batch打印一次信息  误差、准确率
        if batch_id % 100 == 0:
            print('Pass:%d, Batch:%d, Cost:%0.5f, Accuracy:%0.5f' %
                  (pass_id, batch_id, train_cost[0], train_acc[0]))

    # 进行测试
    test_accs = []
    test_costs = []
    #每训练一轮 进行一次测试
    for batch_id, data in enumerate(test_reader()):                         #遍历test_reader
        test_cost, test_acc = exe.run(program=fluid.default_main_program(), #执行训练程序
                                      feed=feeder.feed(data),               #喂入数据
                                      fetch_list=[avg_cost, acc])           #fetch 误差、准确率
        test_accs.append(test_acc[0])                                       #每个batch的准确率
        test_costs.append(test_cost[0])                                     #每个batch的误差
        

       
    # 求测试结果的平均值
    test_cost = (sum(test_costs) / len(test_costs))                         #每轮的平均误差
    test_acc = (sum(test_accs) / len(test_accs))                            #每轮的平均准确率
    print('Test:%d, Cost:%0.5f, Accuracy:%0.5f' % (pass_id, test_cost, test_acc))
    
    #保存模型
    # 如果保存路径不存在就创建
    if not os.path.exists(model_save_dir):
        os.makedirs(model_save_dir)
    print ('save models to %s' % (model_save_dir))
    fluid.io.save_inference_model(model_save_dir,  #保存推理model的路径
                                  ['image'],       #推理(inference)需要 feed 的数据
                                  [predict],         #保存推理(inference)结果的 Variables
                                  exe)             #executor 保存 inference model
draw_train_process("training",all_train_iters,all_train_costs,all_train_accs,"trainning cost","trainning acc")

Step5.模型预测

(1)图片预处理

在预测之前,要对图像进行预处理。

首先进行灰度化,然后压缩图像大小为28*28,接着将图像转换成一维向量,最后再对一维向量进行归一化处理。

def load_image(file):
    im = Image.open(file).convert('L')                        #将RGB转化为灰度图像,L代表灰度图像,像素值在0~255之间
    im = im.resize((28, 28), Image.ANTIALIAS)                 #resize image with high-quality 图像大小为28*28
    im = np.array(im).reshape(1, 1, 28, 28).astype(np.float32)#返回新形状的数组,把它变成一个 numpy 数组以匹配数据馈送格式。
    print(im)
    im = im / 255.0 * 2.0 - 1.0                               #归一化到【-1~1】之间
    return im

(2)使用Matplotlib工具显示这张图像。

infer_path='data/data5435/infer_9.jpg'
img = Image.open(infer_path)
plt.imshow(img)   #根据数组绘制图像
plt.show()        #显示图像

(3)创建预测用Executer

infer_exe = fluid.Executor(place)
inference_scope = fluid.core.Scope()
#运行时中的所有变量都将分配给新的scope

with fluid.scope_guard(inference_scope):

    #获取训练好的模型

    #从指定目录中加载模型

    [inference_program,                                            #推理Program

     feed_target_names,                                            #是一个str列表,它包含需要在推理 Program 中提供数据的变量的名称。 

     fetch_targets] = fluid.io.load_inference_model(model_save_dir,#fetch_targets:是一个列表,从中我们可以得到推断结果。model_save_dir:模型保存的路径

                                                    infer_exe)     #infer_exe: 运行 inference model的 executor

    infer_path='data/data5435/infer_9.jpg'

    img = load_image(infer_path)



    results = infer_exe.run(program=inference_program,         #运行推测程序

                   feed={feed_target_names[0]: img},           #喂入要预测的img

                   fetch_list=fetch_targets)                   #得到推测结果,  

    # 获取概率最大的label

    lab = np.argsort(results)                                  #argsort函数返回的是result数组值从小到大的索引值

    # print(lab)

    print("该图片的预测结果的label为: %d" % lab[0][0][-1])     #-1代表读取数组中倒数第一列

(4)开始预测

通过fluid.io.load_inference_model,预测器会从params_dirname中读取已经训练好的模型,来对从未遇见过的数据进行预测。
PaddleOCR对于手写符号识别,从零开始搭建(包括期间遇到的所有问题) 使用PaddleOCR对需要对手写图片进行识别 勾,叉,圈,识别成对于的 v,x,o 其他的符号识别成 e 阅读详情

相关推荐

paddleocr自定义字典训练自己的数据集(rec模块)

下载的paddleocr的2.3版本。地址是paddleocr 检测模块用的是 det模块跑的慢,所以训练了一下rec模块。 默认的字典在ppocr_keys_v1.txt文件里面,6000多个符号。有些字识别的不是很好。从中挑选了60个字符,以同样的格式保存了一个txt文件(UTF-8格式)。在配置文件中把字典换为保存的txt文件名 这里为了方便生成训练图片只挑选了60个字。这里改字典好像还不起作用,需要在paddleocr.py文件中做修改如下: 把 for action in parser

netccdn的博客 6764

PaddleOCR训练手写文字识别模型

PaddleOCR训练手写文字识别模型

ronshi的博客 2801

手写文字识别:PaddleOCR基于PPOCRv4的垂类场景模型微调

PaddleOCR提供的PP-OCR系列模型在通用场景中性能优异,能够解决绝大多数情况下的检测与识别问题。在垂类场景中,如果希望获取更优的模型效果,可以通过模型微调的方法,进一步提升PP-OCR系列检测与识别模型的精度。

简简单单的学习笔记,致力于帮助更多前进路上的朋友~ 1万+

linux手写数字识别,基于树莓派4B与Paddle-Lite实现的手写数字识别

raspi4B_num_demo基于树莓派4B与Paddle-Lite实现的手写数字识别环境要求ARMLinux armLinux即可,理论上32位系统也可运行,需要自行编译预测库,Paddle-Lite预编译库gcc g++ opencv cmake的安装(以下所有命令均在设备上操作)$ sudo apt-get update$ sudo apt-get install gcc g++ make...

weixin_31889665的博客 700

paddle ocr 文字识别模型训练 svtr

○ 包含汉字、英文字母、数字和标点共5990个字符(字符集合:https://github.com/YCG09/chinese_ocr/blob/master/train/char_std_5990.txt )参考:https://github.com/PaddlePaddle/PaddleOCR/blob/main/doc/doc_ch/dataset/datasets.md。训练后参数分布会变,所以预测的图片与训练的图片分布相似时,准确率会更高。如果用预训练模型预测,准确度只有68%

every place is the center of the universe 3036

OCR开发实战:如何用PaddleOCR C++版实现本地文字识别(附模型文件处理技巧)

本文详细介绍了如何使用PaddleOCR C++版实现本地文字识别,包括环境搭建、工程编译、运行时优化等全流程。重点讲解了在VS2019/VS2022环境下配置PaddleOCR的CPU推理性能优化技巧,以及模型文件处理的实际应用方法,帮助开发者高效完成OCR本地化部署。

devops8pract的博客 335

附源码|paddle paddle实现猫狗识别

本文是基于paddle paddle采用CNN实现猫狗识别案例。 author:小黄 缓慢而坚定的生长 图像分类是根据图像的语义信息将不同类别图像区分开来,是计算机视觉中重要的基本问题 猫狗分类属于图像分类中的粗粒度分类问题 step1.数据准备 #导入需要的包 import paddle as paddle import paddle.fluid as fluid import numpy as np from PIL import Image import matplotlib.pyplot as

小黄的博客 2738

Paddle手写数字识别全流程:LeNet-5训练、模型导出与便携打包

深度学习入门常从图像分类任务开始,手写数字识别作为其中最具代表性的基础问题,既适合理解卷积神经网络原理,也能串联起完整的工程落地链路。基于Paddle框架,开发者可以快速获取MNIST数据集,构建LeNet-5模型完成训练,并通过动态图转静态图导出标准化推理文件。然而真正考验工程能力的是如何把模型交付给没有框架环境的用户。借助PyInstaller等工具,将依赖库、权重和启动脚本聚合为免安装的zip包,可以大幅降低部署门槛。无论面向初学者验证训练流程,还是供工程人员排查打包问题,用MNIST走通从数据预处理

weixin_32678995的博客 93

基于PaddlePaddle的LeNet神经网络来解决识别手写数字任务

基于PaddlePaddle的LeNet神经网络来解决识别手写数字任务

qq_51447436的博客 5711

LT9211 单路mipi转双路mipi芯片,方案成熟,提供技术支持

LT9211 单路mipi转双路mipi芯片

TEL15012949045的博客 5026

基于DE2-115红外解码实验

基于DE2-115红外解码实验   一、   功能描述 在同一个遥控电路中通常要使用实现不同的遥控功能或区分不同的机器类型, 这样就要求信号按一定的编码传送,编码则会由编码芯片或电路完成。对应于编码芯片通常会有相配对的解码芯片或包含解码模块的应用芯片。在实际的产品设计或业余电子制作中,编码芯片并一定能完成我们要求的功能,这时我们就需要了解所使用的编码芯片到底是如何编码的。只有知道编码方式,我...

乘风的博客 2516

基于飞桨paddle的极简方案构建手写数字识别模型测试代码

基于飞桨paddle的极简方案构建手写数字识别模型测试代码。因为是极简方案采用的是线性回归模型,所以预测结果数字不一致。原始测试图片为255X252的图片。本次预测的数字是 [[3]]

hsg77的专栏 809

IMA知识库:从0到1的架构设计与实践

本文探讨了AI时代知识库系统的架构设计与演进路径。通过分析知识入库、知识管理和知识应用三大核心业务流程,提出了应对数据多样性、处理标准化、流量洪峰等挑战的解决方案。重点介绍了基于统一数据格式的解耦设计、异步处理架构、服务拆分策略以及权限安全体系,构建了一个稳定、高效且可扩展的知识库系统。文章强调优秀架构需要持续演进,通过识别薄弱点不断优化,最终实现技术方案与业务需求的平衡。

lovehu6686的博客 1738

Langchain从零开始到应用落地案例[AI智能助手]【3】---使用Paddle-OCR识别优化可识别图片进行解析回答

在上一篇章节,我们实现了基于文件来进行回答,不过还遗留了一些问题,那就是无法识别带有文字的图片,不过现在会在这篇篇章进行问题解决。原因是markitdown的官网并没有写明白,mrkitdown并不具备含有ocr图片文件识别,但是标注了,ocr识别是基于模型是否能够支持图片输入进行回答,那就需要含有视觉的模型来支撑这个ocr,如果你的模型本身就是普通的聊天模型,那不好意思,识别不到。那么开启本篇章的学习吧!!!!!

Aainm的博客 1281

[QDS]从零开始,写第一个Qt Design Studio到程序调用的项目

最近在使用Qt Design Studio进行开发,但是简中网上要不就是只搜得到Qt Designer(Qt Creator内部库),要不就只搜得到一点营销号不知道从哪里搬来的账号,鉴于Qt Design Studio是一个这么强大的软件,自然是需要来进行一下小小的实践的。所以开了这篇文章,方便没有使用过Qt Design Studio 和 QML的开发者也可以快速上手QDS(Qt Design Studio)。在本文中,你将学会如何使用QDS开发一个简单的QML程序,与你的C++后端代码进行交流。

Andius的博客 8215

Qualcomm工具的使用

简介   由于我们公司主要是以高通平台为主,所以工具的使用是必不可少的,包括QPST、QRCT3、QXDM、QDART等。   高通工具顾名思义就是,对于高通平台的软件开发进行软件的烧录,软件的调试,软件的Log的抓取和分析过程,像我们平常用的大致就是烧版本、改NV、制作QCN、然后校准、强发强收等操作。 QPST   QPST主要是用来做一些参数的配置,包括EFS文件的编辑,QCN的导入和备份与...

Jimmy 2万+

【源码+文档】基于paddle的YOLOv3车辆检测和类型识别

它可以将 TensorFlow、Caffe 的模型转换为 PaddlePaddle 的核心框架 Paddle Fluid 可加载的格式。同时 X2Paddle 还支持 ONNX 格式的模型转换,这样也相当于支持了众多可以转换为 ONNX 格式的框架,比如 PyTorch、MXNet、CNTK 等。开发者基于不同的深度学习框架能够得到不同的训练模型,如果想要基于一种框架进行预测,就必须要解决不同框架的模型之间的匹配问题。(下面只是演示一下如何使用 X2Paddle 进行模型转换,感兴趣的同学可以试一下)

yuxibdd的博客 450

阿里云 Docker 镜像加速收费后:这些免费替代方案值得收藏

阿里云Docker镜像加速服务收费后,国内开发者急需免费替代方案。本文推荐2025年仍可用的7个免费镜像源,包括轩辕镜像、DaoCloud、网易云等,并提供多源配置方案以提高稳定性。建议开发者在CI/CD环境中配置多个镜像源,避免构建失败。文章还提供了详细的配置步骤和使用建议,适合个人和团队开发者参考。

sg_knight的专栏 1931

linux paddle For C++环境搭建

paddle + Qt 开发 C++ linux

weixin_45850062的博客 2070

6、基于集成学习技术的边坡稳定性预测及滑坡易发性研究

本研究基于集成学习技术对云阳县的边坡稳定性及滑坡易发性进行预测分析。通过比较SVM、RF、XGBoost和LR四种模型,发现集成学习模型在准确率和少数类识别方面表现更优。特征重要性分析表明剖面形状是影响边坡稳定性的关键因素。同时,引入基于定性分析的分区建模方法,构建父模型与子区域模型,提升了滑坡易发性制图的精度。研究成果为地质灾害的预防与管理提供了科学依据和技术支持。

peach的博客 128

Cleo Synchronization接口任意文件读取漏洞CVE-2024-50623 附POC

微信公众号搜索:南风漏洞复现文库该文章 南风漏洞复现文库 公众号首发Cleo。

nnn2188185的博客 481

douyin-vue 视频播放地址从哪来?aweme_id 与 video_id 的完整链路

打开 douyin-vue 的数据文件,你会看到每条视频同时带着 `7265649807396474112` 这样的纯数字和 `v0300fg10000cna0c8bc77ufge7emlsg` 这样的长串。查评论该用哪个?拼播放地址又该用哪个?很多读者第一次碰这套抖音数据时,就是卡在这两个 ID 的分工上。本文拆解 aweme_id 与 video_id 在 douyin-vue 里从接口请求、

gitblog_00605的博客 988

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Paddle的安装与使用教程

Paddle的安装与使用教程 【免费下载链接】Paddle Parallel Distributed Deep Learning: Machine Learning Framework from Industrial Practice (『飞桨』核心框架,深度学习&机器学习高性能单机、分布式训练和跨平台部署) ...

gitblog_01421的博客 953

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【深度学习实践】手写数字识别任务(附:No module named“paddle”报错、PEP 8: E402 module level import ...报错、未显示图片的解决办法)

在安装完PaddlePaddle后,本人继续开展深度学习的实践,跟着PaddlePaddle官网中手写数字识别任务进行实践,只是我的实践过程中还是遇到了问题。因此,整理这篇博文,为了记录下自己的实践过程以自用,同时也希望帮助需要的你。

qq_36344652的博客 1614

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

3天快速掌握Paddle.js:浏览器端AI模型部署终极指南 [特殊字符]

想要在浏览器中轻松部署AI模型吗?Paddle.js正是你需要的终极解决方案!作为百度飞桨(PaddlePaddle)的Web项目,它让你能够在支持WebGL/WebGPU/WebAssembly的浏览器中运行深度学习模型。无论你是前端开发者还是AI爱好者,这篇文章将带你快速上手Paddle.js的核心功能。 ## 🤔 什么是Paddle.js? Paddle.js是一个强大的浏览器端AI推

gitblog_00959的博客 1039
上一篇: 附源码|paddle paddle实现鸢尾花分类
下一篇: 附源码|paddle paddle实现猫狗识别
xiao黄
xiao黄 优质创作者: 人工智能技术领域 优质创作者: 人工智能技术领域 领域专家: 数据科学与机器学习技术领域 领域专家: 数据科学与机器学习技术领域
博客等级 码龄8年 1万+粉丝 250原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiao黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值