LeNet5 神经网络的参数解析和图片尺寸解析

news2025/4/29 5:34:40

1.LeNet-5 神经网络

以下是针对 LeNet-5 神经网络的详细参数解析和图片尺寸变化分析,和原始论文设计,通过分步计算说明各层的张量变换过程。

经典的 LeNet-5架构简化版(原始论文输入为 32x32,MNIST 常用 28x28 需调整)。完整结构如下:

  • 网络结构
    输入 → Conv1 → 激活/池化 → Conv2 → 激活/池化 → 展平 → FC1 → FC2 → FC3 → 输出

  • 适用场景
    经典的小型 CNN,适合处理低分辨率图像分类任务(如 MNIST、CIFAR-10)。

class LeNet5(nn.Module):
    def __init__(self):
        super(LeNet5, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, 5)      # C1: 输入1通道,输出6通道,5x5卷积
        self.pool1 = nn.AvgPool2d(2, 2)       # S2: 2x2平均池化
        self.conv2 = nn.Conv2d(6, 16, 5)     # C3: 输入6,输出16,5x5卷积
        self.pool2 = nn.AvgPool2d(2, 2)       # S4: 2x2平均池化
        self.fc1 = nn.Linear(16*5*5, 120)    # C5: 全连接层
        self.fc2 = nn.Linear(120, 84)        # F6: 全连接层
        self.fc3 = nn.Linear(84, 10)         # 输出层
    def forward(self, x):
        x = F.relu(self.conv1(x))  # 卷积 + ReLU 激活
        x = F.max_pool2d(x, 2)      # 2x2 最大池化
        x = F.relu(self.conv2(x))
        x = F.max_pool2d(x, 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

1.2. 定义卷积层

定义
输入通道是指输入数据中独立的“特征平面”数量。对于图像数据,通常对应颜色通道或上一层的特征图数量。

self.conv1 = nn.Conv2d(1, 6, 5)    # 第一层卷积
self.conv2 = nn.Conv2d(6, 16, 5)   # 第二层卷积


nn.Conv2d 参数说明

conv1:
输入通道数 1(适用于单通道灰度图,如 MNIST)。
输出通道数 6(即 6 个卷积核,提取 6 种特征)。
卷积核大小 5x5。

conv2:
输入通道数 6(与 conv1 的输出一致)。
输出通道数 16(更深层的特征映射)。
卷积核大小 5x5。

作用
通过卷积操作提取图像的空间特征(如边缘、纹理等),通道数的增加意味着学习更复杂的特征组合。

每个输出通道由一组卷积核生成:
如果输出通道数为 6,则会有 6 个不同的卷积核(每个核的尺寸为 5x5,在单输入通道下),分别提取不同的特征。

输出通道的维度:
输出数据的形状为 (batch_size, output_channels, height, width)。

例如:
nn.Conv2d(3, 16, 5)  # 输入通道=3(RGB),输出通道=16
该层会使用 16 个卷积核,每个核的尺寸为 5x5x3(因为输入有 3 通道)。

每个核在输入数据上滑动计算,生成 1 个输出通道的特征图,最终得到 16 个特征图。

 1.3定义全连接层


self.fc1 = nn.Linear(16*5*5, 120)  # 第一个全连接层
self.fc2 = nn.Linear(120, 84)      # 第二个全连接层
self.fc3 = nn.Linear(84, 10)       # 输出层

nn.Linear 参数说明

fc1:
输入维度 16*5*5(假设卷积后特征图尺寸为 5x5,共 16 个通道,展平后为 400 维)。
输出维度 120(隐藏层神经元数量)。

fc2:
输入维度 120,输出维度 84(进一步压缩特征)。

fc3:
输入维度 84,输出维度 10(对应 10 个分类类别,如数字 0~9)。

作用
将卷积层提取的二维特征展平为一维向量,通过全连接层进行非线性变换,最终映射到分类结果。

2. 参数解析(以输入 32x32 为例)

(1) 卷积层参数计算

  • 公式
    参数量 = (kernel_height × kernel_width × input_channels + 1) ×output_channels
    +1 为偏置项)

层名参数定义参数量计算结果
C1nn.Conv2d(1, 6, 5)(5×5×1 + 1)×6156
C3nn.Conv2d(6, 16, 5)(5×5×6 + 1)×162416

(2) 全连接层参数计算

  • 公式
    参数量 = (input_features + 1) × output_features

层名参数定义参数量计算结果
C5nn.Linear(16*5*5, 120)(400 + 1)×12048120
F6nn.Linear(120, 84)(120 + 1)×8410164
输出nn.Linear(84, 10)(84 + 1)×10850

总参数量156 + 2416 + 48120 + 10164 + 850 = 61,706

3. 图片尺寸解析(输入 32x32

(1) 尺寸变化公式

  • 卷积层
    H_out = floor((H_in + 2×padding - kernel_size) / stride + 1)
    (默认 stride=1padding=0

  • 池化层
    H_out = floor((H_in - kernel_size) / stride + 1)
    (通常 stride=kernel_size

(2) 逐层尺寸变化

层名操作类型参数输入尺寸输出尺寸计算结果
输入--1×32×32-1×32×32
C1卷积kernel=5, stride=11×32×32(32 - 5)/1 + 1 = 286×28×28
S2平均池化kernel=2, stride=26×28×28(28 - 2)/2 + 1 = 146×14×14
C3卷积kernel=5, stride=16×14×14(14 - 5)/1 + 1 = 1016×10×10
S4平均池化kernel=2, stride=216×10×10(10 - 2)/2 + 1 = 516×5×5
C5展平+全连接-16×5×5展平为 400 维向量120
F6全连接-120-84
输出全连接-84-10

(3) 关键问题解答

Q1: 为什么全连接层 fc1 的输入是 16*5*5
  • 经过两次卷积和池化后,特征图尺寸从 32x32 → 28x28 → 14x14 → 10x10 → 5x5且最后一层有 16 个通道,因此展平后的维度为 16×5×5=400

Q2: 如果输入是 28x28(如 MNIST),尺寸会如何变化?
  • 调整方式
    修改第一层卷积的 padding=2(在四周补零),使输出尺寸满足 (28+4-5)/1 +1=28(保持尺寸不变),后续计算与原始 LeNet-5 一致。

    self.conv1 = nn.Conv2d(1, 6, 5, padding=2) # 保持28x28

    Q3: 参数量主要集中在哪部分?

  • 全连接层 C5 占总数 78% (48120/61706),这是 LeNet-5 的设计瓶颈。现代 CNN 通常用全局平均池化(GAP)替代全连接层以减少参数。

5. 完整尺寸变换流程图(输入 32x32

输入: 1×32×32 
  ↓ [C1] Conv2d(1,6,5)
6×28×28 
  ↓ [S2] AvgPool2d(2,2)
6×14×14 
  ↓ [C3] Conv2d(6,16,5)
16×10×10 
  ↓ [S4] AvgPool2d(2,2)
16×5×5 
  ↓ 展平
400 
  ↓ [C5] Linear(400,120)
120 
  ↓ [F6] Linear(120,84)
84 
  ↓ 输出
10

 使用下面代码,可以看到具体参数量:

# 遍历模型的所有子模块
for name, param in model.named_parameters():
    if param.requires_grad:
        print(f"Layer: {name}")
        if 'weight' in name:
            print(f"Weights:{param.data.shape}")
        if 'bias' in name:
            print(f"Bias:{param.data.shape}\n")

 输出:

Layer: feature_extractor.0.weight
Weights:torch.Size([6, 1, 5, 5])
Layer: feature_extractor.0.bias
Bias:torch.Size([6])

Layer: feature_extractor.2.weight
Weights:torch.Size([16, 6, 5, 5])
Layer: feature_extractor.2.bias
Bias:torch.Size([16])

Layer: classifier.1.weight
Weights:torch.Size([120, 400])
Layer: classifier.1.bias
Bias:torch.Size([120])

Layer: classifier.2.weight
Weights:torch.Size([84, 120])
Layer: classifier.2.bias
Bias:torch.Size([84])

Layer: classifier.3.weight
Weights:torch.Size([10, 84])
Layer: classifier.3.bias
Bias:torch.Size([10])

   写完文章,疑问终于搞明白了。大家也可以参考下面这个连接。

   https://blog.csdn.net/lihuayong/article/details/145671336?fromshare=blogdetail&sharetype=blogdetail&sharerId=145671336&sharerefer=PC&sharesource=lihuayong&sharefrom=from_link

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

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

相关文章

Axure大屏可视化模板:多领域数据决策的新引擎

在数据驱动决策的时代,Axure大屏可视化模板凭借交互性与可定制性,成为农业、园区管理、智慧城市、企业及医疗领域的创新工具,助力高效数据展示与智能决策。 核心应用场景 1. 农业精细化:实时监控土壤湿度、作物生长曲线&#x…

代码随想录算法训练营第60期第十七天打卡

今天我们继续进入二叉树的下一个章节,今天的内容我在写今天的博客前大致看了一下部分题目难度不算大,那我们就进入今天的题目。 第一题对应力扣编号为654的题目最大二叉树 这道题目的坑相当多,我第一次题目没有看明白就是我不知道到底是如何…

SOC估算:开路电压修正的安时积分法

SOC估算:开路电压修正的安时积分法 基本概念 开路电压修正的安时积分法是一种结合了两种SOC估算方法的混合技术: 安时积分法(库仑计数法) - 通过电流积分计算SOC变化 开路电压法 - 通过电池电压与SOC的关系曲线进行校准 方法原…

使用 SSE + WebFlux 推送日志信息到前端

为什么使用 SSE 而不使用 WebSocket, 请看 SEE 对比 Websocket 的优缺点。 特性SSEWebSocket通信方向单向(服务器→客户端)双向(全双工)协议基于 HTTP独立协议(需 ws:// 前缀)兼容性现代浏览器&#xff08…

二叉树的遍历(广度优先搜索)

二叉树的第二种遍历方式,层序遍历,本质是运用队列对二叉树进行搜索。 层序遍历是指将二叉树的每一层按顺序遍历,通过队列实现就是先将根节点push入队,统计此时的队列中的元素数量size,将size元素全部pop出去&#xff0…

2025年计算机视觉与智能通信国际会议(ICCVIC 2025)

2025 International Conference on Computer Vision and Intelligent Communication 一、大会信息 会议简称:ICCVIC 2025 大会地点:中国杭州 收录检索:提交Ei Compendex,CPCI,CNKI,Google Scholar等 二、会议简介 2025年计算机视觉与智能通…

手工收集统计信息

有时想对某些表收集统计信息 CREATE OR REPLACE PROCEDURE GATHER_STATS ASDECLAREV_SQL1 VARCHAR(1000);--表游标CURSOR C1 ISSELECT (SELECT USER) AS TABLE_OWNER,TABLE_NAMEFROM USER_TABLES; --可以在这里加过滤条件--索引游标CURSOR C2 ISSELECT TABLE_OWNER,INDEX_NAM…

flume整合Kafka和spark-streaming核心编程

flume整合Kafka 需求1:利用flume监控某目录中新生成的文件,将监控到的变更数据发送给kafka,kafka将收到的数据打印到控制台: 1.查看topic 2.编辑flume-Kafka.conf,并启动flume 3.启动Kafka消费者 4.新增测试数据 5.查…

EDI 如何与 ERP,CRM,WMS等系统集成

在数字化浪潮下,与制造供应链相关产业正加速向智能化供应链转型。传统人工处理订单、库存和物流的方式已难以满足下单客户对响应速度和数据准确性的严苛要求。EDI技术作为企业间数据交换的核心枢纽,其与ERP、CRM、WMS等业务系统的深度集成,成…

面试踩过的坑

1、 “”和equals 的区别 “”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重…

多物理场耦合低温等离子体装置求解器PASSKEy2

文章目录 PASSKEy2简介PASSKEY2计算流程PASSKEy2 中求解的物理方程电路模型等离子体模型燃烧模型 PASSKEy2的使用 PASSKEy2简介 PASSKEy2 是在 PASSKEy1 的基础上重新编写的等离子体数值模拟程序。 相较于 PASSKEy1, PASSKEy2 在具备解决低温等离子体模拟问题的能力…

视频噪点多,如何去除画面噪点?

你是否遇到过这样的困扰?辛辛苦苦拍摄的视频,导出后却满屏 “雪花”,夜景变 “噪点盛宴”,低光环境秒变 “马赛克现场”? 无论是日常拍摄的vlog、珍贵的家庭录像,还是专业制作的影视作品,噪点问…

09前端项目----分页功能

分页功能 分页器的优点实现分页功能自定义分页器先实现静态分页器调试分页器动态数据/交互 Element UI组件 分页器的优点 电商平台同时展示的数据很多,所以采用分页功能实现分页功能 Element UI已经有封装好的组件,但是也要掌握原理,以及自定…

第十二届蓝桥杯 2021 C/C++组 直线

目录 题目: 题目描述: 题目链接: 思路: 核心思路: 两点确定一条直线: 思路详解: 代码: 第一种方式代码详解: 第二种方式代码详解: 题目:…

《Piper》皮克斯技术解析:RIS系统与云渲染如何创造奥斯卡级动画短片

本文由专业专栏作家 Mike Seymour 撰写,内容包含非常有价值的行业资讯。 译者注 《Piper》是皮克斯动画工作室的一部技术突破性的短片,讲述了一只小鸟在海滩上寻找食物并面对自然挑战的故事。它不仅凭借其精美的视觉效果和细腻的情感表达赢得了2017年奥…

Java在excel中导出动态曲线图DEMO

1、环境 JDK8 POI 5.2.3 Springboot2.7 2、DEMO pom <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency><dependency><groupId>commons…

Kotlin Multiplatform--02:项目结构进阶

Kotlin Multiplatform--02&#xff1a;项目结构进阶 引言正文 引言 在上一章中&#xff0c;我们对 Kotlin Multiplatform 项目有了基本的了解&#xff0c;已经可以进行开发了。但我们只是使用了系统默认的项目结构。本章介绍了如何进行更复杂的项目结构管理。 正文 在上一章中&…

代码随想录算法训练营第五十八天 | 1.拓扑排序精讲 2.dijkstra(朴素版)精讲 卡码网117.网站构建 卡码网47.参加科学大会

1.拓扑排序精讲 题目链接&#xff1a;117. 软件构建 文章讲解&#xff1a;代码随想录 思路&#xff1a; 把有向无环图进行线性排序的算法都可以叫做拓扑排序。 实现拓扑排序的算法有两种&#xff1a;卡恩算法&#xff08;BFS&#xff09;和DFS&#xff0c;以下BFS的实现思…

linux ptrace 图文详解(七) gdb、strace跟踪系统调用

目录 一、gdb/strace 跟踪程序系统调用 二、实现原理 三、代码实现 四、总结 &#xff08;代码&#xff1a;linux 6.3.1&#xff0c;架构&#xff1a;arm64&#xff09; One look is worth a thousand words. —— Tess Flanders 相关链接&#xff1a; linux ptrace 图…

【前端】ES6 引入的异步编程解决方案Promise 详解

Promise 详解 1. 基本概念 定义&#xff1a;Promise 是 ES6 引入的异步编程解决方案&#xff0c;表示一个异步操作的最终完成&#xff08;或失败&#xff09;及其结果值。核心作用&#xff1a;替代回调函数&#xff0c;解决“回调地狱”问题&#xff0c;提供更清晰的异步流程控…