Shu's Garden - 交叉熵
type: channel
link: https://www.sitstars.com/tag/%E4%BA%A4%E5%8F%89%E7%86%B5/
items: PaddlePaddle飞桨课程学习Day3-5：手写数字识别与CNN

PaddlePaddle飞桨课程学习Day3-5：手写数字识别与CNN
type: item
date: 2020-08-16T15:05:10+08:00
description: 前言：手写数字识别如果说波士顿房价预测是机器学习中的hello world,，那么手写数字识别就是深度学习中的hello world。在处理如下图所示的手写邮政编码的简单图像分类任务时，可以使用基于MNIST数据集的手写数字识别模型。MNIST是深度学习领域标准、易用的成熟数据集，包含60000条训练样本和10000条测试样本。 任务输入：一系列手写数字图片，其中每张图片都是28x28的像素矩阵。任务输出：经过了大小归一化和居中处理，输出对应的0~9的数字标签。本次任务使用的网络模型为卷积神经网络（CNN），它被广泛应用于图像识别，自然语言等领域。该任务同样遵循五步走战略，即数据处理—模型设计—训练配置—训练过程—模型保存 极简版本的实现代码import paddle import paddle.fluid as fluid from paddle.fluid.dygraph.nn import Linear import numpy as np import os from PIL import Image class MNIST(fluid.dygraph.Layer): def __init__(self): super(MNIST,self).__init__() # 定义一层全连接层，输出维度1，激活函数None self.fc = Linear(input_dim = 784,output_dim=1) # 前向计算 def forward(self,inputs): outputs = self.fc(inputs) return outputs # 创建动态图工作环境 with fluid.dygraph.guard(): # 声明网络结构 model = MNIST() # 启动训练模式 model.train() # 定义读取函数 train_loader = paddle.batch(paddle.dataset.mnist.train(),batch_size=16) # 定义优化器，使用SGD，学习率设置为0.001 optimizer = fluid.optimizer.SGDOptimizer(learning_rate=0.001,parameter_list=model.parameters()) epoch_num = 10 # 10次大循环 for epoch in range(epoch_num): for batch_id,data in enumerate(train_loader()): # 数据格式转换 img_data = np.array([x[0] for x in data]).astype("float32") label_data = np.array([x[1] for x in data]).astype("float32").reshape(-1,1) # 为了loss计算，最后一维要是1。-1是占位符，这个位置是为了batch_size预留的 # 将数据转为飞桨动态图格式 img = fluid.dygraph.to_variable(img_data) label = fluid.dygraph.to_variable(label_data) # 前向计算 predict = model.forward(img) # 计算损失 loss = fluid.layers.square_error_cost(predict,label) avg_loss = fluid.layers.mean(loss) # 每训练1000次数据就打印一次 if batch_id != 0 and batch_id % 1000 == 0: print("epoch is {},batch is {}, loss is {}".format(epoch,batch_id,avg_loss.numpy())) # 后向传播 avg_loss.backward() # 更新参数 optimizer.minimize(avg_loss) # 最小化损失 model.clear_gradients() # 清除梯度 # 保存模型 fluid.save_dygraph(model.state_dict(), 'mnist')说明：飞桨提供了多个封装好的数据集API，涵盖计算机视觉、自然语言处理、推荐系统等多个领域，帮助读者快速完成深度学习任务。如在手写数字识别任务中，通过paddle.dataset.mnist可以直接获取处理好的MNIST训练集、测试集。飞桨将维度是28*28的手写数字图像转成向量形式存储，因此使用飞桨数据加载器读取到的手写数字图像是长度为784（28*28）的向量。pa…