计算机视觉初探--LeNet原理与实践

LeNet:深度学习图像识别的里程碑

LeNet是卷积神经网络(Convolutional Neural Network, CNN)领域的先驱模型,由Yann LeCun等人在1998年提出,被广泛应用于手写数字识别和其他计算机视觉任务。本文将介绍LeNet模型的数学原理,使用PyTorch进行代码实现和实验验证。

数学原理

卷积操作

卷积是CNN中最重要的操作之一,它可以从输入数据中提取特征。在LeNet模型中,卷积操作使用卷积核与输入数据进行逐元素相乘,然后将相乘后的结果相加得到输出特征图。

Y [ i , j ] = ∑ m ∑ n ( X [ m , n ] ∗ K [ i − m , j − n ] ) Y[i, j] = \sum_{m}\sum_{n}(X[m, n] * K[i-m, j-n]) Y[i,j]=mn(X[m,n]K[im,jn])
其中,Y是输出特征图的某个位置上的值,i和j是输出特征图的索引,m和n是卷积核的索引,X是输入特征图的值,K是卷积核的权重。

卷积操作的步骤如下:

1.将卷积核与输入特征图进行逐元素相乘。

2.将相乘后的结果相加得到输出特征图的对应位置的值。
卷积操作的作用是通过滑动窗口的方式对输入特征图进行扫描,提取局部特征,并保留空间关系。卷积核的权重可以学习到不同的特征,例如边缘、纹理等。

池化操作

池化操作用于对特征图进行下采样,以减少数据维度并保留重要特征。在LeNet模型中,常见的池化方式包括最大池化和平均池化。

最大池化(Max Pooling)

最大池化是池化操作中常用的一种类型,它会选取一个滤波器区域内的最大值作为输出。

平均池化(Average Pooling)

平均池化是另一种常见的池化方式,它会选取一个滤波器区域内所有值的平均值作为输出。

池化操作有助于减少数据的维度,降低计算复杂度,同时保留重要的特征信息,有利于提高模型的鲁棒性和泛化能力。

全连接层

全连接层将上一层的所有神经元与当前层的所有神经元进行连接,通过权重矩阵和偏置向量进行线性变换,然后再通过激活函数进行非线性变换。

Y = tanh ⁡ ( ∑ i = 1 n ( W i X i + b i ) ) Y = \tanh(\sum_{i=1}^{n}(W_{i}X_{i} + b_{i})) Y=tanh(i=1n(WiXi+bi))

激活函数

激活函数是CNN中必不可少的组成部分,它可以将线性模型转化为非线性模型,从而提高模型的表达能力。在LeNet模型中,使用tanh作为激活函数。

tanh ⁡ ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+exexex

前向传播

LeNet模型的前向传播过程包括卷积运算、池化操作、全连接层的线性变换和非线性变换,最终通过softmax函数得到分类结果。

反向传播

反向传播用于计算损失函数对模型参数的梯度,通过梯度下降算法来更新模型参数,使损失函数达到最小值,从而训练模型。

代码实现

以下是使用PyTorch实现LeNet模型的代码:

import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision.datasets import MNIST
from torchvision.transforms import ToTensor
from torch.utils.data import DataLoader
import tqdm# 定义LeNet模型
class LeNet(nn.Module):def __init__(self):super(LeNet, self).__init__()self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5)self.pool1 = nn.AvgPool2d(kernel_size=2, stride=2)self.conv2 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5)self.pool2 = nn.AvgPool2d(2)self.fc1 = nn.Linear(in_features=4 * 4 * 16, out_features=120)self.fc2 = nn.Linear(in_features=120, out_features=84)self.fc3 = nn.Linear(in_features=84, out_features=10)def forward(self, x):x = F.tanh(self.conv1(x))x = self.pool1(x)x = F.tanh(self.conv2(x))x = self.pool2(x)x = x.view(-1, 4 * 4 * 16)x = F.tanh(self.fc1(x))x = F.tanh(self.fc2(x))output = F.softmax(self.fc3(x), dim=1)return output# 准备数据集
train_set = MNIST(root='.', train=True, download=True, transform=ToTensor())
test_set = MNIST(root='.', train=False, download=True, transform=ToTensor())
train_loader = DataLoader(train_set, batch_size=128, shuffle=True)
test_loader = DataLoader(test_set, batch_size=128, shuffle=False)# 训练模型
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = LeNet().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)for epoch in range(10):model.train()for images, labels in train_loader:images, labels = images.to(device), labels.to(device)optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()print(f"[{epoch+1}] loss:{loss}")# 测试模型
model.eval()
correct = 0
total = 0
with torch.no_grad():for images, labels in test_loader:images, labels = images.to(device), labels.to(device)outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()accuracy = 100 * correct / total
print('Test Accuracy: {:.2f}%'.format(accuracy))

上述代码首先定义了LeNet模型,包含两个卷积层、两个池化层、三个全连接层,并使用tanh和softmax作为激活函数。然后通过PyTorch的数据加载器准备MNIST数据集,并使用交叉熵损失和随机梯度下降优化算法训练模型。最后在测试集上评估模型的准确率。

总结

LeNet模型是卷积神经网络领域的里程碑,为深度学习图像识别任务的发展做出了重要贡献。本文介绍了LeNet模型的数学原理、PyTorch的代码实现,并通过训练和测试模型展示了其在手写数字识别任务上的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/701944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随想录刷题笔记 —二叉树篇11 538二叉搜索树转换为累加树 77组合

538二叉搜索树转换为累加树 递归:使用pronode标记仅小于该节点的节点,使用右中左的顺序 根据pronode值修改节点值 class Solution {TreeNode pronode null;public TreeNode convertBST(TreeNode root) {if (rootnull){return root;}if (root.right!nu…

深入了解计算机系统——1.计算机系统初步

文章目录 计算机系统信息是什么我们来看看hello在哪 程序被其他程序翻译成不同的格式处理器读取并解释内存中的指令硬件组成 计算机系统 信息是什么 信息是位上下文 下面写一段程序 ...(省略) printf("hello world"); ... hello.c上面是一段hello程序…

Vue-Json-Schema-Form: 如何基于模板定制前端页面

本人从事的是工业物联网, 面对工业设备的通讯难题是各大设备都有各自的通讯协议, 如果想要用一款硬件去和所有设备做通讯的话, 就得面对怎么把自己想要采集的配置下发给自己的采集器的问题, 以前都是采用各种模型去尝试构建配置项, 但是因为配置可能会有深层次嵌套, 而且…

13-ATF中的Switch cpu context

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】我的联系方式-自建交流群-学习群 【必看/必看!!】ATF架构开发精讲-专题目录👈👈👈【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈目录 <

如何使用移动端设备在公网环境远程访问本地黑群晖

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

嵌入式26——进程

进程基本概念:1.进程: 程序&#xff1a;存放在外存中的一段数据组成的文件 进程&#xff1a;是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态查看当前系统中的所有进程信息&#xff08;根据CPU占用率排序&am…

算法:判断回文数

判断数字是否为回文数&#xff0c;反转后与原数字相同&#xff0c;即为为回文数 方法一&#xff1a;将数字转为字符串&#xff0c;然后利用字符串的反转来判断是否为回文数 首先将数字转换为字符串&#xff0c;然后将字符串转换为数组并反转&#xff0c;最后将反转后的数组转…

C#与VisionPro联合开发——串口通信

串口通信 串口通信是一种常见的数据传输方式&#xff0c;通过串行接口&#xff08;串口&#xff09;将数据以串行比特流的形式进行传输。在计算机和外部设备之间&#xff0c;串口通信通常是通过串行通信标准&#xff08;如RS-232&#xff09;来实现的。串口通信可以用于连接各…

解析OOM的三大场景,原因及实战解决方案

目录 一、什么是OOM 二、堆内存溢出&#xff08;Heap OOM&#xff09; 三、方法区内存溢出&#xff08;Metaspace OOM&#xff09; 四、栈内存溢出&#xff08;Stack OOM&#xff09; 一、什么是OOM OOM 是 Out Of Memory 的缩写&#xff0c;意思是内存耗尽。在计算机领域…

每日OJ题_牛客JZ39 数组中出现次数超过一半的数字

目录 牛客JZ39 数组中出现次数超过一半的数字 解析代码 牛客JZ39 数组中出现次数超过一半的数字 数组中出现次数超过一半的数字_牛客题霸_牛客网 解析代码 摩尔投票法&#xff1a;摩尔投票法&#xff0c;时间O(N)&#xff0c;空间O(1)。 可以理解成混战极限一换一&#xff…

算法沉淀——动态规划之简单多状态 dp 问题(上)(leetcode真题剖析)

算法沉淀——动态规划之简单多状态 dp 问题上 01.按摩师02.打家劫舍 II03.删除并获得点数04.粉刷房子 01.按摩师 题目链接&#xff1a;https://leetcode.cn/problems/the-masseuse-lcci/ 一个有名的按摩师会收到源源不断的预约请求&#xff0c;每个预约都可以选择接或不接。在…

神经网络系列---常用梯度下降算法

文章目录 常用梯度下降算法随机梯度下降&#xff08;Stochastic Gradient Descent&#xff0c;SGD&#xff09;&#xff1a;随机梯度下降数学公式&#xff1a;代码演示 批量梯度下降&#xff08;Batch Gradient Descent&#xff09;批量梯度下降数学公式&#xff1a;代码演示 小…

基于Pytorch的猫狗图片分类【深度学习CNN】

猫狗分类来源于Kaggle上的一个入门竞赛——Dogs vs Cats。为了加深对CNN的理解&#xff0c;基于Pytorch复现了LeNet,AlexNet,ResNet等经典CNN模型&#xff0c;源代码放在GitHub上&#xff0c;地址传送点击此处。项目大纲如下&#xff1a; 文章目录 一、问题描述二、数据集处理…

idea使用debug妙招之消息队列kafka多消费者组消费同一Topic

1. 问题场景复现 不同类型的消息发到同一个Topic中&#xff0c;设置多个消费者组&#xff0c;为每个消费者组打一个标记。每一种消费者组只能消费对应的消息类型。这样做的好处是避免设置多个Topic&#xff0c;简化代码开发的同时性能损耗小。问题出现在消费端&#xff0c;由于…

[HTML]Web前端开发技术29(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要! 目录 前言 上一节的课后练习

题目 1277: Lucky Word

题目描述: 笨小猴的词汇量很小&#xff0c;所以每次做英语选择题的时候都很头疼。但是他找到了一种方法&#xff0c;经试验证明&#xff0c;用这种方法去选择选项的时候选对的几率非常大&#xff01; 这种方法的具体描述如下&#xff1a;假设maxn是单词中出现次数最多的字母的…

janus-gateway的videoroom插件的RTP包录制功能源码详解

引: janus-gateway在配置文件设置后&#xff0c;可以实现对videoroom插件的每个publisher的音频&#xff0c;视频&#xff0c;数据的RTP流录制成mjr文件。 对于音频&#xff0c;视频的mjr文件&#xff0c;可以使用自带的postprocessing工具janus-pp-rec转成mp4文件。 每个pu…

docker运行onlyoffice,并配置https访问【参考仅用】

官方说明&#xff1a; Installing ONLYOFFICE Docs for Docker on a local server - ONLYOFFICEhttps://helpcenter.onlyoffice.com/installation/docs-developer-install-docker.aspx 一、容器端口、目录卷映射 sudo docker run --name容器名称 --restartalways -i -t -d -p…

#FPGA(基础知识)

1.IDE:Quartus II 2.设备&#xff1a;Cyclone II EP2C8Q208C8N 3.实验&#xff1a;正点原子-verilog基础知识 4.时序图&#xff1a; 5.步骤 6.代码&#xff1a;

零样本带解释性的医学大模型

带解释性的医学大模型 提出背景解法拆解方法的原因对比以前解法 零样本带解释性的医学大模型如何使用CLIP模型和ChatGPT来进行零样本医学图像分类用特定提示查询ChatGPT所生成的医学视觉特征描述相似性得分在不同症状上的可视化&#xff0c;用于解释模型的预测注意力图的可视化…