使用paddlepaddle进行手写数字识别

Posted 修炼之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用paddlepaddle进行手写数字识别相关的知识,希望对你有一定的参考价值。

导读

MNIST手写数字数据集作为深度学习入门的数据集是我们经常都会使用到的,包含了0~9共10个数字类别的图片,每张图片的大小为28X28,一共包含了60000张训练集图片和10000张测试集图片。

使用PaddlePadlle进行手写数字识别

  • 导包
import paddle
from paddle.vision.transforms import Normalize
  • 加载MNIST数据集
#数据的归一化处理
transform = Normalize(mean=[127.5],std=[127.5],data_format="CHW")

#加载MNIST的训练数据集
train_mnist_dataset = paddle.vision.datasets.MNIST(mode="train",transform=transform)
#加载MNIST的测试数据集
test_mnist_dataset = paddle.vision.datasets.MNIST(mode="test",transform=transform)
  • 展示手写数字的图片
import numpy as np
import matplotlib.pyplot as plt

#获取MNIST数据的图片和对应的标签
mnist_image,mnist_label = train_mnist_dataset[0][0],train_mnist_dataset[0][1]
#调整MNIST图片的大小
mnist_image = mnist_image.reshape((28,28))
plt.figure(figsize=(2,2))
plt.imshow(mnist_image,cmap=plt.cm.binary)

  • 使用paddlepaddle定义神经网络模型

这里我们先使用一个比较简单的3层感知机来构建一个模型,第一层全连接层的输出是256,第二层全连接层的输出是128,第三层全连接层的输出是10,正好对应10个不同的数字类别

class PerceptronMNIST(paddle.nn.Layer):
    def __init__(self,in_features,classes_num):
        super(PerceptronMNIST,self).__init__()
        #将输出数据的shape由(-1,1,28,28)变为(-1,784)
        self.flatten = paddle.nn.Flatten()
        #感知机的第一层全连接层
        self.fc1 = paddle.nn.Linear(in_features=in_features,out_features=256)
        #激活函数
        self.relu1 = paddle.nn.ReLU()
        #感知机的第二层全连接层
        self.fc2 = paddle.nn.Linear(in_features=256,out_features=128)
        #激活函数
        self.relu2 = paddle.nn.ReLU()
        #感知机的第三层全连接层
        self.fc3 = paddle.nn.Linear(in_features=128,out_features=classes_num)
    
    def forward(self,x):

        x = self.flatten(x)
        x = self.fc1(x)
        x = self.relu1(x)
        x = self.fc2(x)
        x = self.relu2(x)
        x = self.fc3(x)

        return x
  • 打印网络模型的结构
    #使用PaddlePaddle封装模型
    model = paddle.Model(PerceptronMNIST(in_features=28*28,classes_num=10))
    #输出网络的结构
    model.summary((-1,1,28,28))

  • 定义优化算法和Loss
#配置模型
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),#使用Adam优化算法
              paddle.nn.CrossEntropyLoss(),#使用CrossEntropyLoss作为损失函数
              paddle.metric.Accuracy())#使用Accuracy计算精度
  • 训练模型
model.fit(train_mnist_dataset,#设置训练数据
          epochs=10,          #定义训练的epochs
          batch_size=128,     #设置batch_size
          verbose=1)          #设置日志的输出格式

  • 评估模型
model.evaluate(test_mnist_dataset,verbose=1)

  • 模型预测
results = model.predict(test_mnist_dataset)
#获取概率最大的label
pred_label = np.argsort(results)
print("图片的预测标签为:".format(pred_label[0][0][-1][0]))

以上是关于使用paddlepaddle进行手写数字识别的主要内容,如果未能解决你的问题,请参考以下文章

使用paddlepaddle进行手写数字识别

使用paddlepaddle进行手写数字识别

百度飞桨(PaddlePaddle)-数字识别

百度PaddlePaddle入门-9

深度学习系列PaddlePaddle之手写数字识别

PaddlePaddle系列手写数字识别