当前位置:   article > 正文

数据挖掘——手写体数字识别_手写数字识别数据集

手写数字识别数据集

首先导入必要的包:

numpy---------->python第三方库,用于进行科学计算

PIL------------> Python Image Library,python第三方图像处理库

matplotlib----->python的绘图库 pyplot:matplotlib的绘图框架

os------------->提供了丰富的方法来处理文件和目录

  1. #导入需要的包
  2. import numpy as np
  3. import paddle as paddle
  4. import paddle.fluid as fluid
  5. from PIL import Image
  6. import matplotlib.pyplot as plt
  7. import os
  8. from paddle.fluid.dygraph import Linear

Step1:准备数据

(1)数据集介绍

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

(2)train_reader和test_reader

paddle.dataset.mnist.train()和test()分别用于获取mnist训练集和测试集

paddle.batch()表示每BATCH_SIZE组成一个batch

paddle.reader.shuffle()表示每次缓存BUF_SIZE个数据项,并在读取一个数据项前进行随机排序。

(3)打印看下数据是什么样的?PaddlePaddle接口提供的数据已经经过了归一化、居中等处理。

  1. !mkdir -p /home/aistudio/.cache/paddle/dataset/mnist/
  2. !cp -r /home/aistudio/data/data65/* /home/aistudio/.cache/paddle/dataset/mnist/
  3. !ls /home/aistudio/.cache/paddle/dataset/mnist/
  1. BUF_SIZE=512
  2. BATCH_SIZE=128 #每次流中可以获取的数据量
  3. #用于训练的数据提供器,每次从缓存的数据项中随机读取批次大小的数据
  4. train_reader = paddle.batch(
  5. paddle.reader.shuffle(paddle.dataset.mnist.train(),
  6. buf_size=BUF_SIZE),
  7. batch_size=BATCH_SIZE)
  8. #用于训练的数据提供器,每次从缓存的数据项中随机读取批次大小的数据
  9. test_reader = paddle.batch(
  10. paddle.reader.shuffle(paddle.dataset.mnist.test(),
  11. buf_size=BUF_SIZE),
  12. batch_size=BATCH_SIZE)
  1. #用于打印,查看mnist数据
  2. train_data=paddle.dataset.mnist.train();
  3. sampledata=next(train_data())
  4. print(sampledata)

Step2.网络配置

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

  1. # 定义多层感知器
  2. #动态图定义多层感知器
  3. # TO DO:修改网络结构,提升性能
  4. class multilayer_perceptron(fluid.dygraph.Layer):
  5. def __init__(self):
  6. super(multilayer_perceptron,self).__init__() #从父类继承属性
  7. #输入为28*28的图像,输出该图像的100个特征点,使用relu函数作为激活函数
  8. #fc1,fc2相当于一个过滤器
  9. self.fc1 = Linear(input_dim=28*28, output_dim=100, act='relu')
  10. self.fc2 = Linear(input_dim=100, output_dim=100, act='relu')
  11. #最后一层过滤得到的是10*1的概率矩阵,值的大小即为概率的大小,概率最大的值所在下标即是答案
  12. self.fc3 = Linear(input_dim=100, output_dim=10,act="softmax")
  13. def forward(self,input_):
  14. x = fluid.layers.reshape(input_, [input_.shape[0], -1])
  15. x = self.fc1(x)
  16. x = self.fc2(x)
  17. y = self.fc3(x)
  18. return y

展示模型训练曲线。 

  1. all_train_iter=0
  2. all_train_iters=[]
  3. all_train_costs=[]
  4. all_train_accs=[]
  5. #绘制训练过程
  6. def draw_train_process(title,iters,costs,accs,label_cost,lable_acc):
  7. plt.title(title, fontsize=24)
  8. plt.xlabel("iter", fontsize=20)
  9. plt.ylabel("cost/acc", fontsize=20)
  10. plt.plot(iters, costs,color='red',label=label_cost)
  11. plt.plot(iters, accs,color='green',label=lable_acc)
  12. plt.legend()
  13. plt.grid()
  14. plt.show()
  15. def draw_process(title,color,iters,data,label):
  16. plt.title(title, fontsize=24)
  17. plt.xlabel("iter", fontsize=20)
  18. plt.ylabel(label, fontsize=20)
  19. plt.plot(iters, data,color=color,label=label)
  20. plt.legend()
  21. plt.grid()
  22. plt.show()

Step3.模型训练并评估

训练需要有一个训练程序和一些必要参数,并构建了一个获取训练过程中测试误差的函数。必要参数有executor,program,reader,feeder,fetch_list。

  1. #用动态图进行训练
  2. all_train_iter=0
  3. all_train_iters=[]
  4. all_train_costs=[]
  5. all_train_accs=[]
  6. best_test_acc = 0.0
  7. with fluid.dygraph.guard():
  8. model=multilayer_perceptron() #模型实例化
  9. model.train() #训练模式
  10. opt=fluid.optimizer.Adam(learning_rate=fluid.dygraph.ExponentialDecay(
  11. learning_rate=0.001 , decay_steps=4000,
  12. decay_rate=0.1,
  13. staircase=True), parameter_list=model.parameters())
  14. epochs_num=20 #迭代次数
  15. #一般来的,跌打次数越多,精度越高
  16. for pass_num in range(epochs_num):
  17. lr = opt.current_step_lr()
  18. print("learning-rate:", lr)
  19. for batch_id,data in enumerate(train_reader()):
  20. images=np.array([x[0].reshape(1,28,28) for x in data],np.float32)
  21. labels = np.array([x[1] for x in data]).astype('int64')
  22. labels = labels[:, np.newaxis]
  23. image=fluid.dygraph.to_variable(images)
  24. label=fluid.dygraph.to_variable(labels)
  25. predict=model(image)#预测
  26. #print(predict)
  27. loss=fluid.layers.cross_entropy(predict,label)
  28. avg_loss=fluid.layers.mean(loss)#获取loss值
  29. acc=fluid.layers.accuracy(predict,label)#计算精度
  30. avg_loss.backward()
  31. opt.minimize(avg_loss)
  32. model.clear_gradients()
  33. all_train_iter=all_train_iter+256
  34. all_train_iters.append(all_train_iter)
  35. all_train_costs.append(loss.numpy()[0])
  36. all_train_accs.append(acc.numpy()[0])
  37. if batch_id!=0 and batch_id%50==0:
  38. print("train_pass:{},batch_id:{},train_loss:{},train_acc:{}".format(pass_num,batch_id,avg_loss.numpy(),acc.numpy()))
  39. with fluid.dygraph.guard():
  40. accs = []
  41. model.eval()#评估模式
  42. for batch_id,data in enumerate(test_reader()):#测试集
  43. images=np.array([x[0].reshape(1,28,28) for x in data],np.float32)
  44. labels = np.array([x[1] for x in data]).astype('int64')
  45. labels = labels[:, np.newaxis]
  46. image=fluid.dygraph.to_variable(images)
  47. label=fluid.dygraph.to_variable(labels)
  48. predict=model(image)#预测
  49. acc=fluid.layers.accuracy(predict,label)
  50. accs.append(acc.numpy()[0])
  51. avg_acc = np.mean(accs)
  52. if avg_acc >= best_test_acc:
  53. best_test_acc = avg_acc
  54. if pass_num > 10:
  55. fluid.save_dygraph(model.state_dict(),'./work/{}'.format(pass_num))#保存模型
  56. print('Test:%d, Accuracy:%0.5f, Best: %0.5f'% (pass_num, avg_acc, best_test_acc))
  57. fluid.save_dygraph(model.state_dict(),'./work/fashion_mnist_epoch{}'.format(epochs_num))#保存模型
  58. print('训练模型保存完成!')
  59. print("best_test_acc", best_test_acc)
  60. draw_train_process("training",all_train_iters,all_train_costs,all_train_accs,"trainning cost","trainning acc")
  61. draw_process("trainning loss","red",all_train_iters,all_train_costs,"trainning loss")
  62. draw_process("trainning acc","green",all_train_iters,all_train_accs,"trainning acc")

Step4.模型预测

(1)图片预处理

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

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

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

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

  1. infer_path='/home/aistudio/data/data2304/infer-9.png'
  2. img = Image.open(infer_path)
  3. plt.imshow(img) #根据数组绘制图像
  4. plt.show() #显示图像
  5. label_list = [
  6. "0", "1", "2", "3", "4", "5", "6", "7","8", "9","10"
  7. ]
  8. #构建预测动态图过程
  9. model_path = './work/11'
  10. with fluid.dygraph.guard():
  11. model=multilayer_perceptron()#模型实例化
  12. model_dict,_=fluid.load_dygraph(model_path)
  13. model.load_dict(model_dict)#加载模型参数
  14. model.eval()#评估模式
  15. infer_img = load_image(infer_path)
  16. infer_img=np.array(infer_img).astype('float32')
  17. infer_img=infer_img[np.newaxis,:, : ,:]
  18. infer_img = fluid.dygraph.to_variable(infer_img)
  19. result=model(infer_img)
  20. print("infer results: %s" % label_list[np.argmax(result.numpy())])

(3)运行部分截图如下:

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号