PaddlePaddle 实现手写数字识别
在这次实验中我们将使用 PaddlePaddle 来实现三种不同的分类器,用于识别手写数字。三种分类器所基于的模型分别为 Softmax 回归、多层感知器、卷积神经网络。现在让我们进入实验来看看基于不同模型的分类器的差异吧!
您将学会
- 实现一个基于Softmax回归的分类器,用于识别手写数字
- 实现一个基于多层感知器的分类器,用于识别手写数字
- 实现一个基于卷积神经网络的分类器,用于识别手写数字
- 卷积神经网络的基本组成和搭建
现在让我们进入实验吧!
1 - 引用库
首先,载入几个需要用到的库,它们分别是:
- numpy:一个python的基本库,用于科学计算
- paddle.fluid:PaddlePaddle深度学习框架
- PIL:Python上的图像处理标准库
- os:在本例中用于获取文件或目录的路径
- Image:用于处理图像数据
- from paddle.utils.plot import Ploter :paddle集成了一个画图工具包,我们可以利用这个包把训练曲线画出来
from __future__ import print_function
import os
from PIL import Image
import matplotlib.pyplot as plt #plt 用于显示图片
import numpy
import paddle
import paddle.fluid as fluid
from paddle.utils.plot import Ploter
%matplotlib inline
问题描述:
当我们学习编程的时候,编写的第一个程序一般是实现打印"Hello World"。而机器学习(或深度学习)的入门教程,一般都是 MNIST 数据库上的手写数字识别问题。原因是手写数字识别属于典型的图像分类问题,比较简单,同时MNIST数据集也很完备。
你的目标:
构建三种不同的分类器来对手写数字进行识别
数据集分析:
MNIST 数据集作为一个简单的计算机视觉数据集,包含一系列如图1所示的手写数字图片和对应的标签。图片是 28x28 像素的矩阵,标签则对应着0~9的10个数字。每张图片都经过了大小归一化和居中处理。
MNIST数据集是从 NIST 的Special Database 3(SD-3)和Special Database 1(SD-1)构建而来。由于SD-3是由美国人口调查局的员工进行标注,SD-1是由美国高中生进行标注,因此SD-3比SD-1更干净也更容易识别。Yann LeCun等人从SD-1和SD-3中各取一半作为MNIST的训练集(60000条数据)和测试集(10000条数据),其中训练集来自250位不同的标注员,此外还保证了训练集和测试集的标注员是不完全相同的。
Yann LeCun早先在手写字符识别上做了很多研究,并在研究过程中提出了卷积神经网络(Convolutional Neural Network),大幅度地提高了手写字符的识别能力,也因此成为了深度学习领域的奠基人之一。如今的深度学习领域,卷积神经网络占据了至关重要的地位,从最早Yann LeCun提出的简单LeNet,到如今ImageNet大赛上的优胜模型VGGNet、GoogLeNet、ResNet等(请参见图像分类 教程),人们在图像分类领域,利用卷积神经网络得到了一系列惊人的结果。
有很多算法在 MNIST 上进行实验。1998年,LeCun 分别用单层线性分类器、多层感知器(Multilayer Perceptron, MLP)和多层卷积神经网络LeNet进行实验,使得测试集上的误差不断下降(从12%下降到0.7%)[1]。此后,科学家们又基于K近邻(K-Nearest Neighbors)算法[2]、支持向量机(SVM)[3]、神经网络[4-7]和Boosting方法[8]等做了大量实验,并采用多种预处理方法(如去除歪曲、去噪、模糊等)来提高识别的准确率。
本教程中,我们从简单的模型 Softmax 回归开始,带大家入门手写数字识别,并逐步进行模型优化。
输入值: