卷积神经网络的开端:$LeNet-5$

news/2026/1/18 19:30:55/文章来源:https://www.cnblogs.com/AxonoSensei/p/19498988

卷积神经网络的开端:\(LeNet-5\)

[!NOTE]

LeNet-5神经网络是1998YANN LECUN等人在论文Gradient-Based Learning Applied to Document Recognition中提出的一种颠覆性的算法。

说实在的该方法本来是用来解决手写字母也就是MNIST数据集的使用。

1 背景原理

现在我们需要介绍卷积神经网络,那么就不可以逃开最基本的全连接神经网络了。我想先对全连接神经网络进行介绍,然后再逐步引入卷积神经网络,同时对卷积神经网络和全连接神经网络进行对比。

1.1 全连接神经网络

那么现在就稍微介绍一下全连接神经网络是什么东西,它主要的一些缺陷之类的又是什么东西。

全连接神经网络,主要运用的就是多层感知机的思想。现在我们以某个地区的房价预测为例子进行使用。

假设房价和交通问题、自然环境、文化因素等相关。现在我们令房价为\(y\),交通问题为\(x_1\),自然环境为\(x_2\),文化因素为\(x_3\)。那么现在就可以根据这些输入对房价的信息进行预测,具体公式如下

\[y = \sigma(W_3\times \sigma(W_2 \times \sigma(W_1 \times x1+b)+b)+b)=W^T \times X + B \]

其中\(W\)表示权重矩阵,\(X\)表示的是一组输入参数的合成矩阵,而\(B\)表示的是偏置矩阵的合成。

\[W=[w_1,w_2,w_3];X=[x_1,x_2,x_3];B=[b_1,b_2,b_3] \]

其中\(W\)是需要用网络来学习的参数,我们需要利用一步步的神经网络计算来确定权重\(W\)的具体数据,但是我们又如何确定权重究竟是好是坏呢?这个时候就需要引入一个比较新的东西被人家称做是损失函数:\(LOSS\)

其中最出名的就是均方误差损失函数\(MSE=\frac{1}{2n}\sum_{i=1}^{n}{(\hat{y_i}-y_i)^2}\)

我们需要使用损失函数来定量的确定自己的模型权重训练效果的好坏。

  • 若损失函数的数据小,那么权重训练的效果比较差劲;
  • 若损失函数的数据大,那么权重训练的效果比较的好。

此时我们将这个比较好的损失函数的训练过程称作前向传播

但是前向传播只可以计算出当前权重的好坏情况,如果模型权重坏的话,我们应当进行某些操作来更新这些权重,使其变得更加的好,而这就是反向传播、以及权重更新。

那么我们就要思考一下如何进行权重更新,现在我们用一个非常形象的系统来表示一下,假设房价和房子面积的大小呈一一对应的相关性质,如下图所示。

红点是我们需要的目标,而我们现在在函数上的某一点,那么如何到红点的效率最高呢?

显然是沿着梯度的方向最快呀!

image-20260118183435449

我们用一个形象的比喻来说一下这个过程:模型做完一次预测,发现自己考砸了(损失很大),然后它就拿着试卷(损失值),从最后一道题(输出层)开始,一道题一道题地往前检查(反向计算),看看是哪几步、哪些参数(权重和偏置)导致了错误。

而这个检查的过程就是上面说到的沿着壁逐渐接近下面的红点过程。

现在总结一下最基本的神经网络的整体过程:

  1. 前向传播:通过现在的初始权重,计算当前的损失大小;
  2. 反向传播:计算各个位置的梯度大小,确定权重更新的方向和大小;
  3. 权重更新:利用各种算法进行权重的更新。

但是这个玩意儿有很大的问题,那就是一旦层数一朵,那他的计算量会多到爆炸,这个时候卷积神经网络便孕育而生。

1.2 卷积神经网络

\(ok\)现在我们稍微过了一下神经网络的开山鼻祖-全连接神经网络了。那么卷积神经网络又是什么东西呢,它究竟是个啥,有什么作用呢?我们就用一些文字来深入浅出的讲解一下。

卷积神经网络最先提出的算法就是LeNet-5他是在MNIST数据集上面使用的,这里我们也用这个数据集来做举例。

我们回想一下之前如果相对一张图片做分类(也可以说是做回归)应该怎么做呢?我们之前主要使用的就是Softmax回归模型和多层感知机模型运用在回归之上的呀!也就是上面讲的全连接神经网络。

为了能够比较和谐的适应softmax回归和多层感知机我们首先需要将图片进行一维展开。对于该数据集而言:就是将每个大小为28×28的图像直接展平成为一个784维度的固定长度的一维向量,然后用全连接层对其进行处理。

大家有没有发现这个方法的两个痛点:

  1. 运算量超级的大,参数超级的多;
  2. 好像缺少了空间上各个像素之间的关系。

那么对于卷积层的方式就是将上面的两个痛点进行改进。模型更简洁、所需的参数更少。

理解一下什么是卷积:这里用人家的一张图片来解释。

简单的说就是将卷积核中的元素与原图片中的元素对应相乘后相加。

总体来看LeNet主要是由两个部分组成的:

  • 卷积编码器:用来提取图像特征;
  • 全连接层:用来做最后的分类操作。

image-20260118185735411

image-20260118185747907

1.2.1 感受野

手写我想需要介绍一下什么是感受野:

感受野指的是卷积神经网络每一层输出的特征图(feature map)上每个像素点映射回输入图像上的区域大小。

神经元感受野的范围越大表示其能接触到的原始图像范围就越大,也意味着它能学习更为全局,语义层次更高的特征信息;
相反,范围越小则表示其所包含的特征越趋向局部和细节。
因此感受野的范围可以用来大致判断每一层的抽象层次。

并且我们可以很明显地知道网络越深,神经元的感受野越大。由此可知,深度卷积神经网络中靠前的层感受野较小,提取到的是图像的纹理、边缘等局部的、通用的特征;靠后的层由于感受野较大,提取到的是图像更深层次、更具象的特征。因此在迁移学习中常常会将靠前的层的参数冻结,来节省训练的时间和算力消耗。

1.2.2 卷积层

卷积层就是之前的前向传播,我认为是一个东西,他的目的是抓取图片中的局部特征。

举个例子吧,如果我们需要识别图片中是否存在一只猫,那我们肯定不可以完全凭感觉吧这和瞎子有啥区别对吧,我们要做的就是根据图片中猫的特征(比如:耳朵、鼻子、嘴巴、尾巴等等)来判定图片中的这个东西是否是猫。而卷积层的每一个卷积核都可以看成是一种局部特征的探测器

有可能一号卷积核是探测猫耳朵的,二号是探测猫嘴巴的……。以此类推,那么一次卷积就会生成一张张特征图片,多个卷积核就可以同时提取多种基础特征了。

欸有没有发现我们只需要一张卷积核大小的权重数量就可以识别一个特征了,而不是通过一整张图片大小的权重数量来识别某一个特征,我们只需要让卷积核在图片上滑动即可,这个就解决了第一个问题计算量过大,数据量过大的问题了!

1.2.3 池化层

对于这个层我认为他的作用很简单就是为了降低计算量的一个工具,对特征图进行浓缩。他将一个小区域里面的值进行处理,保留成一个数据:大大降低了计算量同时让网络不再拘泥于特征的精确位置,只要在大概区域中有特征即可,让神经网络拥有了平移不变性,大大提高了干扰性。

简单的说就是做了下面三个事情:

  • 解决参数爆炸:卷积核局部连接权值共享,参数比全连接少太多了。
  • 保留空间结构:卷积操作天生就处理二维邻域信息,保留了像素间的空间关系。
  • 获得平移不变性:池化操作让网络不关心特征的具体位置,更关注是否存在。

2 LeNet-5网络结构

最经典的LeNet-5就行是一个三明治,一层卷积一层池化,这个样子慢慢的叠加直至找到了比较好的特征图之后,接上全连接层实现回归问题的实现。

那么现在就给出具体的网络结构表格:

  1. 输入:一张28x28x1的手写数字图片;
  2. 第一层-卷积层:用6个不同的5x5卷积核。每个卷积核就像是探测器一样在图片上滑动一遍,就得到一张特征图。所以这一层输出6张28x28的特征图;
  3. 第二层-池化层:对每张特征图做浓缩。把2x2区域里的四个数取平均,变成一个数。这样6张28x28的图就变成了6张14x14的图;
  4. 第三层-卷积层:再用16个5x5的卷积核,在6张14x14的图上进一步探查。这时的卷积核会同时看过6张图,组合出更复杂的特征。输出16张10x10的特征图;
  5. 第四层-池化层:再来一次2x2平均池化,得到16张5x5的特征图;
  6. 第五层-全连接层:把16张5x5的图展开成一个400维的向量,然后通过全连接层做分类,最终通过softmax函数输出0-9的数字概率。
  7. 输出:一组10维向量。

image-20260118192408846


3 实验代码

import torch 
import torch.nn as nn
import matplotlib.pyplot as plt
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import os
import numpy as np
import gzip
import sysdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")
class LeNet5(nn.Module):def __init__(self , num_classes = 10):"""LeNet-5 网络结构的实现Args:num_classes (int): 分类的类别数,默认值为10"""super(LeNet5 , self).__init__()self.conv1 = nn.Conv2d(3 , 6 , kernel_size=5 ,stride = 1 , padding = 0)# 卷积层1self.pool1 = nn.AvgPool2d(kernel_size = 2 , stride=2)# 平均池化层1self.conv2 = nn.Conv2d(6, 16 ,kernel_size=5 , stride=1 , padding=0)# 卷积层2self.pool2 = nn.AvgPool2d(kernel_size=2 , stride=2)# 平均池化层2self.fc1 = nn.Linear(16*5*5 , 120)# 全连接层1self.fc2 = nn.Linear(120 , 84)# 全连接层2self.fc3 = nn.Linear(84 , num_classes)# 全连接层3self.relu = nn.ReLU()# 激活函数def forward(self , x):x = self.conv1(x)x = self.relu(x)x = self.pool1(x)x = self.conv2(x)x = self.relu(x)x = self.pool2(x)x = x.view(-1 , 16*5*5)# 展平操作,变成全连接层x = self.fc1(x)x = self.relu(x)x = self.fc2(x)x = self.relu(x)x = self.fc3(x)return x

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

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

相关文章

【雷达相控阵】基于matlab毫米波相控阵中空间Zadoff-Chu调制快速波束对准【含Matlab源码 14977期】

💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞&#x1f49…

【心电信号ECG】SVM心电图心搏检测与分类【含Matlab源码 14982期】复现含文献

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab领域博客之家💞&…

【心电信号ECG】基于matlab SVM心电图心搏检测与分类【含Matlab源码 14982期】复现含文献

💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞&#x1f49…

【心血管疾病】心脏病数据集Kaggle医学特征二元分类预测心血管疾病【含Matlab源码 14984期】含报告

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab领域博客之家💞&…

社交网络数据科学:完整项目实战指南

社交网络数据科学:完整项目实战指南 引言 痛点引入:你可能遇到的「社交网络分析困境」 作为数据科学爱好者,你是否曾有过这样的困惑: 想学社交网络分析,但看着「图论」「中心性」「社区发现」等术语望而却步&#…

Hive与DynamoDB集成:云原生大数据方案

Hive与DynamoDB集成:云原生大数据方案 关键词:Hive、DynamoDB、云原生、大数据集成、数据处理 摘要:本文聚焦于Hive与DynamoDB的集成,旨在探讨云原生环境下的大数据解决方案。首先介绍了Hive和DynamoDB的背景信息,包括它们的特点和适用场景。接着详细阐述了两者集成的核心…

【创新未发表】鸡群算法CSO和自适应双种群协同鸡群算法ADPCCSO无人机避障三维航迹规划【含Matlab源码 14980期】

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab领域博客之家💞&…

Flutter × OpenHarmony 跨端汇率转换应用:货币数据模型与页面实现

文章目录Flutter OpenHarmony 跨端汇率转换应用:货币数据模型与页面实现前言背景Flutter OpenHarmony 跨端开发介绍开发核心代码代码解析心得总结Flutter OpenHarmony 跨端汇率转换应用:货币数据模型与页面实现 前言 在全球化经济背景下,…

【无人机三维路径规划】鸡群算法CSO和自适应双种群协同鸡群算法ADPCCSO复杂山地模型下无人机路径规划【含Matlab源码 14981期】

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab领域博客之家💞&…

【雷达跟踪】面向目标跟踪的雷达干扰方法:提升航空器战场生存力的关键技术【含Matlab源码 14983期】复现含文献

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab领域博客之家💞&…

数电实验7【计数器和跑马灯设计实验报告】数字电路 逻辑与计算机设计 logisim

上一篇:数电实验6【寄存器及手动加法设计实验报告】数字电路 逻辑与计算机设计 logisim 目录 实验资料 实验报告 一、实验目的 二、实验环境 三、实验内容 四、实验步骤 五、实验心得 实验资料 点击下载 实验报告 一、实验目的 理解时钟的作用 能够设…

人工智能之核心基础 机器学习 第十七章 Scikit-learn工具全解析

人工智能之核心基础 机器学习 第十七章 Scikit-learn工具全解析 文章目录人工智能之核心基础 机器学习17.1 Scikit-learn 简介与安装📌 是什么?✅ 核心优势🔧 安装(推荐使用虚拟环境)17.2 Scikit-learn 核心 API 使用…

完整教程:C#用API添另静态路由表

完整教程:C#用API添另静态路由表2026-01-18 19:20 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !impor…

别瞎忙了,你的力气其实很贵

人生下半场:把力气,用在真正重要的地方卸下行囊,看见远方深夜那个突然冒出来的念头嘿,老朋友,咱们先不聊大道理,聊个具体的场景。你有没有过这种时刻? 周五晚上十点多,终于关上电脑&…

消除乱码-UTF8字符转换

编码格式是多样的,既繁华又让人迷惑。针对IUP和GTK而言,正确显示汉字的方法:1. IUP,设置其本身使用 UTF8,然后外部调用时给它UTF8字符;2. GTK,内部使用的是UTF8,直接送UTF8字符给它即…

基于springboot的甘肃非物质文化网站的设计与实现项目源码 java毕设 免费分享

全套项目网盘打包下载:https://pan.quark.cn/s/5ddf68c8d7db项目清单:该系统采用B/S架构,基于SSM框架和MySQL数据库开发,主要包含前端用户系统和后台管理系统两大模块。一、 前台用户系统功能(面向普通访客/会员&#…

使用Dockerfile创建一个hyperf容器做为开发环境

使用Dockerfile创建一个hyperf容器做为开发环境# Default Dockerfile # # @link https://www.hyperf.io # @document https://hyperf.wiki # @contact group@hyperf.io # @license https://github.com/hyperf/hy…

COE_Main()代码注释

///////////////////////////////////////////////////////////////////////////////////////// /*** \brief CoE (CANopen over EtherCAT) 服务主处理函数。* \details 此函数在后台被调用,用于处理挂起的SDO(服务数据对象)读写请求。* …

基于springboot的网上购物商城系统的设计与实现项目源码 java毕设 免费分享

全套项目网盘打包下载:https://pan.quark.cn/s/73b8653a9c85项目清单:本系统是一个包含前台商城和后台管理的多角色电商平台,主要面向用户、商家和管理员三类角色。一、 前台商城功能模块(面向普通用户)1. 公共访问功能…

我读Population Based Training of Neural Networks

原文点此 1.intro PBT是一种简单的异步优化算法,它能够有效利用固定的计算预算,通过联合优化一组模型和其超参数以最大化性能。 2.methodology 目标是优化模型fff的参数θ\thetaθ以最大化目标函数Q^\hat {\mathcal{Q}}Q^​, 实际性能指标Q\mathcal{…