作业要求:
1.补全网络代码,并运行手写数字识别项目。以出现最后的图片和预测结果为准。(65分)
2.保留原本的multilayer_perceptron网络定义(自己补全完的),自己定义一个卷积网络并运行成功。以出现最后的图片和预测结果为准(45分)
首先导入必要的包
numpy---------->python第三方库,用于进行科学计算
PIL------------> Python Image Library,python第三方图像处理库
matplotlib----->python的绘图库 pyplot:matplotlib的绘图框架
os------------->提供了丰富的方法来处理文件和目录
#导入需要的包 import numpy as np from PIL import Image import matplotlib.pyplot as plt import os import paddle print("本教程基于Paddle的版本号为:"+paddle.__version__) 本教程基于Paddle的版本号为:2.0.0
Step1:准备数据。
(1)数据集介绍
MNIST数据集包含60000个训练集和10000测试数据集。分为图片和标签,图片是28*28的像素矩阵,标签为0~9共10个数字。
(2)transform函数是定义了一个归一化标准化的标准
(3)train_dataset和test_dataset
paddle.vision.datasets.MNIST()中的mode='train’和mode='test’分别用于获取mnist训练集和测试集transform=transform参数则为归一化标准
#导入数据集Compose的作用是将用于数据集预处理的接口以列表的方式进行组合。 #导入数据集Normalize的作用是图像归一化处理,支持两种方式: 1. 用统一的均值和标准差值对图像的每个通道进行归一化处理; 2. 对每个通道指定不同的均值和标准差值进行归一化处理。 from paddle.vision.transforms import Compose, Normalize transform = Compose([Normalize(mean=[127.5],std=[127.5],data_format='CHW')]) # 使用transform对数据集做归一化 print('下载并加载训练数据') train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform) test_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform) print('加载完成')
下载并加载训练数据
Cache file /home/aistudio/.cache/paddle/dataset/mnist/train-images-idx3-ubyte.gz not found, downloading https://dataset.bj.bcebos.com/mnist/train-images-idx3-ubyte.gz Begin to download Download finished Cache file /home/aistudio/.cache/paddle/dataset/mnist/train-labels-idx1-ubyte.gz not found, downloading https://dataset.bj.bcebos.com/mnist/train-labels-idx1-ubyte.gz Begin to download ........ Download finished Cache file /home/aistudio/.cache/paddle/dataset/mnist/t10k-images-idx3-ubyte.gz not found, downloading https://dataset.bj.bcebos.com/mnist/t10k-images-idx3-ubyte.gz Begin to download Download finished Cache file /home/aistudio/.cache/paddle/dataset/mnist/t10k-labels-idx1-ubyte.gz not found, downloading https://dataset.bj.bcebos.com/mnist/t10k-labels-idx1-ubyte.gz Begin to download .. Download finished
加载完成
#让我们一起看看数据集中的图片是什么样子的 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)) print(plt.imshow(train_data0, cmap=plt.cm.binary)) print('train_data0 的标签为: ' + str(train_label_0))
输出
AxesImage(18,18;111.6x108.72) train_data0 的标签为: [5] /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2349: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working if isinstance(obj, collections.Iterator): /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2366: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working return list(data) if isinstance(data, collections.MappingView) else data /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/numpy/lib/type_check.py:546: DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead 'a.item() instead', DeprecationWarning, stacklevel=1)
#让我们再来看看数据样子是什么样的吧 print(train_data0) 这个自己运行吧...太占篇幅了。
Step2.网络配置
以下的代码判断就是定义一个简单的多层感知器,一共有三层,两个大小为100的隐层和一个大小为10的输出层,因为MNIST数据集是手写0到9的灰度图像,类别有10个,所以最后的输出大小是10。最后输出层的激活函数是Softmax,所以最后的输出层相当于一个分类器。加上一个输入层的话,多层感知器的结构是:输入层–>>隐层–>>隐层–>>输出层。
请补全网络代码
import paddle # 定义多层感知器 #动态图定义多层感知器 class multilayer_perceptron(paddle.nn.Layer): def __init__(self): super(multilayer_perceptron,self).__init__() #请在这里补全网络代码 self.flatten = paddle.nn.Flatten() self.linear_1 = paddle.nn.Linear(784, 512) self.linear_2 = paddle.nn.Linear(512, 10) self.relu = paddle.nn.ReLU() self.dropout = paddle.nn.Dropout(0.2) def forward(self, x): #请在这里补全传播过程的代码 y = self.flatten(x) y = self.linear_1(y) y = self.relu(y) y = self.dropout(y) y = self.linear_2(y) return y #请在这里定义卷积网络的代码 #注意:定义完成卷积的代码后,后面的代码是需要修改的! net_cls = multilayer_perceptron() from paddle.metric import Accuracy # 用Model封装模型 model = paddle.Model(net_cls) # 定义损失函数 optim = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters()) # 配置模型 model.prepare(optim,paddle.nn.CrossEntropyLoss(),Accuracy()) # 训练保存并验证模型 model.fit(train_dataset,test_dataset,epochs=2,batch_size=64,save_dir='multilayer_perceptron',verbose=1)
输出
The loss value printed in the log is the current step, and the metric is the average value of previous step. Epoch 1/2 step 30/938 [..............................] - loss: 0.6084 - acc: 0.6359 - ETA: 12s - 14ms/st /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/layers/utils.py:77: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working return (isinstance(seq, collections.Sequence) and step 938/938 [==============================] - loss: 0.3204 - acc: 0.9053 - 13ms/step save checkpoint at /home/aistudio/multilayer_perceptron/0 Eval begin... The loss value printed in the log is the current batch, and the metric is the average value of previous step. step 157/157 [==============================] - loss: 0.0274 - acc: 0.9516 - 8ms/step Eval samples: 10000 Epoch 2/2 step 938/938 [==============================] - loss: 0.0913 - acc: 0.9509 - 21ms/step save checkpoint at /home/aistudio/multilayer_perceptron/1 Eval begin... The loss value printed in the log is the current batch, and the metric is the average value of previous step. step 157/157 [==============================] - loss: 0.0227 - acc: 0.9649 - 8ms/step Eval samples: 10000 save checkpoint at /home/aistudio/multilayer_perceptron/final
模型训练
# 训练保存并验证模型 model.fit(train_dataset,test_dataset,epochs=2,batch_size=64,save_dir='multilayer_per
输出
The loss value printed in the log is the current step, and the metric is the average value of previous step. Epoch 1/2 step 938/938 [==============================] - loss: 0.1578 - acc: 0.9595 - 21ms/step save checkpoint at /home/aistudio/multilayer_perceptron/0 Eval begin... The loss value printed in the log is the current batch, and the metric is the average value of previous step. step 157/157 [==============================] - loss: 0.0025 - acc: 0.9692 - 9ms/step Eval samples: 10000 Epoch 2/2 step 938/938 [==============================] - loss: 0.1663 - acc: 0.9647 - 21ms/step save checkpoint at /home/aistudio/multilayer_perceptron/1 Eval begin... The loss value printed in the log is the current batch, and the metric is the average value of previous step. step 157/157 [==============================] - loss: 0.0028 - acc: 0.9745 - 9ms/step Eval samples: 10000 save checkpoint at /home/aistudio/multilayer_perceptron/final
测试
#获取测试集的第一个图片 test_data0, test_label_0 = test_dataset[0][0],test_dataset[0][1] test_data0 = test_data0.reshape([28,28]) plt.figure(figsize=(2,2)) #展示测试集中的第一个图片 print(plt.imshow(test_data0, cmap=plt.cm.binary)) print('test_data0 的标签为: ' + str(test_label_0)) #模型预测 result = model.predict(test_dataset, batch_size=1) #打印模型预测的结果 print('test_data0 预测的数值为:%d' % np.argsort(result[0][0])[0][-1])
输出
AxesImage(18,18;111.6x108.72) test_data0 的标签为: [7] Predict begin... step 10000/10000 [==============================] - 2ms/step Predict samples: 10000 test_data0 预测的数值为:7 /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/numpy/lib/type_check.py:546: DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead 'a.item() instead', DeprecationWarning, stacklevel=1)