摘要

本文将介绍的有关于的paddle的实战的相关的问题,并分析相关的代码的阅读和解释。并扩展有关于的python的有关的语言。介绍了深度学习步骤: 1. 数据处理:读取数据 和 预处理操作 2. 模型设计:网络结构(假设) 3. 训练配置:优化器(寻解算法) 4. 训练过程:循环调用训练过程,包括前向计算 + 计算损失(优化目标) + 后向传播 5. 保存模型并测试:将训练好的模型保存。

手写数字识别任务

数字识别是计算机从纸质文档、照片或其他来源接收、理解并识别可读的数字的能力,目前比较受关注的是手写数字识别。手写数字识别是一个典型的图像分类问题,已经被广泛应用于汇款单号识别、手写邮政编码识别等领域,大大缩短了业务处理时间,提升了工作效率和质量。

在处理如 图1 所示的手写邮政编码的简单图像分类任务时,可以使用基于MNIST数据集的手写数字识别模型。MNIST是深度学习领域标准、易用的成熟数据集,包含50 000条训练样本和10 000条测试样本。

  • 任务输入:一系列手写数字图片,其中每张图片都是28x28的像素矩阵。
  • 任务输出:经过了大小归一化和居中处理,输出对应的0~9的数字标签。

构建手写数字识别的神经网络模型

使用飞桨完成手写数字识别模型任务的代码结构如 图2 所示,与使用飞桨完成房价预测模型任务的流程一致,下面的章节中我们将详细介绍每个步骤的具体实现方法和优化思路。

深度学习步骤:源码

1. 数据处理:读取数据 和 预处理操作

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@version: 1.0
@author: xjl
@file: data_process.py
@time: 2021/3/4 10:21
"""
#导入需要的包
import paddle as paddle
BUF_SIZE = 512
BATCH_SIZE = 128# 1、读取数据
def load_data():train_reader = paddle.batch(paddle.reader.shuffle(paddle.dataset.mnist.train(),buf_size=BUF_SIZE),batch_size=BATCH_SIZE)# 用于训练的数据提供器,每次从缓存中随机读取批次大小的数据test_reader = paddle.batch(paddle.reader.shuffle(paddle.dataset.mnist.test(),buf_size=BUF_SIZE),batch_size=BATCH_SIZE)return train_reader, test_reader

2. 模型设计:网络结构(假设)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@version: 1.0
@author: xjl
@file: train_model.py.py
@time: 2021/3/4 10:51
"""
import paddle.fluid as fluid#使用的是默认的卷积层
def multilayer_perceptron(input):# 第一个全连接层,激活函数为ReLUhidden1 = fluid.layers.fc(input=input, size=200, act='relu')# 第二个全连接层,激活函数为ReLUhidden2 = fluid.layers.fc(input=hidden1, size=200, act='relu')# 以softmax为激活函数的全连接输出层,输出层的大小必须为数字的个数10prediction = fluid.layers.fc(input=hidden2, size=10, act='softmax')return prediction# 构建一个不同的神经网络的模型的 使用的参数是不一致的
def multilayer_perceptron_update(input):conv_pool_1 = fluid.nets.simple_img_conv_pool(input=input,filter_size=5,num_filters=20,pool_size=2,pool_stride=2,act="relu")conv_pool_1 = fluid.layers.batch_norm(conv_pool_1)# 第二个卷积-池化层# 使用50个5*5的滤波器,池化大小为2,池化步长为2,激活函数为Reluconv_pool_2 = fluid.nets.simple_img_conv_pool(input=conv_pool_1,filter_size=5,num_filters=50,pool_size=2,pool_stride=2,act="relu")# 以softmax为激活函数的全连接输出层,输出层的大小必须为数字的个数10prediction = fluid.layers.fc(input=conv_pool_2, size=10, act='softmax')return prediction

3. 训练配置:优化器(寻解算法)
4. 训练过程:循环调用训练过程,包括前向计算 + 计算损失(优化目标) + 后向传播

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@version: 1.0
@author: xjl
@file: train_model.py.py
@time: 2021/3/4 10:49
"""
import paddle.fluid as fluid
import matplotlib.pyplot as plt
import os
from Paddle_Number.row_data.data_process import load_data
from Paddle_Number.model_build.nn import multilayer_perceptronBUF_SIZE = 512
BATCH_SIZE = 128
model_save_dir = r"D:/softwaresavfile/Github/machine_learning/Paddle_Number/mode_save/"# 画图的功能
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.savefig(r"D:\\softwaresavfile\\Github\\machine_learning\\Paddle_Number\\train_model\\train_img\\train_loss")plt.show()# 4、开始训练
def trainer():train_reader, test_reader = load_data()# 输入的原始图像数据,大小为1*28*28image = fluid.layers.data(name='image', shape=[1, 28, 28], dtype='float32')  # 单通道,28*28像素值# 标签,名称为label,对应输入图片的类别标签label = fluid.layers.data(name='label', shape=[1], dtype='int64')  # 图片标签# 获取分类器predict = multilayer_perceptron(image)# 使用交叉熵损失函数,描述真实样本标签和预测概率之间的差值cost = fluid.layers.cross_entropy(input=predict, label=label)# 使用类交叉熵函数计算predict和label之间的损失函数avg_cost = fluid.layers.mean(cost)# 计算分类准确率acc = fluid.layers.accuracy(input=predict, label=label)# 使用Adam算法进行优化, learning_rate 是学习率(它的大小与网络的训练收敛速度有关系)optimizer = fluid.optimizer.AdamOptimizer(learning_rate=0.001)opts = optimizer.minimize(avg_cost)# 定义使用CPU还是GPU,使用CPU时use_cuda = False,使用GPU时use_cuda = Trueuse_cuda = Falseplace = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()# 获取测试程序test_program = fluid.default_main_program().clone(for_test=True)exe = fluid.Executor(place)exe.run(fluid.default_startup_program())feeder = fluid.DataFeeder(place=place, feed_list=[image, label])all_train_iter = 0all_train_iters = []all_train_costs = []all_train_accs = []EPOCH_NUM = 2for pass_id in range(EPOCH_NUM):# 进行训练for batch_id, data in enumerate(train_reader()):  # 遍历train_readertrain_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_SIZEall_train_iters.append(all_train_iter)all_train_costs.append(train_cost[0])all_train_accs.append(train_acc[0])# 每200个batch打印一次信息  误差、准确率if batch_id % 200 == 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_readertest_cost, test_acc = exe.run(program=test_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)结果的 Variablesexe)  # executor 保存 inference modelprint('训练模型保存完成!')draw_train_process("training", all_train_iters, all_train_costs, all_train_accs, "trainning cost", "trainning acc")if __name__ == '__main__':trainer()

5. 保存模型并测试:将训练好的模型保存

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@version: 1.0
@author: xjl
@file: infer_model.py
@time: 2021/3/4 11:01
"""
import numpy as np
import paddle.fluid as fluid
from PIL import Image
import matplotlib.pyplot as pltuse_cuda = True
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()model_save_dir = r"D:\softwaresavfile\Github\machine_learning\手写数学的识别\mode_save\__model__"# 图片预处理
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*28im = 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# 预测函数
def predict(infer_path):# 查询原来的图像# infer_path = '预测文件的路径'img = Image.open(infer_path)plt.imshow(img)  # 根据数组绘制图像plt.show()  # 显示图像# 创建Executerinfer_exe = fluid.Executor(place)inference_scope = fluid.core.Scope()# 加载数据并开始预测plt.imshow(img)  # 根据数组绘制图像plt.show()  # 显示图像with fluid.scope_guard(inference_scope):# 获取训练好的模型# 从指定目录中加载 推理model(inference model)[inference_program,  # 推理Programfeed_target_names,  # 是一个str列表,它包含需要在推理 Program 中提供数据的变量的名称。fetch_targets] = fluid.io.load_inference_model(model_save_dir,# fetch_targets:是一个 Variable 列表,从中我们可以得到推断结果。model_save_dir:模型保存的路径infer_exe)  # infer_exe: 运行 inference model的 executorimg = load_image(infer_path)results = infer_exe.run(program=inference_program,  # 运行推测程序feed={feed_target_names[0]: img},  # 喂入要预测的imgfetch_list=fetch_targets)  # 得到推测结果,# 获取概率最大的labellab = np.argsort(results)  # argsort函数返回的是result数组值从小到大的索引值print("该图片的预测结果的label为: %d" % lab[0][0][-1])  # -1代表读取数组中倒数第一列if __name__ == '__main__':predict()

构建波士顿房价预测的神经网络模型

1. 数据处理:读取数据 和 预处理操作

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@version: 1.0
@author: xjl
@file: data_process.py
@time: 2021/3/4 14:01
"""
from __future__ import print_function
import paddle
import numpy
import six.movesdef load_data_txt(filename):"""如果想直接从txt文件中读取数据的话,可以参考以下方式。:param filename::return:"""feature_names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT','convert']feature_num = len(feature_names)data = numpy.fromfile(filename, sep=' ')  # 从文件中读取原始数据data = data.reshape(data.shape[0] // feature_num, feature_num)maximums, minimums, avgs = data.max(axis=0), data.min(axis=0), data.sum(axis=0) / data.shape[0]for i in six.moves.range(feature_num - 1): data[:, i] = (data[:, i] - avgs[i]) / (maximums[i] - minimums[i])  # six.moves可以兼容python2和python3ratio = 0.8  # 训练集和验证集的划分比例offset = int(data.shape[0] * ratio)train_data = data[:offset]test_data = data[offset:]train_reader = paddle.batch(paddle.reader.shuffle(train_data, buf_size=500), batch_size=BATCH_SIZE)test_reader = paddle.batch(paddle.reader.shuffle(test_data, buf_size=500), batch_size=BATCH_SIZE)if __name__ == '__main__':BATCH_SIZE = 20train_reader = paddle.batch(paddle.reader.shuffle(paddle.dataset.uci_housing.train(), buf_size=500),batch_size=BATCH_SIZE)test_reader = paddle.batch(paddle.reader.shuffle(paddle.dataset.uci_housing.test(), buf_size=500),batch_size=BATCH_SIZE)

2. 模型设计:网络结构(假设)

cost = fluid.layers.square_error_cost(input=y_predict, label=y)  # 利用标签数据和输出的预测数据估计方差
avg_loss = fluid.layers.mean(cost)  # 对方差求均值,得到平均损失

3. 训练配置:优化器(寻解算法)

#有些operator在训练和测试之间的操作是不同的,例如batch_norm,使用参数for_test来区分该程序是用来训练还是用来测试
#该api不会删除任何操作符,请在backward和optimization之前使用
test_program = main_program.clone(for_test=True)sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.001)
sgd_optimizer.minimize(avg_loss)

4. 训练过程:循环调用训练过程,包括前向计算 + 计算损失(优化目标) + 后向传播

import paddle.nn.functional as F
y_preds = []
labels_list = []def train(model):print('start training ... ')# 开启模型训练模式model.train()EPOCH_NUM = 500train_num = 0optimizer = paddle.optimizer.SGD(learning_rate=0.001, parameters=model.parameters())for epoch_id in range(EPOCH_NUM):# 在每轮迭代开始之前,将训练数据的顺序随机的打乱np.random.shuffle(train_data)# 将训练数据进行拆分,每个batch包含20条数据mini_batches = [train_data[k: k+BATCH_SIZE] for k in range(0, len(train_data), BATCH_SIZE)]for batch_id, data in enumerate(mini_batches):features_np = np.array(data[:, :13], np.float32)labels_np = np.array(data[:, -1:], np.float32)features = paddle.to_tensor(features_np)labels = paddle.to_tensor(labels_np)#前向计算y_pred = model(features)cost = F.mse_loss(y_pred, label=labels)train_cost = cost.numpy()[0]#反向传播cost.backward()#最小化loss,更新参数optimizer.step()# 清除梯度optimizer.clear_grad()if batch_id%30 == 0 and epoch_id%50 == 0:print("Pass:%d,Cost:%0.5f"%(epoch_id, train_cost))train_num = train_num + BATCH_SIZEtrain_nums.append(train_num)train_costs.append(train_cost)model = Regressor()
train(model)

5. 保存模型并测试:将训练好的模型保存。

#获取预测数据
INFER_BATCH_SIZE = 100infer_features_np = np.array([data[:13] for data in test_data]).astype("float32")
infer_labels_np = np.array([data[-1] for data in test_data]).astype("float32")infer_features = paddle.to_tensor(infer_features_np)
infer_labels = paddle.to_tensor(infer_labels_np)
fetch_list = model(infer_features)sum_cost = 0
for i in range(INFER_BATCH_SIZE):infer_result = fetch_list[i][0]ground_truth = infer_labels[i]if i % 10 == 0:print("No.%d: infer result is %.2f,ground truth is %.2f" % (i, infer_result, ground_truth))cost = paddle.pow(infer_result - ground_truth, 2)sum_cost += cost
mean_loss = sum_cost / INFER_BATCH_SIZE
print("Mean loss is:", mean_loss.numpy())

使用更高级的API

import paddle
paddle.set_default_dtype("float64")#step1:用高层API定义数据集,无需进行数据处理等,高层API为您一条龙搞定
train_dataset = paddle.text.datasets.UCIHousing(mode='train')
eval_dataset = paddle.text.datasets.UCIHousing(mode='test')#step2:定义模型
class UCIHousing(paddle.nn.Layer):def __init__(self):super(UCIHousing, self).__init__()self.fc = paddle.nn.Linear(13, 1, None)def forward(self, input):pred = self.fc(input)return pred#step3:训练模型
model = paddle.Model(UCIHousing())
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),paddle.nn.MSELoss())
model.fit(train_dataset, eval_dataset, epochs=5, batch_size=8, verbose=1)

博文参考

深度学习项目实战——手写数字识别项目相关推荐

  1. 深度学习数字仪表盘识别_【深度学习系列】手写数字识别实战

    上周在搜索关于深度学习分布式运行方式的资料时,无意间搜到了paddlepaddle,发现这个框架的分布式训练方案做的还挺不错的,想跟大家分享一下.不过呢,这块内容太复杂了,所以就简单的介绍一下padd ...

  2. 深度学习入门实践学习——手写数字识别(百度飞桨平台)——上篇

    一.项目平台 百度飞桨 二.项目框架 1.数据处理: 2.模型设计:网络结构,损失函数: 3.训练配置:优化器,资源配置: 4.训练过程: 5.保存加载. 三.手写数字识别任务 1.构建神经网络流程: ...

  3. 【第一个深度学习模型应用-手写数字识别】

    基于BP神经网络的手写数字识别报告 基于BP神经网络的手写数字识别报告 一.任务描述 二.数据集来源 三.方法 3.1 数据集处理方法 3.2.模型结构设计 3.3.模型算法 四.实验 4.1.实验环 ...

  4. [深度学习-1]神经网络-手写数字识别

    Date:2018年9月29记 数据及彭亮给出的数据集和源码在下面网址: https://github.com/mnielsen/neural-networks-and-deep-learning 在 ...

  5. pytorch 预测手写体数字_深度学习之PyTorch实战(3)——实战手写数字识别

    如果需要小编其他论文翻译,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote 上一节,我们已经 ...

  6. 前馈神经网络与支持向量机实战 --- 手写数字识别

    前馈神经网络与支持向量机实战 - 手写数字识别 文章目录 前馈神经网络与支持向量机实战 --- 手写数字识别 一.前馈神经网络介绍 二.支持向量机介绍 三.数据集说明 四.环境准备 五.实验要求 六. ...

  7. AI Studio 飞桨 零基础入门深度学习笔记6.3-手写数字识别之数据处理

    AI Studio 飞桨 零基础入门深度学习笔记6.3-手写数字识别之数据处理) 概述 前提条件 读入数据并划分数据集 扩展阅读:为什么学术界的模型总在不断精进呢? 训练样本乱序.生成批次数据 校验数 ...

  8. 卷积神经网络与循环神经网络实战 --- 手写数字识别及诗词创作

    卷积神经网络与循环神经网络实战 - 手写数字识别及诗词创作 文章目录 卷积神经网络与循环神经网络实战 --- 手写数字识别及诗词创作 一.神经网络相关知识 1. 深度学习 2. 人工神经网络回顾 3. ...

  9. 基于CNN的MINIST手写数字识别项目代码以及原理详解

    文章目录 项目简介 项目下载地址 项目开发软件环境 项目开发硬件环境 前言 一.数据加载的作用 二.Pytorch进行数据加载所需工具 2.1 Dataset 2.2 Dataloader 2.3 T ...

最新文章

  1. Gmapping 乱七八糟
  2. Php单链表冒泡排序算法,冒泡排序(链表实现)
  3. php sql漏洞修复,php sql注入漏洞与修复
  4. 请编写一个程序,请将字符串中所有字母全部向后移一位,最后一个字母放在字符串的开头,最后将新的字符串输出。
  5. 原码和补码在计算机中的应用,原码,补码和反码在计算机中的作用
  6. 爱情六十三课,定个开放日
  7. 《数据库技术原理与应用教程第2版》——3.6计算机世界与物理模型
  8. python处理数据快吗_python (七、Numpy高效数据处理)
  9. MySQL并行复制的深入浅出
  10. SortedSet和TreeSet
  11. 如此逼真的高清图像居然是端到端网络生成的?GANs 自叹不如 | ICCV 2017
  12. 杭电HDUacm2037
  13. 【Luat-air105】8.1 camera拍照
  14. 基础知识 字节、KB、MB、GB 之间的换算关系
  15. 像外行一样思考,像专家一样实践——科研成功之道(修订版)
  16. 春季养肝注意三个行为,做对了一年少生病
  17. 翻出过去的一个多彩泡泡屏保特效(JS+CSS版)
  18. 【高老师UML软件建模基础】20级云班课习题答案合集
  19. 2017-2020(4周年)读书年度总结及书单
  20. 回归分析中的p值和R方哪个更重要?

热门文章

  1. 20210325BERNESE软件中LEO_POD模块说明
  2. vue3+elementplus倒计时效果按钮
  3. java将字符串放置到剪切板
  4. 联通没有4g显示无服务器,联通4G去哪了?解密“消失”的联通4G信号
  5. 杰奇php手机登陆自动跳转,杰奇cms通过js代码,实现微信访问自动登录
  6. TC-63式空气取样器改进了流量调节
  7. 响应式网页设计_响应式网页设计–如何使网站在手机和平​​板电脑上看起来不错
  8. 【电源设计】05反激式开关电源
  9. linux 隐藏进程,linux下如何隐藏进程(ps/top)
  10. 又被黑!百度到底做错了什么?