前言

LeNet是最早的卷积神经网络之一。1998年,Yann LeCun第一次将LeNet卷积神经网络应用到图像分类上,它通过连续使用卷积和池化层的组合提取图像特征,在手写数字识别任务中取得了巨大成功。

LeNet模型网络结构示意图

模型设计

1、新建文件leNet.py,根据leNet的结构示意图写出对应的代码:

import paddle
from paddle.nn import Conv2D,MaxPool2D,Linearimport  paddle.nn.functional as Fclass LeNet(paddle.nn.Layer):def __init__(self, num_classes = 1):super(LeNet, self).__init__()self.conv1 = Conv2D(in_channels=1,out_channels=6,kernel_size=5)self.max_pool1 = MaxPool2D(kernel_size=2,stride=2)self.conv2 = Conv2D(in_channels=6,out_channels=16,kernel_size=5)self.max_pool2 = MaxPool2D(kernel_size=2,stride=2)self.conv3 = Conv2D(in_channels=16,out_channels=120,kernel_size=4)self.fc1 = Linear(in_features=120, out_features=64)self.fc2 = Linear(in_features=64,out_features=num_classes)def forward(self, x):x = self.conv1(x)x = F.sigmoid(x)x = self.max_pool1(x)x = F.sigmoid(x)x = self.conv2(x)x = self.max_pool2(x)x = self.conv3(x)x = paddle.reshape(x , [x.shape[0], -1])x = self.fc1(x)x = F.sigmoid(x)x = self.fc2(x)return x

模型训练

1、新建文件:LeNetTrain.py

import numpy as np
import paddle
import paddle.nn.functional as F
from paddle.vision.transforms import ToTensor
from paddle.vision.datasets import MNIST
from leNet import LeNetdef train(model, opt, train_loader, valid_loader):model.train()for epoch in range(EPOCH_NUM):for batch_id,data in enumerate(train_loader()):img = data[0]label = data[1]logits = model(img)loss_func = paddle.nn.CrossEntropyLoss(reduction='none')loss = loss_func(logits,label)avg_loss = paddle.mean(loss)if batch_id % 2000 == 0:print("epoch:{},batch_id:{},loss is:{:.4f}".format(epoch,batch_id,float(avg_loss.numpy())))avg_loss.backward()opt.step()opt.clear_grad()model.eval()accuracies = []losses = []for batch_id, data in enumerate(valid_loader()):img = data[0]label = data[1]# 计算模型输出logits = model(img)pred = F.softmax(logits)# 计算损失函数loss_func = paddle.nn.CrossEntropyLoss(reduction='none')loss = loss_func(logits, label)acc = paddle.metric.accuracy(pred, label)accuracies.append(acc.numpy())losses.append(loss.numpy())print("[validation] accuracy/loss: {:.4f}/{:.4f}".format(np.mean(accuracies), np.mean(losses)))model.train()# 保存模型参数paddle.save(model.state_dict(), 'leNet.mnist.pdparams')# 创建模型
model = LeNet(num_classes=10)
# 设置迭代轮数
EPOCH_NUM = 5
# 设置优化器为Momentum,学习率为0.001
opt = paddle.optimizer.Momentum(learning_rate=0.001, momentum=0.9, parameters=model.parameters())
# 定义数据读取器
train_loader = paddle.io.DataLoader(MNIST(mode='train', transform=ToTensor()), batch_size=10, shuffle=True)
valid_loader = paddle.io.DataLoader(MNIST(mode='test', transform=ToTensor()), batch_size=10)
# 启动训练过程
train(model, opt, train_loader, valid_loader)

模型验证

1、新建文件LeNetEval.py:

from leNet import LeNet
import numpy as np
import paddle
from paddle.vision.transforms import ToTensor
from paddle.vision.datasets import MNIST# 创建模型
model = LeNet(num_classes=10)
params_file_path = 'leNet.mnist.pdparams'
param_dict = paddle.load(params_file_path)
# 加载模型参数
model.load_dict(param_dict)
# 定义预测过程
model.eval()# 加载测试集 batch_size 设为 1
valid_loader = paddle.io.DataLoader(MNIST(mode='test', transform=ToTensor()), batch_size=1)
success = 0
error = 0
for batch_id, data in enumerate(valid_loader()):img = data[0]label = data[1]#预测logits = model(img)#转换为整数label = label.numpy().astype('int32')[0]#取最大的那个预测概率的下标result = np.argsort(logits[0])[-1]if (label == result) :success = success + 1else:error = error + 1
#打印结果
print("本次预测的正确的数量是{}, 错误的数量是{}".format(success, error))

2、结果输出:

本次预测的正确的数量是9553, 错误的数量是447

总结:

1、本次进行了5次迭代,预测的准确率就非常高了,超过了95%

2、先画出模型图,然后再编写对应的代码,非常的高效

菜菜学paddle第六篇:利用LeNet卷积神经网络识别手写数字相关推荐

  1. 使用TensorFlow的卷积神经网络识别手写数字(3)-识别篇

    1 from PIL import Image 2 import numpy as np 3 import tensorflow as tf 4 import time 5 6 7 bShowAccu ...

  2. python手机代码识别数字_利用python构建神经网络识别手写数字(附源代码)

    一.运行环境配置 本次实验的运行环境win10(bit64),采用python环境为3.7.6,安装Python环境推荐使用Anaconda.Anaconda是一个免费开源的Python和R语言的发行 ...

  3. 利用python实现简单的人工神经网络识别手写数字

    利用 Python 搭建起了一个简单的神经网络模型,并完成识别手写数字. 1.前置工作 1.1 环境配置 这里使用scikit-learn库内建的手写数字字符集作为本文的数据集.scikit-lear ...

  4. OpenCV-Python实战(番外篇)——利用 SVM 算法识别手写数字

    OpenCV-Python实战(番外篇)--利用 SVM 算法识别手写数字 前言 使用 SVM 进行手写数字识别 参数 C 和 γ 对识别手写数字精确度的影响 完整代码 相关链接 前言 支持向量机 ( ...

  5. OpenCV-Python实战(番外篇)——利用 KNN 算法识别手写数字

    OpenCV-Python实战(番外篇)--利用 KNN 算法识别手写数字 前言 手写数字数据集 MNIST 介绍 基准模型--利用 KNN 算法识别手写数字 改进模型1--参数 K 对识别手写数字精 ...

  6. 02:一文全解:利用谷歌深度学习框架Tensorflow识别手写数字图片(初学者篇)

    标签(空格分隔): 王小草Tensorflow笔记 笔记整理者:王小草 笔记整理时间2017年2月24日 Tensorflow官方英文文档地址:https://www.tensorflow.org/g ...

  7. 使用Keras训练Lenet网络来进行手写数字识别

    使用Keras训练Lenet网络来进行手写数字识别 这篇博客将介绍如何使用Keras训练Lenet网络来进行手写数字识别. LeNet架构是深度学习中的一项开创性工作,演示了如何训练神经网络以端到端的 ...

  8. svm手写数字识别_KNN 算法实战篇如何识别手写数字

    上篇文章介绍了KNN 算法的原理,今天来介绍如何使用KNN 算法识别手写数字? 1,手写数字数据集 手写数字数据集是一个用于图像处理的数据集,这些数据描绘了 [0, 9] 的数字,我们可以用KNN 算 ...

  9. DL之DNN:利用DNN算法对mnist手写数字图片识别数据集(sklearn自带,1797*64)训练、预测(95%)

    DL之DNN:利用DNN算法对mnist手写数字图片识别数据集(sklearn自带,1797*64)训练.预测(95%) 目录 数据集展示 输出结果 设计代码 数据集展示 先查看sklearn自带di ...

最新文章

  1. redis 之 sds (二) char []
  2. Quartz.NET实际
  3. pycharm安装教程,超详细
  4. DispatcherServlet详解
  5. 常量与变量的区别(详细说明)(学习笔记3--变量与常量)
  6. 自学python需要安装什么-自学python用什么系统好
  7. freemarker如何判空容错
  8. 微信历史消息java_微信聊天机器人[过年防信息轰炸、自动回复拜年消息]
  9. MySQL的用户授权
  10. Linux局域网多人聊天软件
  11. 计算机为什么不能新建文档,电脑无法新建word文档怎么办
  12. 生活中的逻辑谬误06.德克萨斯神枪手
  13. 【速记】英语多个形容词(定语)搭配规则
  14. h61 nvme硬盘_免装系统!机械硬盘系统迁移至固态硬盘技巧
  15. 最新限量红包封面,限时领取!
  16. Javascript+webdriverio App自动化demo
  17. 利用python绘制简易词云图(使用jieba进行中文分词)
  18. 函数的值域【基础辅导和中阶辅导】
  19. 苹果(MacOS)桌面应用程序 签名及分发教程
  20. 模仿京东-商品详情页前端样式 CSS+html+js

热门文章

  1. 遥感处理平台的发展(ENVI与GEE的比较)
  2. 使用Travis-CI自动部署博客
  3. CSDN周刊:Facebook 发币 Libra;谷歌十亿美金为穷人造房;第四代树莓派 Raspberry Pi 4 发布
  4. Android之高仿QQ6.6.0侧滑效果(背景动画、透明+沉浸式状态栏、渐变效果)
  5. Luminati提供了哪些工具来帮助自动化操作?
  6. 一文助你搞懂单纯形法
  7. 泰国证券交易所预计将在本月批准5个ICO项目
  8. 有了这123个Python黑客工具,再也不用问女朋友要手机密码了
  9. java自定义数组_Java自定义数组
  10. DCOS到底是啥?看完这篇你就懂了~