千家信息网

如何理解Python LeNet网络及pytorch实现

发表于:2025-11-17 作者:千家信息网编辑
千家信息网最后更新 2025年11月17日,如何理解Python LeNet网络及pytorch实现,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.LeNet介绍LeNet神经网
千家信息网最后更新 2025年11月17日如何理解Python LeNet网络及pytorch实现

如何理解Python LeNet网络及pytorch实现,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

1.LeNet介绍

LeNet神经网络由深度学习三巨头之一的Yan LeCun提出,他同时也是卷积神经网络 (CNN,Convolutional Neural Networks)之父。LeNet主要用来进行手写字符的识别与分类,并在美国的银行中投入了使用。LeNet的实现确立了CNN的结构,现在神经网络中的许多内容在LeNet的网络结构中都能看到,例如卷积层,Pooling层,ReLU层。虽然LeNet早在20世纪90年代就已经提出了,但由于当时缺乏大规模的训练数据,计算机硬件的性能也较低,因此LeNet神经网络在处理复杂问题时效果并不理想。虽然LeNet网络结构比较简单,但是刚好适合神经网络的入门学习。

2.LetNet网络模型

LeNet网络模型一般指LeNet-5,相信大家学习这个模型的时候一定都见过这张图片吧

这张图也是原论文中的一张模型图,这样子看可能会觉得有点不习惯,下面这张图是本人在drawio软件上制作的网络模型图,如下:

纠正一下,上图中第二个Conv2d层后面的计算结果应该为10,写成了5

相信学习了卷积神经网络基础的朋友们应该能很清晰的看懂这张图吧,对于右边的计算在图的左上角也给出了公式,上图中每一层的输入形状以及输出形状我都详细的为大家写出来了,对于计算公式和模型大致的结构,看下面这张图也可以(建议对应上下图一起看更容易理解)

LeNet-5网络模型简单的就包含了卷积层,最大池化层,全连接层以及relu,softmax激活函数,模型中的输入图片大小以及每一层的卷积核个数,步长都是模型制定好的,一般不要随意修改,能改的是最后的输出结果,即分类数量(num_classes)。flatten操作也叫扁平化操作,我们都知道输入到全连接层中的是一个个的特征,及一维向量,但是卷积网络特征提取出来的特征矩阵并非一维,要送入全连接层,所以需要flatten操作将它展平成一维。

3.pytorch实现LeNet

python代码如下

from torch import nnimport torchimport torch.nn.functional as F'''    说明:    1.LeNet是5层网络    2.nn.ReLU(inplace=True)  参数为True是为了从上层网络Conv2d中传递下来的tensor直接进行修改,这样能够节省运算内存,不用多存储其他变量    3.本模型的维度注释均省略了N(batch_size)的大小,即input(3, 32, 32)-->input(N, 3, 32, 32)    4.nn.init.xavier_uniform_(m.weight)     用一个均匀分布生成值,填充输入的张量或变量,结果张量中的值采样自U(-a, a),     其中a = gain * sqrt( 2/(fan_in + fan_out))* sqrt(3),     gain是可选的缩放因子,默认为1     'fan_in'保留前向传播时权值方差的量级,'fan_out'保留反向传播时的量级    5.nn.init.constant_(m.bias, 0)      为所有维度tensor填充一个常量0'''class LeNet(nn.Module):    def __init__(self, num_classes=10, init_weights=False):        super(LeNet, self).__init__()        self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=5, stride=1)        self.maxpool1 = nn.MaxPool2d(kernel_size=2, stride=2)        self.relu = nn.ReLU(True)        self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=5, stride=1)        self.maxpool2 = nn.MaxPool2d(kernel_size=2, stride=2)        self.fc1 = nn.Linear(32 * 5 * 5, 120)        self.fc2 = nn.Linear(120, 84)        self.fc3 = nn.Linear(84, num_classes)        if init_weights:            self._initialize_weights()    def forward(self, x):        x = self.conv1(x)  # input(3, 32, 32)  output(16, 28, 28)        x = self.relu(x)  # 激活函数        x = self.maxpool1(x)  # output(16, 14, 14)        x = self.conv2(x)  # output(32, 10, 10)        x = self.relu(x)  # 激活函数        x = self.maxpool2(x)  # output(32, 5, 5)        x = torch.flatten(x, start_dim=1)  # output(32*5*5) N代表batch_size        x = self.fc1(x)  # output(120)        x = self.relu(x)  # 激活函数        x = self.fc2(x)  # output(84)        x = self.relu(x)  # 激活函数        x = self.fc3(x)  # output(num_classes)        return x    def _initialize_weights(self):        for m in self.modules():            if isinstance(m, nn.Conv2d):                nn.init.xavier_uniform_(m.weight)                if m.bias is not None:                    nn.init.constant_(m.bias, 0)            elif isinstance(m, nn.Linear):                nn.init.xavier_uniform_(m.weight)                nn.init.constant_(m.bias, 0)

或者

下面这一种没有自己初始化权重和偏置,就会使用默认的初始化方式

import torch.nn as nnimport torch.nn.functional as Fimport torchclass LeNet(nn.Module):    def __init__(self):        super(LeNet, self).__init__()        self.conv1 = nn.Conv2d(3, 16, 5)        self.pool1 = nn.MaxPool2d(2, 2)        self.conv2 = nn.Conv2d(16, 32, 5)        self.pool2 = nn.MaxPool2d(2, 2)        self.fc1 = nn.Linear(32*5*5, 120)        self.fc2 = nn.Linear(120, 84)        self.fc3 = nn.Linear(84, 10)    def forward(self, x):        x = F.relu(self.conv1(x))   # output(16, 28, 28)        x = self.pool1(x)           # output(16, 14, 14)        x = F.relu(self.conv2(x))   # output(32, 10, 10)        x = self.pool2(x)           # output(32, 5, 5)        x = x.view(x.size(0), -1)      # output(32*5*5)        x = F.relu(self.fc1(x))     # output(120)        x = F.relu(self.fc2(x))     # output(84)        x = self.fc3(x)             # output(10)        return x

nn.Linear就是全连接层,除了最后一个全连接层,其它均需要relu激活,默认无padding操作

nn.Conv2d对应的参数顺序一定要记住:

1.in_channels:输入的通道数或者深度

2.out_channels:输出的通道数或者深度

3.kernel_size:卷积核的大小

4.stride:步长大小,默认1

5.padding:padding的大小,默认0

6.dilation:膨胀大小,默认1,暂时用不到

7.group:分组组数,默认1

8.bias:默认True,布尔值,是否用偏置值

9.padding_mode:默认用0填充

记不住参数顺序也没关系,但需要记住参数名称

看完上述内容,你们掌握如何理解Python LeNet网络及pytorch实现的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

网络 模型 卷积 大小 激活 神经 全连 函数 神经网络 输入 参数 结构 学习 内容 深度 特征 结果 问题 一维 输出 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 组态 数据库数据 winform数据库分析 redhat服务器都有哪些厂商 超级签软件开发公司 cf连接服务器和进入游戏都会卡 数据库字段自动增加的数据类型是 网络安全篮队组建方案 网络安全市场估值 无法和服务器建立安全的连接苹果 怎么样运行cmd数据库 梦想网络安全下载安卓 域服务器怎么委派管理计算机 规划数据库文件 社团网络技术部面试 山西软件开发公司薪资待遇 国铁集团网络安全工作制度 郑州兆通网络技术有限公司 锐思数据库股票回测 国家标准全文数据库收录 保融科技主互联网还是主金融 企业网络安全问题原因 北京服务器维修培训学校云主机 腾讯云原生服务器 wow不同服务器有什么限制 精武镇网络安全课 网络安全法经营许可证 小程序云服务器怎么购买 机关如何防范网络安全风险 龙岗区光纤网络技术开发分类 网络安全钓鱼网站实验
0