学习LeNet(网络讲解+代码)

CNN经典网络模型(一):LeNet简介及代码实现(PyTorch超详细注释版) CNN经典网络模型之一:LeNet,本文包含其简介及代码,在PyTorch中实现,进行超详细注释,适合新生小白阅读学习~ 阅读详情

LeNet

(新手入门,如理解有误感谢指正)
LeNet原论文地址
原论文共有了11个部分,我们所听说的LeNet-5是在Section II第二部分讲解的,第一部分是一些背景介绍,后面部分则是一些实验,可以自行阅读论文。

不算输入层,LeNet-5一共有7层网络用来预测手写数字0-9,如图1(来自论文)所示:
图1

图1

可以看到它是由Convolutional layer ( C1) + Subsampling layer ( S2) + Convolutional layer ( C3) + Subsampling layer ( S4) + Convolutional layer ( C5) + Fully connected layer ( F6) + Fully connected layer ( Output)

卷积层特征图输出尺寸计算公式:
M = N − F + 2 P S + 1 M = \frac{N-F+2P}{S}+1 M=SN−F+2P​+1
其中N是输入的尺寸,即 N × N N\times N N×N的输入,F是卷积核(filter)的尺寸,即 F × F F\times F F×F的卷积核,P是padding,S是stride步长

Input:

32 × 32 32\times 32 32×32 的图像

C1:

6个卷积核

卷积核尺寸 5 × 5 5\times 5 5×5(注意通常说卷积核尺寸的时候忽略了深度,通常卷积核深度和输入图的深度相同,这里相当于是 1 × 5 × 5 1\times 5 \times 5 1×5×5)

步长stride为1

无填充padding

该层总共需要训练的参数个数为 6 × ( 1 × 5 × 5 + 1 ) = 156 6\times (1\times 5 \times 5 + 1) = 156 6×(1×5×5+1)=156(注意括号里为什么+1,因为每个卷积核还要有一个偏置项,6个卷积就又多6个参数)

输出每个特征图(feature map)的尺寸为 32 − 5 + 0 1 + 1 = 32 − 4 = 28 \frac{32-5+0}{1}+1 = 32-4=28 132−5+0​+1=32−4=28,所以每个特征图是 28 × 28 28\times 28 28×28的,6个卷积核得到了深度为6的特征图,即 6 × 28 × 28 6\times 28\times 28 6×28×28

图2
图2

S2:

下采样层,实际上使用的是average pooling

采样核尺寸 2 × 2 2\times 2 2×2

步长stride为2

无填充padding

输出的每个特征图尺寸为 28 − 2 + 0 2 + 1 = 14 \frac{28-2+0}{2}+1 = 14 228−2+0​+1=14,深度不变,所以输出特征图尺寸为 6 × 14 × 14 6\times 14 \times 14 6×14×14
图3
图3

根据论文中下采样的过程:
图4

图4

每次把采样的四个点像素求平均,然后乘一个需要训练的参数,再加个偏执,最后通过sigmoid非线性激活函数

这样的话,每一层深度上的采样需要2个参数,输入的深度是6,就是12个参数需要训练

C3:

16个卷积核

卷积核尺寸 5 × 5 5\times 5 5×5(这里比较有意思,按常理来说,由于上一层的输入图的深度是6,那么每个卷积核的实际尺寸应该是 6 × 5 × 5 6\times5\times5 6×5×5,但是论文没有简单的这么做下面会说)

步长stride为1

无填充padding

输出特征图的尺寸 14 − 5 + 0 1 + 1 = 10 \frac{14-5+0}{1}+1 = 10 114−5+0​+1=10,16个卷积核得到深度为16的特征图,因此最终的输出特征图尺寸为 16 × 10 × 10 16\times10\times10 16×10×10
图5
图5

一般来说第一个卷积核和 6 × 14 × 14 6\times14\times14 6×14×14的输入作用形成 16 × 10 × 10 16\times10\times10 16×10×10输出的第一层,第二个卷积核和 6 × 14 × 14 6\times14\times14 6×14×14的输入作用形成 16 × 10 × 10 16\times10\times10 16×10×10输出的第二层,以此类推得到第三层,…第十六层。
那么每个卷积核和前面 6 × 14 × 14 6\times14\times14 6×14×14的输入作用,卷积核的深度往往等于输入的深度,但是论文中在该层的做法不同,它没有使用输入的全部深度,而是一个子集,也就是说C3的卷积核深度并不简单的都是6。
图6

图6

我们看一下论文中的这个表,注意他是从0开始标号,竖着看6个,代表输入特征图的6个层或者说6个channel,横着看16个,就代表输出特征图的16层了,因为输出深度16嘛。

这个表的意思是,输出特征图的第一层是第一个卷积核和输入特征图的前三层作用得到的,也就是说第一个卷积核的尺寸实际上是 3 × 5 × 5 3\times5\times5 3×5×5
图7

图7

那么其实我们看表可以发现输出特征图的前6层(0-5)都是卷积核和输入特征图的连续的3层作用得到的,那么前六个卷积核的实际尺寸就是 3 × 5 × 5 3\times5\times5 3×5×5
同理,输出特征图后面的6层(6-11)是卷积核和输入特征图 连续的4层作用得到的,那么这6个卷积核的实际尺寸就是 4 × 5 × 5 4\times5\times5 4×5×5
再往后3层(12-14)是卷积核和输入特征图 不连续的4层作用得到的,这3个卷积核的实际尺寸也是 4 × 5 × 5 4\times5\times5 4×5×5
最后一层,才是使用了输入特征图的全部层,最后这个卷积核的实际尺寸才是 6 × 5 × 5 6\times5\times5 6×5×5

原论文中是这么说的:
图8

图8

根据上面这么一通分析,我们就可以计算一下C3需要训练多少参数了
( 3 × 5 × 5 + 1 ) × 6 + ( 4 × 5 × 5 + 1 ) × ( 6 + 3 ) + ( 6 × 5 × 5 + 1 ) = 1516 (3\times5\times5+1)\times6+(4\times5\times5+1)\times(6+3)+(6\times5\times5+1)=1516 (3×5×5+1)×6+(4×5×5+1)×(6+3)+(6×5×5+1)=1516
括号里加1是每个卷积核的偏置项

S4:

恭喜你坚持到了这里,估计刚才的C3那一层的分析应该是LeNet-5中最难理解的一部分了

同S2

采样核尺寸 2 × 2 2\times2 2×2

步长stride为2

无填充padding

输出特征图的尺寸 10 − 2 + 0 2 + 1 = 5 \frac{10-2+0}{2}+1=5 210−2+0​+1=5,所以输出特征图的尺寸是 16 × 5 × 5 16\times5\times5 16×5×5

需要训练的参数是 16 × 2 = 32 16\times2=32 16×2=32个(原因和S2相同)

C5:

卷积核个数120个

卷积核尺寸 5 × 5 5\times5 5×5(这里每个卷积核的深度就和输入图的深度一样了,即每个卷积核实际上是 16 × 5 × 5 16\times5\times5 16×5×5)

步长为1

无填充padding

输出特征图尺寸 5 − 5 + 0 1 + 1 = 1 \frac{5-5+0}{1}+1 = 1 15−5+0​+1=1,所以最终输出特征图的尺寸是 120 × 1 × 1 120\times 1\times1 120×1×1,就相当于一个 120 × 1 120\times 1 120×1的列向量

需要训练的参数个数为 120 × ( 16 × 5 × 5 + 1 ) = 48120 120\times(16\times5\times5+1)=48120 120×(16×5×5+1)=48120

F6:

全连接层84个节点

上一层120个节点全连接

总共需要训练的参数个数为 ( 120 + 1 ) × 84 = 10164 (120+1)\times84=10164 (120+1)×84=10164

Output

最后要预测10个类别嘛,所以最后一层肯定10个节点,和上一层的84个节点全连接

除了采样层和最后一层输出层,卷积层和全连接层的激活函数采用了下面的形式
f ( a ) = A t a n h ( S a ) f(a) = A\quad tanh(Sa) f(a)=Atanh(Sa)
输出层采用RBF径向基函数做输出
y i = ∑ j ( x j − w i j ) 2 y_i = \sum_j(x_j-w_{ij})^2 yi​=j∑​(xj​−wij​)2
就是用上一层的输入和对应权重求一个欧氏距离
图9
图9


当然现在大部分实现LeNet网络并没有像论文中那么复杂,C3单纯使用的是 6 × 5 × 5 6\times5\times5 6×5×5的卷积核,使用max pooling作为pooling层,激活函数使用ReLu,最后一层全连接层也和前面一样,最后使用交叉熵作为损失函数。

下面是Pytorch的实现,来自Pytorch官网的tutorials

Code:

import torch.nn as nn
import torch.nn.functional as F


# 定义网络
class LeNet(nn.Module):
    def __init__(self):
        super(LeNet, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)
    
    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# 指定loss和优化
import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)


经典CNN之:LeNet介绍 手写字体识别模型LeNet5诞生于1994年,是最早的卷积神经网络之一。LeNet5通过巧妙的设计,利用卷积、参数共享、池化等操作提取特征,避免了大量的计算成本,最后再使用全连接神经网络进行分类识别,这个网络也是最近大量神经网络架构的起点。 LeNet5的网络结构示意图如下所示: LeNet5由7层CNN(不包含输入层)组成,上图中输入的原始图像大小是32×32像素,卷积层用Ci表示,子采... 阅读详情

相关推荐

深度学习笔记(四)用Torch实现MNIST手写数字识别

本节代码地址: https://github.com/vic-w/torch-practice/tree/master/mnist MNIST是手写数字识别的数据库。在深度学习流行的今天,MNIST数据库已经被大家玩坏了。但是用它来学习卷积神经网络是再好不过的了。这一次,我们就用Torch来实现MNIST数据库的识别。

山猫小队长的专栏 1万+

动手学深度学习—卷积神经网络LeNet(代码详解)

该模型去掉了最后一层的高斯激活,下面将一个大小为28×28的单通道(黑白)图像通过LeNet,打印每一层输出的形状。

qq_38473254的博客 2465

计算机视觉ch8 基于LeNet的手写字体识别

文章目录原理LeNet的简单介绍Minist数据集的特点 原理 卷积神经网络参考:https://www.cnblogs.com/chensheng-zhou/p/6380738.html LeNet神经网络参考:https://my.oschina.net/u/876354/blog/1632862 LeNet的简单介绍 LeNet是一个最典型的卷积神经网络,由卷积层、池化层、全连接层组成。...

你好鸭! 687

经典神经网络学习笔记之LeNet(附带代码)

       本文是对经典论文“Gradient-Based Learning Applied to Document Recognition”的阅读笔记之一,主要介绍LeNet的结构以及参数个数的计算,结合“DeepLearning for Computer Vision with Python starter bundle”所介绍的原理和实验所写。笔者才疏学浅,还望指教。 一、理论部分  ...

u014509577的博客 4787

Ubuntu升级遇到grub-efi-amd64-signed安装失败?3步搞定这个烦人错误

本文深度解析Ubuntu系统升级时grub-efi-amd64-signed安装失败并提示“cannot find EFI directory”错误的根本原因。该错误通常由EFI系统分区挂载异常、BIOS/UEFI引导模式不匹配或dpkg包状态死锁导致。文章提供了三步精准修复流程:首先检查并修复ESP分区挂载,其次处理dpkg依赖问题,最后针对传统BIOS系统提供适配方案,帮助用户安全彻底地解决这一常见升级难题。

r7s8t的博客 398

PostgreSQL高可用之主备复制

多个PostgreSQL可协同工作,如果主库发生宕机备库将迅速进行接管并对外提供服务以实现高可用。本文将从主备复制、主备切换、故障转移等角度进行实际测试演练。第一章主备复制是基础,通过主备复制可以得到一个或多个相同的实例。在主备复制的基础上通过第二章主备切换介绍了如何手工将主库与备库互换角色。在第三章中,采用了Keepalived进行实时监测,在主库宕机后,使用主备切换中提到的命令使备库升级为主库并对外提供服务,以达到PostgreSQL高可用的目标。

asdasdsaff的博客 1347

浅尝CNN之LeNet的原理简述及Python实现

今天是1024,大家的节日,最近在看CNN,所以来总结一下,顺带摸一个1024勋章,嘿嘿嘿! LeNet-5模型是Yann LeCun教授与1998年在论文Gradient-based learning applied to document recognition中提出的,它是第一个成功应用于数字识别问题的卷积神经网络。 首先先甩上Yann LeCun教授的论文(是我见到的最长的论文): 链...

弓长^_^张的博客 1650

Python xlwings报错解决:从‘NoneType‘到完美运行WPS表格的完整指南

本文深入解析了使用Python xlwings库自动化WPS表格时遇到的经典'NoneType'报错(AttributeError: 'NoneType' object has no attribute 'apps')的根源与解决方案。核心在于pywin32版本与WPS的兼容性问题,文章提供了从版本降级、依赖管理到构建健壮自动化环境的完整实战指南,帮助开发者彻底解决兼容性难题,实现稳定运行。

n4o5p6q7r的博客 303

Tensorflow实现经典网络LeNet的学习总结及有关代码细节讲解!

一、前言 最近刚开始学习Tensorflow,在掌握Tensorflow基本用法的条件下去实现经典网络LeNet,在代码细节上有许多不理解的地方,于是通多查找有关博客和用代码做了小实验,在此总结一下,以便日后回顾,同时也有助于刚学习的童鞋理解。 二、tensorflow入门教程 对于tensorflow的入门教程我觉得官网的还不不错的,网址:http://www.te...

Choose_lzn的博客 800

PCIE的MSI中断处理机制与优化策略

PCIe设备的。

xiaoheshang_123的博客 516

OmniParser V2 和 OmniTool 让 AI 来控制 Windows 设备

OmniParser V2 和 OmniTool 是由微软开发的一套工具,通过屏幕解析技术让 AI 能够理解和控制 Windows 设备。OmniParser V2 是一款数据解析工具,可以解读屏幕内容,并将内容传递给大模型OmniTool 则是一个运行 Windows Agent 的工具,提供 Windows 界面给 AI 操作。

简简单单Onlinezuozuo 2730

【深度学习入门笔记】CNN卷积神经网络 - LeNet具体实现及代码讲解

CNN卷积神经网络 - LeNet具体实现及代码讲解 本次笔记来源bilibili 霹雳吧啦Wz pytorch官方demo(Lenet) 个人github仓库:heisenbergCh/way-to-deep-learning: 个人零基础自学深度学习时产生的笔记与示例代码 参照官网demo定义LeNet网络结构 完整代码: import torch.nn as nn import torch.nn.functional as F class LeNet(nn.Module): def

yijia7590jfz的博客 2086

【单智能体】AI 数据分析智能体案例讲解(附完整源码)

本案例将引导您构建一个基于 AI 的数据分析智能体,让用户能够通过自然语言查询来分析 CSV 和 Excel 文件中的数据,无需掌握 SQL 知识。该智能体使用 Agno Agent 框架集成 OpenAI GPT-4o 模型,并利用 DuckDB 提供高效的数据处理能力。

rengang66的博客 238

CNN之LeNet初学者笔记

Lenet 是一系列网络的合称,包括 Lenet1 - Lenet5,由 Yann LeCun 等人 在1990年《Handwritten Digit Recognition with a Back-Propagation Network》中提出,是卷积神经网络的开山之作,也是将深度学习推向繁荣的一座里程碑。LeNet首次采用了卷积层、池化层这两个全新的神经网络组件,接收灰度图像,并输出其中包含的手写数字,在手写字符识别任务上取得了瞩目的准确率。

Buffoonl的博客 1044

YOLO11涨点优化:小目标检测 | 多头检测器提升小目标检测精度

引入多头检测器助力YOLO11,添加一个微小物体的检测头暴力提升小目标检测性能

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 4742

Flow Matching03-01:微分方程【微分方程(描述变化规律的方程):包含未知函数和它的导数的方程】【公式解(精确)、数值解(逼近)】

好的,我将从数学角度详细解释Flow Matching,从高中生能理解的基础知识开始,逐步深入到高级概念。

u013250861的博客 218

python实现lenet_LeNet - Python中的卷积神经网络

本教程将主要面向代码,旨在帮助您深入学习和卷积神经网络。由于这个意图,我不会花很多时间讨论激活功能,池层或密集/完全连接的层- 将来会有很多教程在PyImageSearch博客上将覆盖每个层类型/概念在很多细节。再次,本教程是您第一个端到端的例子,您可以训练一个现实的CNN(并在实际中看到它)。我们将在本系列帖子中稍后介绍激活功能,汇集层和完全连接层的细节(尽管您应该已经知道卷积运算的基本知识);...

weixin_39683241的博客 1332

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

卷积神经网络-LeNet学习笔记一

GPT3.5的回答:在编程中,实例化是指根据类创建对象的过程。在面向对象编程中,类是一种抽象的数据类型,描述了对象的属性和行为。当我们需要使用类创建具体的对象时,就会进行实例化操作。在Python中,通过调用类的构造函数来实现实例化。例如,在上述代码中,通过这行代码,我们实例化了一个LeNet类的对象,即创建了一个LeNet模型的实例。

zyt18130132的博客 1281

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

史上最详细的深度学习与神经网络讲解(三)

张量:是一个物理量,对高维 (维数 ≥ 2) 的物理量进行 “量纲分析” 的一种工具。简单的可以理解为:一 维数组称为矢量,二维数组为二阶张量,三维数组 为三阶张量。计算图:用“结点”(nodes)和“线”(edges)的有向图来 描述数学计算的图像。“节点” 一般用来表示施加 的数学操作,但也可以表示数据输入的起点/输出的 终点,或者是读取/写入持久变量的终点。“线”表 示“节点”之间的输入/输出关系。这些数据“线” 可以输运“size可动态调整”的多维数据数组,即 “张量”(tensor)。

weixin_51392874的博客 665

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MxNet封装实现经典深度网络框架 LeNet,Alex-Net,VGGNet,Google-Net,ResNet

文章目录LeNet打印每一层的输出形状在GPU上计算精度在GPU上训练训练模型AlexNet(2012)定义模型查看每一层的输出形状训练VGGVGG块定义模型使用一个窄版本来训练GoogLeNetInception块Inception模型,第一阶段Inception模型,第二阶段Inception模型,第三阶段Inception模型,第四阶段Inception 模型 - 第五阶段查看网络训练Res...

xiao_lxl的专栏 1189

《动手学深度学习》(PyTorch版)代码注释 - 23 【AlexNet_Learning】

目录说明配置环境此节说明代码 说明 本博客代码来自开源项目:《动手学深度学习》(PyTorch版) 并且在博主学习的理解上对代码进行了大量注释,方便理解各个函数的原理和用途 配置环境 使用环境:python3.8 平台:Windows10 IDE:PyCharm 此节说明 此节对应书本上5.6节 此节功能为:深度卷积神经网络(AlexNet) 由于次节相对容易理解,代码注释量较少 代码 # 本书链接https://tangshusen.me/Dive-into-DL-PyTorch/#/chapter03_

ShakalakaPHD的博客 360

神经网络与深度学习第三周总结

节点” 一般用来表示施加的数学操作,但也可以表示数据输入的起点 /输出的终点,或者是读取 /写入持久变量的终点。每个神经元对应5*5+1个参数,共6个feature map,28*28个神经元,因此共有(5*5+1)*6*(28*28)=122304连接。卷积层,其三个参数按顺序代表输入通道数、输出通道数、卷积核大小,若卷积核形状为正方形,则卷积核大小可以为int;否则,卷积核大小必须为元组(tuple)。:可以规定卷积的步长,与卷积核大小类似,若各方向步长相同则可以为整数,否则应为元组。

shawn5002的博客 117

神经网络与深度学习第二周课程学习总结

全连接网络:链接权过多,算的慢,难收敛,同时可能进入局部 极小值,也容易产生过拟合问题e.g. 输入为1000×1000图像,隐含层有1M个节点,则输入->隐 含层间有1×1012数量级参数解决算的慢问题:减少权值连接,每一个节点只连到上一层的少 数神经元,即局部连接网络。权值过多极易产生过拟合。如何消除?回想人类解决思路:信息分层处理,每一层在上层提取特征的基 础上获取进行再处理,得到更高级别的特征。60分钟快速入门:jianshu.com/p/889dbc684622官方教程:https://www.p

weixin_56966424的博客 643

《神经网络与深度学习》学习笔记(第2周)

卷积神经网络是一种优秀的处理图像的神经网络。一方面,卷积神经网络的权值的数量有所减小,使得网络易于优化,另一方面卷积神经网络的模型的复杂度有所减小、降低了过拟合的风险。卷积神经网络的包括卷积层、池化层、多输入多输出通道、池化层等。

ZhaoHuiXiYin_2的博客 884

Pytorch 03: nn.Module模块了解 --- Lenet编写举例

声明:转载自这位大佬:cltdevelop 原文链接:https://blog.youkuaiyun.com/u012609509/article/details/81203436侵删 ———————————————————————————————————————— 从代码角度学习理解Pytorch学习框架03: 神经网络模块nn.Module的了解。 # coding=utf-8 import ...

skywalker_123的博客 922

(超详细注解!!!)神经网络算法(PyTorch实现图像分类)代码解析

损失函数(lossfunction)的全面介绍(简单易懂版)-优快云博客.pth文件是什么文件?-优快云博客注:本篇文章主要是小白新手刚开始学习深度学习神经网络而写的文章,主要用于【自用】,代码以及视频来源于B站up主:炮哥带你学,以及相关视频链接:【Pytorch框架与经典卷积神经网络与实战】代码是根据LeNet-5模型搭建以及训练进行讲解,主要讲解的是大多数模型搭建的一个框架以及某些代码的含义。

GHannnnn的博客 897
上一篇: Python变量存储方式以及深浅拷贝
下一篇: 学习AlexNet(网络讲解+代码)
Guuuuuu老师儿
博客等级 码龄9年 259粉丝 718原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值