【Paddle 入门打卡】用Paddle做MINIST手写数据集识别


本文基于百度飞浆Paddle平台

项目地址
什么是深度学习?


1. 数据描述


MNIST数据集(Mixed National Institute of Standards and Technology database)是美国国家标准与技术研究院收集整理的大型手写数字数据库,包含60,000个示例的训练集以及10,000个示例的测试集.

MINIST数据集中

  • 有60 000张图片对应上面所说的60 000个训练集
  • 均为手写识别的二进制图像
  • 每张图片有28 * 28 = 784个像素点
  • 有10 000个测试集
  • 均为外国人手写数据的习惯,对于我们手写识别的效果不太好

2. Paddle 训练Minist手写数据集

2.2 准备数据

import paddle
import warnings
from paddle.vision.transforms import Normalize
warnings.filterwarnings("ignore")

transform = Normalize(mean=[127.5], 
                        std=[127.5],
                        data_format= 'CHW')

# 使用Transform对数据进行归一化
print('downding data and loading training data')
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
test_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)
print('load finished')
downding data and loading training data
load finished
# 观察数据集
import numpy as np 
import matplotlib.pyplot as plt 

train_data0, train_label_0 = train_dataset[0][0], train_dataset[0][1]
train_data0 = train_data0.reshape([28, 28])
plt.figure(figsize=(2,2))
plt.imshow(train_data0, cmap=plt.cm.binary)
plt.show()
print('train_data0 label is:' + str(train_label_0))

2

train_data0 label is:[5]

2.2 配置网络


# 定义多层感知机
class MultilayerPerceptron(paddle.nn.Layer):
    def __init__(self, in_features):
        super(MultilayerPerceptron, self).__init__()
        # 形状变换, 将数据形状从 [] 变为 []
        self.flatten = paddle.nn.Flatten()

        ## 在这里统一定义好后,下面的层用,可以不分先后
        # 第一个全连接层
        # Linear(输入维度, 输出维度)
        self.linear1 = paddle.nn.Linear(in_features=in_features, out_features=100)
        # 使用ReLU进行激活
        self.act1 = paddle.nn.ReLU()
        # 第二个全连接层
        self.linear2 = paddle.nn.Linear(in_features = 100, out_features=100)
        # 使用ReLU函数进行激活
        self.act2 = paddle.nn.ReLU()
        # 第三个全连接层
        # 输出10个张量,作为10个分类
        self.linear3 = paddle.nn.Linear(in_features=100, out_features=10)

    def forward(self, x):
        # x = x.reshape((-1, 1, 28, 28))

        # 将x变成1维向量
        x = self.flatten(x)
        x = self.linear1(x)
        x = self.act1(x)
        x = self.linear2(x)
        x = self.act2(x)
        x = self.linear3(x)

        return x

# 使用 paddle.Model 封装 MultilayerPerception
# 并将model实例化
## 输入向量长度 28 * 28 = 784
model = paddle.Model(MultilayerPerceptron(in_features=784))

# 观察模型结构
model.summary((-1, 1, 28, 28))
W1117 20:08:00.136196  2166 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W1117 20:08:00.142117  2166 device_context.cc:465] device: 0, cuDNN Version: 7.6.


---------------------------------------------------------------------------
 Layer (type)       Input Shape          Output Shape         Param #    
===========================================================================
   Flatten-1      [[1, 1, 28, 28]]         [1, 784]              0       
   Linear-1          [[1, 784]]            [1, 100]           78,500     
    ReLU-1           [[1, 100]]            [1, 100]              0       
   Linear-2          [[1, 100]]            [1, 100]           10,100     
    ReLU-2           [[1, 100]]            [1, 100]              0       
   Linear-3          [[1, 100]]            [1, 10]             1,010     
===========================================================================
Total params: 89,610
Trainable params: 89,610
Non-trainable params: 0
---------------------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.01
Params size (MB): 0.34
Estimated Total Size (MB): 0.35
---------------------------------------------------------------------------






{'total_params': 89610, 'trainable_params': 89610}

# 配置模型
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()), # 使用Adam算法进行优化
                paddle.nn.CrossEntropyLoss(), # 使用交叉熵计算损失
                paddle.metric.Accuracy()) # 使用Accuracy 计算精度 

2.3 训练模型

# 开始模型训练
model.fit(train_dataset,    # 设置训练数据集
            epochs=5,       # 设置训练轮数
            batch_size=4,   # 设置batch_size
            verbose=1)      # 设置日志打开格式
The loss value printed in the log is the current step, and the metric is the average value of previous steps.
Epoch 1/5
step 15000/15000 [==============================] - loss: 0.0129 - acc: 0.9006 - 4ms/step          
Epoch 2/5
step 15000/15000 [==============================] - loss: 0.0027 - acc: 0.9408 - 4ms/step              
Epoch 3/5
step 15000/15000 [==============================] - loss: 1.3812e-04 - acc: 0.9501 - 4ms/step        
Epoch 4/5
step 15000/15000 [==============================] - loss: 6.4619e-04 - acc: 0.9555 - 4ms/step          
Epoch 5/5
step 15000/15000 [==============================] - loss: 0.0024 - acc: 0.9594 - 4ms/step             

2.4 模型评估

model.evaluate(test_dataset, verbose = 1)
Eval begin...
step 10000/10000 [==============================] - loss: 0.0000e+00 - acc: 0.9553 - 2ms/step          
Eval samples: 10000





{'loss': [0.0], 'acc': 0.9553}

2.5 模型预测

results = model.predict(test_dataset)
Predict begin...
step 10000/10000 [==============================] - 2ms/step          
Predict samples: 10000
# 获取概率最大的label
lab = np.argsort(results)                               #argsort函数返回的是result数组值从小到大的索引值

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

  [[9 4 7 ... 8 1 2]]

  [[0 5 6 ... 7 4 1]]

  ...

  [[0 3 8 ... 7 9 4]]

  [[0 1 9 ... 8 3 5]]

  [[7 9 1 ... 2 0 6]]]]
该图片的预测结果的label为: 6

写在最后

各位看官,都看到这里了,麻烦动动手指头给博主来个点赞8,您的支持作者最大的创作动力哟!
<(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用PaddlePaddle框架构建卷积神经网络进行手写数字识别是一个简单而有效的方法。在构建模型之前,首先需要导入所需的工具包和数据集。 使用PaddlePaddle,可以方便地导入MNIST数据集,该数据集包含手写数字的图像和相应的标签。可以使用`paddle.vision.datasets.MNIST`函数加载训练和测试数据集。加载完成后,还可以对数据进行预处理,例如归一化和转换为合适的格式。 在构建卷积神经网络模型之前,需要定义模型的结构。可以使用`paddle.nn.Sequential`来快速构建一个连续的神经网络模型。可以添加一些卷积层、池化层、全连接层和激活函数等。对于手写数字识别任务,可以选择一些经典的网络结构,例如LeNet和AlexNet,或者自定义一些更复杂的架构。 当模型结构定义好后,可以通过`paddle.Model`来封装模型,并进行模型的配置和训练。可以设置损失函数、优化器和评估指标等。对于手写数字识别任务,可以选择交叉熵损失函数和梯度下降优化器。还可以定义一些评估指标,例如准确率。 进行模型训练前,需要设置一些超参数,如学习率、批大小和训练轮数等。可以选择合适的超参数进行训练,并使用训练数据进行模型参数的更新。训练过程中,可以使用交叉验证方法对模型进行调优,以提高模型的性能。 训练完成后,可以使用测试数据对模型进行评估。通过计算模型在测试数据上的准确率等指标,可以评估模型的性能。如果模型性能不满足要求,可以通过调整模型结构、超参数和训练方法等来改进模型。 总的来说,使用PaddlePaddle框架构建卷积神经网络进行手写数字识别是一种简单且可行的方法。通过合适的数据预处理、模型构建、训练和评估等步骤,可以得到高性能的手写数字识别模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值