(一)Lenet5 手写数字识别原理及代码解析

article/2025/7/3 8:35:34

在这里插入图片描述
模型简单,本地可跑
论文参考:Gradient-based learning applied to document recognition
MNIST手写数据集
50000个训练数据
10000个测试数据
图像大小28×28
10类(0-9)

一、python预安装库

pip install torch
pip install torchvision
pip install opencv-python
pip install matplotlib

二、model部分

view 与 reshape 的区别
view:只是修改了读取数据的方式,相当于一个正方体从不同角度去看
reshape:修改了数据在内存中的存储,相当于你直接移动了正方体的朝向
返回值一样,但对应的物理内存不同

import torch
from torch import nnclass Reshape(nn.Module):"""docstring for Reshape"""def forward(self, x):return x.view(-1, 1, 28, 28)  #第一维数据不变,后一维数据转化为(1,28,28)# -1 表示自适应,由张量中元素个数和其它维度自动计算并补全该维度class LeNet5(nn.Module):"""docstring for LeNet5"""def __init__(self):super(LeNet5, self).__init__()self.net = nn.Sequential(Reshape(),# CONV1, ReLU1, POOL1nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5, padding=2), #输入1通道(黑白图像),经过5✖5的卷积层,并上下左右用2个元素进行填充,输出通道数为6,得到 6✖28✖28 的输出nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2), #核大小为2✖2,步幅为2,得到 6✖14✖14 的输出# CONV2, ReLU2, POOL2nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5), # 得到 16✖10✖10 的输出nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2),  # 核大小为2✖2,步幅为2,得到 16✖5✖5 的输出nn.Flatten(),# FC1nn.Linear(in_features=400, out_features=120),nn.ReLU(),# FC2nn.Linear(in_features=120, out_features=84),nn.ReLU(),# FC3nn.Linear(in_features=84, out_features=10))def forward(self, x):logits = self.net(x)return logitsif __name__ == '__main__':model = LeNet5()X = torch.rand(size=(256, 1, 28, 28), dtype=torch.float32)for layer in model.net:X = layer(X)print(layer.__class__.__name__, '\toutput: \t', X.shape)	

三、训练部分

import torch
from torch import nn
from torchvision import datasets
from torchvision.transforms import ToTensor
from torch.utils.data import DataLoaderfrom model import LeNet5# DATASET
train_data = datasets.MNIST(root = './data',train = False,download=True,transform=ToTensor() # ToTensor() 将 shape 为 (H,W,C) 的 numpy.ndarray 转为 shape 为 (C, H, W) 的 tensor# 并做归一化处理(除以255到[0,1]))test_data = datasets.MNIST(root='./data',train=False,download=True,transform=ToTensor())# PREPROCESS
batch_size = 256
train_dataloader = DataLoader(dataset=train_data, batch_size=batch_size)
test_dataloader = DataLoader(dataset=test_data, batch_size=batch_size)print(len(train_dataloader)) # batch_size 设置为256,可打印输出40个epochfor X, y in train_dataloader:print(X.shape) # torch.Size([256, 1, 28, 28])print(y.shape) # torch.Size([256])break# MODEL
device = 'cuda' if torch.cuda.is_available() else 'cpu'  # 选择 device 否则默认 CPU
model = LeNet5().to(device)# TRAIN MODEL
loss_func = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(params=model.parameters())def train(dataloader, model, loss_func, optimizer, epoch):model.train()# 针对 BN(Batch Normalization) 层,保证BN层用每一批数据的均值和方差,针对每个mini-batch# 针对 Dropout 层,随机取一部分网络连接来训练更新参数data_size = len(dataloader.dataset)for batch, (X, y) in enumerate(dataloader):X, y = X.to(device), y.to(device)  #将所有数据复制一份到device上y_hat = model(X)loss = loss_func(y_hat, y)optimizer.zero_grad() # 清空过往梯度loss.backward()        # 反向传播,计算当前梯度optimizer.step()       # 根据梯度更新网络参数if batch == len(dataloader) -1:loss, current = loss.item(), batch * len(X)print(f'EPOCH{epoch+1}\tloss: {loss:>7f}', end='\t')# TEST MODEL
def test(dataloader, model, loss_fn):size = len(dataloader.dataset)num_batches = len(dataloader)model.eval()                    # 保证 BN 层用全部训练数据的均值和方差,即针对单张图片# 针对 Dropout 层,利用了所有网络连接test_loss, correct = 0, 0with torch.no_grad():           # 所有计算得出的 tensor 的 requires_grad 都自动设置为 false,反向传播便不会自动求导,节约内存for X, y in dataloader:X, y = X.to(device), y.to(device)pred = model(X)test_loss += loss_fn(pred, y).item()correct += (pred.argmax(1) == y).type(torch.float).sum().item()# argmax 取出每一行概率最大的数字的下标test_loss /= num_batchescorrect /= size print(f'Test Error: Accuracy: {(100*correct):>0.1f}%, Average loss: {test_loss:>8f}\n')if __name__ == '__main__':epoches = 40for epoch in range(epoches):train(train_dataloader, model, loss_func, optimizer, epoch)test(test_dataloader, model, loss_func)# save modelstorch.save(model.state_dict(), 'model.pth')print('Saved PyTorch LeNet5 State to model.pth')

四、测试部分

import torch
import cv2 as cv
from model import LeNet5
from matplotlib import pyplot as pltif __name__ == '__main__':# Loading modelsmodel = LeNet5()model.load_state_dict(torch.load('./model.pth'))device = 'cuda' if torch.cuda.is_available() else 'cpu'model.to(device)# READ IMAGEimg = cv.imread('./images/2.jpg')gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)gray = 255 - cv.resize(gray, (28, 28), interpolation=cv.INTER_LINEAR)X = torch.Tensor(gray.reshape(1, 28, 28).tolist())X = X.to(device)with torch.no_grad():pred = model(X)print(pred[0].argmax(0))print(pred)

输出结果为:

tensor(2)
tensor([[-1073.5400,  3579.4260,  6510.0640,   781.4053, -7424.6592, -2042.7059,-3917.9944,  -953.5059,   722.2081, -2653.5115]])

五、补充说明

LeNet 最早期的神经网络,先使用卷积层来学习图片空间信息,然后使用全连接层来转换到类别空间。

池化层可用可不用。

第二个卷积层通道数增加到了16,模式变多了,相当于把这些模式给分离开到更多的通道中。
(高宽减半,这时通道数一般翻倍)

为什么用 view 不用 reshape?
view对于数据构造不会发生任何变化,reshape可以做数据的copy。

MLP与CNN对比,MLP速度更快,都能用的话,可以先用MLP。

池化层 Max 和 Avg,max不会损失很多信息,只是数据更大一些,训练更好一些。

卷积可视化的一个网站,很有趣
cup, car and so on
在这里插入图片描述


http://chatgpt.dhexx.cn/article/QbabU4bR.shtml

相关文章

【LeNet5】简单车牌识别

文章目录 1. 项目准备1.1. 问题导入1.2. 数据集简介 2. LeNet5模型2.1. 卷积神经网络2.2. 模型介绍 3. 实验步骤3.0. 前期准备3.1. 数据准备3.2. 网络配置3.3. 模型训练3.4. 模型评估3.5. 模型预测 写在最后 1. 项目准备 1.1. 问题导入 本次实践是一个多分类任务,…

LeNet5—论文及源码阅读

LeNet5实现图像分类 🐬 目录: 一、概论二、论文选读三、源码精读 所用数据集介绍LeNet5模型网络构建LeNet5模型训练 测试代码 四、参考资料 一、概论 LeNet-5是一种经典的卷积神经网络结构,于1998年投入实际使用中。该网络最早应用于手写体字符识别应…

重学深度学习系列---LeNet5实现手写数字识别(TensorFlow2-mnist数据集)

重学深度学习系列—LeNet5实现手写数字识别(TensorFlow2-mnist数据集) 文章目录 重学深度学习系列---LeNet5实现手写数字识别(TensorFlow2-mnist数据集)我的环境:一、LeNet5简单介绍二、LeNet-5代码实现三、训练四、对图片进行预测五、训练过程截图:参考…

经典网络-LeNet-5

上图展示展示了 LeNet-5 模型的架构。 是Yann LeCun 教授于1998 年在论文Gradient-based learning applied to document recognition中提出的,它是第一个成功应用于数字识别问题的卷积神经网络。 LeNet-5 详细结构 在下面的篇幅中将详细介绍LeNet-5 模型每一层的…

深度学习---卷积神经网络之LeNet5(TensorFlow 代码实现)

一、前言 1.1 使用全连接神经网络对图像进行处理存在的问题 1、需要处理的数据量大,效率低 现在的图像都有着极高的像素,假设一张需要处理的图片像素是 1000 * 1000 * 3(彩色图片,具有 RGB 3 个通道),使用具有 100 个隐藏单元的…

浅谈LeNet-5

浅谈LeNet-5 基于Tensorflow的实现欢迎查看我下一篇博客Tensorflow实战 LeNet-5神经网络进行手写体数字识别 一、LetNet是什么? LetNet是一种入门级的神经网络模型,是一个简单的卷积神经网络,可以用来做手写体识别。 下面我将以上图为例简…

卷积神经网络CNN与LeNet5详解(可训练参数量、计算量、连接数的计算+项目实战)

文章目录 神经网络CNN卷积神经网络CNN的由来局部感受野共享权重池化CNN的结构光栅化 LeNet5详解LeNet5-C1层LeNet5-S2层LeNet5-C3层LeNet5-S4层LeNet5-C5层LeNet5-F6层LeNet5-OUTPUT层计算公式 LeNet5实战定义网络模型初始化模型参数训练测试准确率预测结果 神经网络 神经网络可…

lenet5实现

Pytorch环境下搭建lenet5网络实现手写数字识别 (文章采用cuda9.0cudnn7.4pytorch1.6环境) 数据集选用EMNIST dataset中的手写数据集,参考链接如下: 数据集下载地址 代码部分参考S.E作者的pytorch实现手写英文字母识别&#xff0…

从零开始的神经网络构建历程(三,LeNet5复现)

前两篇博文主要介绍了torch如何构建全连接前馈神经网络,本篇博客主要针对经典卷积神经网络LeNet5进行复现。 卷积神经网络的基本结构 相信不少人都看过不少博客,也都对卷积神经网络的大致结构了解一点,这里本人站在神经元的角度来描述卷积神…

卷积神经网络LeNet5结构

LeNet5可以说是最早的卷积神经网络了,它发表于1998年,论文原文Gradient-Based Learning Applied to Doucment Recognition作者是Yann Le Cun等。下面对LeNet5网络架构进行简单的说明,有兴趣的同学可以去参考原文,论文原文地址http…

Lenet5(1998)

先读 https://blog.csdn.net/zhangjunhit/article/details/53536915 https://blog.csdn.net/qianqing13579/article/details/71076261 第三个卷积层,S2 6个1010的特征映射,C3是16个1010的特征映射,怎么做的呢? 关注C3层 Why not …

LeNet5的论文及理解

LeNet5网络的来源:Lcun Y, Bottou L, Bengio Y, et al. Gradient-based learning applied to document recognition[J]. Proceedings of the IEEE, 1998, 86(11):2278-2324. 1. 卷积神经网络(Convolutional Neural Network,CNN)基…

Pytorch搭建LeNet5网络

本讲目标:   介绍Pytorch搭建LeNet5网络的流程。 Pytorch八股法搭建LeNet5网络 1.LeNet5网络介绍2.Pytorch搭建LeNet5网络2.1搭建LeNet网络2.2测试LeNet网络输出2.3下载数据集2.4加载并配置网络2.5训练并保存网络2.6测试图片 1.LeNet5网络介绍 借鉴点:…

HLS:卷积神经网络LeNet5的实现与测试

目录 一、引言二、LeNet5的学习三、数学知识补充四、HLS代码设计五、仿真综合与优化六、Zynq平台搭建测试七、一些注意点八、文献时间线与后续工作 一、引言 1、开发环境。 Windows10、Vivado2018.2、Vivado HLS与Xilinx SDK。 2、LeNet5概述。 1994年,CNN网络&…

卷积神经网络(一):LeNet5的基本结构

在机器视觉,图像处理领域,卷积神经网络取得了巨大的成功。本文将参考UFLDL和DEEPLEARNING.NET的教程,结合自己的理解,梳理一下卷积神经网络的构成以及其BP算法的求解。虽然利用theano可以方便的实现LeNet5,但是不利于学…

LeNet5网络结构详解

文章目录 1.论文地址:2.LeNet5网络结构:3.首先了解参数量和计算量之间的区别和计算:(1)参数量(Params):(2)计算量(FLOPS):&#xff08…

经典网络模型介绍系列——LeNet-5

从今天开始,带大家从LeNet5开始学习经典的网络模型。 一、LeNet-5 LeNet-5是LeNet系列的最终稳定版,它被美国银行用于手写数字识别,该网络有以下特点: 所有卷积核大小均为5*5,步长为1;所有池化方法为平均…

LeNet5的深入解析

论文:Gradient-based-learning-applied-to-document-recognition 参考:http://blog.csdn.net/strint/article/details/44163869 LeNet5 这个网络虽然很小,但是它包含了深度学习的基本模块:卷积层,池化层,…

LeNet5模型讲解

加粗样式LeNet5模型讲解 LeNet5模型总览 总共8层网络,分别为: 输入层(INPUT)、卷积层(Convolutions,C1)、池化层(Subsampling,S2)、卷积层(C3)、…

LeNet-5详解

一、前言 LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition,是一种用于手写体字符识别的非常高效的卷积神经网络。 本文将从卷积神经网络结构的基础说起,详细地讲解每个网络层。 论文下载:请到文章结尾处下载。 …