卷积神经网络(一)-LeNet-5

前言

        LeNet开启了卷积神经网络的第一枪,这一网络模型由Yann LeCun等人在1998年提出,被视为卷积神经网络的开山之作。

论文地址:

http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf

如果打不开就看csdn:

https://download.csdn.net/download/p731heminyang/89515637

 

LeNet-5解析

我们通过解析lenet这个最简单的卷积网络来慢慢熟悉神经网络,经典图如下:

通过上面的图可以看到整个网络包含7层

我们如下分析每一层:

卷积计算公式:卷积池化尺寸计算公式_rgb卷积池化计算-CSDN博客

不熟悉的可以先看看卷积的公式,这样可以熟悉下输入和输出如何对应,如何通过输入输出来大体推算卷积核,由于lenet-5没有填充那么就更好分析了,具体如下。

卷积层:是为了获取特征,特征值复杂就需要多层特征提取,增加感受野

池化层:是为了减少计算量简化特征和防止过拟合

全连接层:是为了输出结果

lenet-5 目的主要用于识别数字的算法,所以后面输出层为10,对应10个数字(0~9)。

第一层(卷积层):

输入参数:32x32  ,先针对图片进行处理,变成32x32的数组,再对其进行归一化处理,方便计算,这里通道为1,属于黑白图

输出参数:6x28x28 ,   经过卷积核的处理得到了此参数

卷积核:6x5x5 ,通过输出参数深度参数6,可以知道经过了6个卷积核的处理,这里的卷积步长都是为1,而且没有填充,按照公式就是 28=(32-N)/1 +1  推算出N=5

参数个数:156 ,卷积核为y=wx+b  ,参数等于权重w格式和b的个数,这里有6个wx+b,w为卷积核为5x5,b就是常数 1,所以参数个数为6x(5x5+1) = 156

第二层(池化层):

输入参数:6x28x28  ,上一层的输出

输出参数:6x14x14, 从这里可以看出维数减半了,那么一般是常用的滤波器2x2,步长为2

滤波器:2x2,步长为:2   通过公式刚好:14 = (28 - N)/2 +1  这里N为2

参数个数:0,  池化层没有权重,一般是最大权重或者最小权重或者平均权重,正常的都是最大权重,选择最大值。

第三层(卷积层):

输入参数:6x14x4,上一层的输出

输出参数:16x10x10, 这里有16个卷积核 

卷积核:16x5x5,步长为:1 ,10=(14-N)/1 +1  推算出N=5

参数个数:416, 16x(5x5 + 1)=416

第四层(池化层):

输入参数:16x10x10,上一层的输出

输出参数:16x5x5, 从这里可以看出维数减半了,那么一般是常用的滤波器2x2,步长为2

滤波器:2x2,步长为:2   通过公式刚好:5 = (10 - N)/2 +1  这里N为2

参数个数:0,  池化层没有权重,一般是最大权重或者最小权重或者平均权重,正常的都是最大权重,选择最大值。

第五层(全连接层):

输入参数:16x5x5,上一层的输出

输出参数:120,输出一维数组

参数个数:48,120,  由于是全连接层,所以每个点都得计算,输入点数:16x5x5 =400,由于全连接层转为1维,那么每个点都得配置权重,如y=wx+b  这里的x为(16x5x5),有120组wx+b,那么参数个数为:120x(16x5x5+1) = 48120

第六层(全连接层):

输入参数:120

输出参数:84

参数个数:10,164,  有84组wx+b,x为120,所以为,84x(120+1)=10164

第七层(全连接层输出):

输出为10,代表每个数字的概率,这里是越接近0概率越高,如果1的位置为0,那么这张图片识别为1

输入参数:84

输出参数:10

参数个数:850,  有10组wx+b,x为84,所以为,10x(84+1)=850

总结:

        CNN网络的开山之作,很简单的结构,总共就7层,整体的参数个数:59,706  参数接近6万,参数量相对于现在来说是已经很小了,由于之前受计算机性能和数据等影响,也没法发展太大的网络框架。但是此框架给我们开了一个头,而且由于他的简单方便我们学习。

        由于这里是识别数字或者字母,特征形状很简单,所以2个卷积层来获取特征就学习到了,学习边缘和形状,一般来说层数越多学习到的特征越多,比如说颜色纹理这些都可以学习到,但是也不是绝对,后续CNN网络发展可以看到当网络层数达到一定得程度效率和精确度、泛化就会到达峰值了,需要更换新的网络结构,比如残差连接、激活参数等。

        整个过程分为前向传播、计算损失(误差)、反向传播、更新参数

  1.         前向传播:把数据输入网络框架,通过网络计算得到结果
  2.         计算损失:通过损失函数计算真实结果和计算结果的误差值
  3.         反向传播:和前向传播相反,从输出层开始,通过误差反向计算每个权重的梯度
  4.         更新参数:根据反向传播得到的梯度调整网络参数,迭代进行以改善模型性能

        如果不是训练,只是推理的话,那么只要前向传播就行了。

代码:(基于pytyhon的pytorch)

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transformsclass LeNet5(nn.Module):#初始化模型结构def __init__(self):super(LeNet5, self).__init__()self.conv1 = nn.Conv2d(1, 6, kernel_size=5)#卷积层1self.conv2 = nn.Conv2d(6, 16, kernel_size=5)#卷积层3self.fc1   = nn.Linear(16*5*5, 120)#全连接层5self.fc2   = nn.Linear(120, 84)#全连接层6self.fc3   = nn.Linear(84, 10)#全连接层7#前向传播函数 def forward(self, x):x = F.relu(self.conv1(x))#卷积+激活,添加了激活函数,线条才会拐弯x = F.max_pool2d(x, (2, 2))#最大池化x = F.relu(self.conv2(x))x = F.max_pool2d(x, (2, 2))#最大池化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# 初始化网络
model = LeNet5()# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss() #定义了交叉熵损失函数
optimizer = optim.SGD(model.parameters(), lr=0.001) #随机梯度下降(SGD)优化器 学习率为0.001,每次变化0.001# 加载数据集,例如MNIST
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,), (0.5,))])
trainset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)# 训练网络,训练10轮
for epoch in range(10):  # loop over the dataset multiple timesrunning_loss = 0.0for i, data in enumerate(trainloader, 0):inputs, labels = dataoptimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()#反向传播修改权重optimizer.step()running_loss += loss.item()print(f'Epoch {epoch + 1}, Loss: {running_loss / (i + 1)}')print('Finished Training')

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

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

相关文章

人工智能算法工程师(中级)课程15-常见的网络模型及设计原理与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程15-常见的网络模型及设计原理与代码详解。 本文给大家介绍常见的网络模型及其设计原理与代码实现,涵盖了LeNet、AlexNet、VggNet、GoogLeNet、InceptionNet、ResNet、Dense…

MATLAB科研数据可视化教程

原文链接:MATLAB科研数据可视化https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247609462&idx3&snf7043936fc5ee42b833c7c9f3bcd24ba&chksmfa826d91cdf5e4872eb275e5319b66ba6927ea0074fb2293fe1ca47d6aedf38ab91050be484c&token1551213…

SQL面试题练习 —— 统计最大连续登录天数区间

目录 1 题目2 建表语句3 题解 1 题目 2 建表语句 CREATE TABLE IF NOT EXISTS user_login_tb (uid INT,login_date DATE ); insert into user_login_tb(uid, login_date) values( 1, 2022-08-02),(1, 2022-08-03),(2, 2022-08-03),(2, 2022-08-04),(2, 2022-08-05),(2, 2022-08…

6个高效再利用的UI作品集设计模板

UI 作品集是指用户界面设计师的个人作品集。它展示了设计师的设计能力、技巧和风格,也是充分展示他们设计能力的证明。优秀的UI 作品集应具有简洁明了、美观大方、良好的互动体验和明确的目标。本文将从两个方面的介绍 Ui 作品集模板的全部内容:UI 作品集…

【C++11】(lambda)

C11中的lambda与线程。 目录 Lambda:仿函数的缺点:Lambda语法:Lambda使用示例:两数相加:两数交换:解决Goods排序问题: Lambda原理: Lambda: 假设我们有一个商品类&…

ClickHouse集成LDAP实现简单的用户认证

1.这里我的ldap安装的是docker版的 docker安装的化就yum就好了 sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo systemctl start docker 使用下面的命令验证sudo docker run hello-world docker pull osixia/openl…

微信小程序与本地MySQL数据库通信

微信小程序与本地MySQL数据库通信 因为本地MySQL服务器没有域名,也没有进行相应的请求操作封装,因此微信小程序没办法和数据库通信。 但是对于开发人员来说,没有数据库,那还能干撒?虽然我尝试过用json-server&#x…

好用的AI搜索引擎

1. 360AI 搜索 访问 360AI 搜索: https://www.huntagi.com/sites/1706642948656.html 360AI 搜索介绍: 360AI 搜索,新一代智能答案引擎,值得信赖的智能搜索伙伴,为复杂搜索提供专业支持,解锁更相关、更全面的答案。AI…

探索Facebook的最新更新:社交体验的新高度

Facebook作为全球领先的社交媒体平台,一直致力于不断创新和改进,以提供更优质的用户体验。近期,Facebook推出了一系列新的更新,旨在提升用户的社交互动体验和平台功能。本文将详细探讨这些最新更新,分析其对用户和社交…

如何用AI交互数字人一体机,打造政务服务新名片?

如今,将“高效办成一件事”作为优化政务服务、提升行政效能的重要抓手,各地方为了促进政务服务由传统模式向数字化、智能化方向转变,纷纷在政务服务场景融合了AI交互数字人,实现“无人化、智慧化”导办、帮办、代办等模式&#xf…

Apache AGE的MATCH子句

MATCH子句允许您在数据库中指定查询将搜索的模式。这是检索数据以在查询中使用的主要方法。 通常在MATCH子句之后会跟随一个WHERE子句,以添加用户定义的限制条件到匹配的模式中,以操纵返回的数据集。谓词是模式描述的一部分,不应被视为仅在匹…

3D问界—在MAYA中使用Python脚本进行批量轴居中

问题提出:MAYA中如何使用Python脚本 今天不是一篇纯理论,主要讲一下MAYA中如何使用Python脚本,并解决一个实际问题,文章会放上我自己的代码,若感兴趣欢迎尝试,当然,若有问题可以见文章末尾渠道&…

分布式IO系统2通道串口通信模块M602x

现场总线耦合器本身包含一个电源模块,它有 2 个串口通道,通过 Modbus RTU(Master)协议连接外部串行设备,实现耦合器与外部串行设备通信,现以连接设备的示例带大家了解我们钡铼的2 通道串口通信模块 M602x。…

【BUG】已解决:Uncaught SyntaxError: Unexpected token ‘<‘

已解决:Could not install packages due to an EnvironmentError: [Errno 13] Permission denied 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开发者社区主理人 …

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined问题解决

一、系统环境变量中添加tomcatjdk的环境变量声明 1、右击此电脑->属性->高级系统设置 可复制粘贴下面的变量名 CATALINA_HOME 点击path->编辑->新建 可将下面值粘入 %CATALINA_HOME%\bin 2、配置jdk的系统变量 系统变量->新建->如图 可将下面变量名粘入 J…

Flutter热更新技术探索

一,需求背景: APP 发布到市场后,难免会遇到严重的 BUG 阻碍用户使用,因此有在不发布新版本 APP 的情况下使用热更新技术立即修复 BUG 需求。原生 APP(例如:Android & IOS)的热更新需求已经…

LabVIEW 与 PLC 通讯方式

在工业自动化中,LabVIEW 与 PLC(可编程逻辑控制器)的通信至关重要,常见的通信方式包括 OPC、Modbus、EtherNet/IP、Profibus/Profinet 和 Serial(RS232/RS485)。这些通信协议各有特点和应用场景&#xff0c…

@google/model-viewer 导入 改纹理 (http-serve)

导入模型 改纹理 效果图 <template><div><h1>鞋模型</h1><model-viewerstyle"width: 300px; height: 300px"id"my-replace-people"src"/imgApi/Astronaut.glb"auto-rotatecamera-controls></model-viewer>&…

C++STL---priority_queue知识总结及模拟实现

前言 和stack与queue一样&#xff0c;priority_queue也是一种容器适配器。 他的本质其实是堆&#xff0c;作优先级队列的底层需要能够通过随机迭代器访问&#xff0c;所以他的底层是可以由vector和queue实例化&#xff0c;默认情况下priority_queue默认是用vector作为底层实例…

智慧博物馆的“眼睛”:视频智能监控技术守护文物安全与智能化管理

近日&#xff0c;位于四川德阳的三星堆博物馆迎来了参观热潮。据新闻报道&#xff0c;三星堆博物馆的日均参观量达1.5万人次。随着暑假旅游高峰期的到来&#xff0c;博物馆作为重要的文化场所&#xff0c;也迎来了大量游客。博物馆作为文化和历史的重要载体&#xff0c;其安全保…