Pytorch搭建LeNet5网络

article/2025/7/3 14:36:37

本讲目标:
  介绍Pytorch搭建LeNet5网络的流程。

Pytorch八股法搭建LeNet5网络

  • 1.LeNet5网络介绍
  • 2.Pytorch搭建LeNet5网络
    • 2.1搭建LeNet网络
    • 2.2测试LeNet网络输出
    • 2.3下载数据集
    • 2.4加载并配置网络
    • 2.5训练并保存网络
    • 2.6测试图片

1.LeNet5网络介绍

  借鉴点:共享卷积核,减少网络参数(通过共享卷积参数,避免了像全连接层那样存在大量参数)。

  LeNet由Yann LeCun于1998年提出,是卷积网络的开篇之作。LeNet-5提出以后,卷积神经网络成功的被商用,广泛的应用在邮政编码、支票号码识别等相关任务中。本节用LeNet网络实现Cifar10数据集的识别任务。

  在统计卷积神经网络的层数时,一般只统计卷积计算层和全连接层,其余操作可以认为是卷积层的附属。
  LeNet共5层网络(如下图),两层卷积层(C1、C2,前面两个卷积层,我们定义卷积层为包含了convbatch normalizationactivationpooldropout等层的单元,这五部分不一定全部具备)和三层全连接层(D1、D2、D3,最后三个Dense层)。
在这里插入图片描述

  卷积就是特征提取器:CBAPB

Conv2D、 BatchNormalization、 Activation、 Pooling、 Dropout

  特征提取器(卷积层):
C1:
  C(核k:6x5x5,步长s:1,填充p:valid)
  B(None)
  A(sigmoid)
  P(max,核k:2x2,步长s:2,填充p:valid)
  D(None)
C2:
  C(核k:16x5x5,步长s:1,填充k:valid)
  B(None)
  A(sigmoid)
  P(max,核k:2x2,步长s:2,填充p:valid)
  D(None)
分类器(全连接层):
D1:
  Dense(神经元:120,激活:sigmoid)
D2:
  Dense(神经元: 84,激活:sigmoid)
D3:
  Dense(神经元: 10,激活:softmax)

2.Pytorch搭建LeNet5网络

2.1搭建LeNet网络

搭建网络在model.py文件中。

import torch
import torch.nn as nn
import torch.nn.functional as Fclass LeNet(nn.Module):def __init__(self):super(LeNet,self).__init__()# N=(W-F+2P)/S+1self.conv1=nn.Conv2d(in_channels=3,out_channels=16,kernel_size=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)) # (3,32,32) -> (16,28,28)x=self.pool1(x)         # (16,28,28) -> (16,14,14)x=F.relu(self.conv2(x)) # (16,14,14) -> (32,10,10)x=self.pool2(x)         # (32,10,10) -> (32,5,5)x=x.view(-1,32*5*5)     # (32,5,5) -> 35*5*5x=F.relu((self.fc1(x))) # 120x=F.relu((self.fc2(x))) # 84x=self.fc3(x)           # 10return x

2.2测试LeNet网络输出

  我们输入的数据是一个32x32大小的3通道图像(3,32,32):input(3,32,32)->C1(16,28,28)->P1(16,14,14)->C2(32,10,10)->P2(32,5,5)->reshape(1,3255)->fc1(120)->fc2(80)->fc3(10)->output
测试网络如下:生成一个[1,3,32,32]大小的张量,其中1为batch_size,3为通道数,32为图像尺寸。观察输出是否为[1,10]。

input=torch.rand([1,3,32,32])
model=LeNet()
output=model(input)
print(model)
print(output.shape)

输出结果如下:

LeNet((conv1): Conv2d(3, 16, kernel_size=(5, 5), stride=(1, 1))(pool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(conv2): Conv2d(16, 32, kernel_size=(5, 5), stride=(1, 1))(pool2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(fc1): Linear(in_features=800, out_features=120, bias=True)(fc2): Linear(in_features=120, out_features=84, bias=True)(fc3): Linear(in_features=84, out_features=10, bias=True)
)
torch.Size([1, 10])

2.3下载数据集

下载数据集在train.py文件中。

import torch.optim as optim
import torch.utils.data
import torchvision.datasets
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np
import  torch.nn as nnfrom model import  LeNettransform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,0.5,0.5,),(0.5,0.5,0.5))]
)#50000张训练图片
trainset=torchvision.datasets.CIFAR10(root='./data',train=True,download=True,transform=transform)trainloader=torch.utils.data.DataLoader(trainset,batch_size=36,shuffle=True,num_workers=0)#10000张训练图片
testset=torchvision.datasets.CIFAR10(root='./data',train=False,download=True,transform=transform)testloader=torch.utils.data.DataLoader(testset,batch_size=10000,shuffle=False,num_workers=0)
test_data_iter=iter(testloader)
test_image,test_label=test_data_iter.next()

2.4加载并配置网络

仍然在train.py文件中。

net=LeNet()
loss_function=nn.CrossEntropyLoss()
optimizer=optim.Adam(net.parameters(),lr=0.001)

2.5训练并保存网络

仍然在train.py文件中。
  总共训练5个epoch,之前将batch_size设置为32,训练过程中,每100次batch_size,就打印以此在testloader上的损失。最后保存训练好的模型。

for epoch in range(5):running_loss=0.0for step,data in enumerate(trainloader,start=0):inputs,labels=dataoptimizer.zero_grad()outputs=net(inputs)loss=loss_function(outputs,labels)loss.backward()optimizer.step()running_loss+=loss.item()if step % 100==99:with torch.no_grad():outputs=net(test_image)predict_y=torch.max(outputs,dim=1)[1]accuracy=torch.eq(predict_y,test_label).sum().item()/test_label.size(0)print('[%d,%5d train_loss:%.3f test_accuracy:%.3f'%(epoch+1,step+1,running_loss/500,accuracy))running_loss=0.0
print('Finish Training')save_path= 'LeNet.pth'
torch.save(net.state_dict(),save_path)

  最后一次epoch的打印信息如下,可以观察到识别精度已经达到了65.8%,对于一个古老的网络,这个精度已经是非常高了。

[5,  100 train_loss:0.163 test_accuracy:0.649
[5,  200 train_loss:0.171 test_accuracy:0.658
[5,  300 train_loss:0.172 test_accuracy:0.658
[5,  400 train_loss:0.173 test_accuracy:0.654
[5,  500 train_loss:0.170 test_accuracy:0.647
[5,  600 train_loss:0.175 test_accuracy:0.655
[5,  700 train_loss:0.176 test_accuracy:0.668
[5,  800 train_loss:0.172 test_accuracy:0.658
[5,  900 train_loss:0.168 test_accuracy:0.640
[5, 1000 train_loss:0.173 test_accuracy:0.658
[5, 1100 train_loss:0.173 test_accuracy:0.643
[5, 1200 train_loss:0.169 test_accuracy:0.661
[5, 1300 train_loss:0.167 test_accuracy:0.658
Finish Training

2.6测试图片

测试图片程序在predict.py文件中。
在这里插入图片描述

import torch
import torchvision.transforms as transforms
from PIL import  Image
from  model import  LeNettransform=transforms.Compose([transforms.Resize((32,32)),transforms.ToTensor(),transforms.Normalize((0.5,0.5,0.5,),(0.5,0.5,0.5))]
)classes=('plane','car','bird','cat','deer','dog','frog','horse','ship','truck')net = LeNet()
net.load_state_dict(torch.load('LeNet.pth'))
im=Image.open('1.jpg')
im=transform(im)
im=torch.unsqueeze(im,dim=0)
with torch.no_grad():outputs=net(im)predict=torch.softmax(outputs,dim=1)predict_class=torch.max(outputs,dim=1)[1].numpy()
#打印类别名称和准确率
print(classes[predict_class[0]],predict[0][predict_class[0]].numpy())

输出结果:

plane 0.8187075

http://chatgpt.dhexx.cn/article/4N9qyhCR.shtml

相关文章

HLS:卷积神经网络LeNet5的实现与测试

目录 一、引言二、LeNet5的学习三、数学知识补充四、HLS代码设计五、仿真综合与优化六、Zynq平台搭建测试七、一些注意点八、文献时间线与后续工作 一、引言 1、开发环境。 Windows10、Vivado2018.2、Vivado HLS与Xilinx SDK。 2、LeNet5概述。 1994年,CNN网络&…

卷积神经网络(一):LeNet5的基本结构

在机器视觉,图像处理领域,卷积神经网络取得了巨大的成功。本文将参考UFLDL和DEEPLEARNING.NET的教程,结合自己的理解,梳理一下卷积神经网络的构成以及其BP算法的求解。虽然利用theano可以方便的实现LeNet5,但是不利于学…

LeNet5网络结构详解

文章目录 1.论文地址:2.LeNet5网络结构:3.首先了解参数量和计算量之间的区别和计算:(1)参数量(Params):(2)计算量(FLOPS):&#xff08…

经典网络模型介绍系列——LeNet-5

从今天开始,带大家从LeNet5开始学习经典的网络模型。 一、LeNet-5 LeNet-5是LeNet系列的最终稳定版,它被美国银行用于手写数字识别,该网络有以下特点: 所有卷积核大小均为5*5,步长为1;所有池化方法为平均…

LeNet5的深入解析

论文:Gradient-based-learning-applied-to-document-recognition 参考:http://blog.csdn.net/strint/article/details/44163869 LeNet5 这个网络虽然很小,但是它包含了深度学习的基本模块:卷积层,池化层,…

LeNet5模型讲解

加粗样式LeNet5模型讲解 LeNet5模型总览 总共8层网络,分别为: 输入层(INPUT)、卷积层(Convolutions,C1)、池化层(Subsampling,S2)、卷积层(C3)、…

LeNet-5详解

一、前言 LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition,是一种用于手写体字符识别的非常高效的卷积神经网络。 本文将从卷积神经网络结构的基础说起,详细地讲解每个网络层。 论文下载:请到文章结尾处下载。 …

卷积神经网络:LeNet-5

2021SCSDUSC LeNet-5卷积神经网络的整体框架: 特征映射:一幅图在经过卷积操作后得到结果称为特征图。 LeNet-5共有8层,包含输入层,每层都包含可训练参数;每个层有多个特征映射(,每个特征映射通过一种卷积…

LeNet-5网络详解

文章目录 1 模型介绍2 模型结构3 模型特性 1 模型介绍 LeNet-5出自论文《Gradient-Based Learning Applied to Document Recognition》,是由 L e C u n LeCun LeCun 于1998年提出的一种用于识别手写数字和机器印刷字符的卷积神经网络,其命名来源于作者 …

深度学习入门(一):LeNet-5教程与详解

1.什么是LeNet LeNet5诞生于1994年,是最早的卷积神经网络之一,并且推动了深度学习领域的发展。自从1988年开始,在多年的研究和许多次成功的迭代后,这项由Yann LeCun完成的开拓性成果被命名为LeNet5。 LeNet: 主要用来…

卷积神经网络(CNN)开山之作——LeNet-5。卷积神经网络基本介绍。

目录 一、LeNet-5的背景 二、传统分类算法在图像识别上的弊端 三、卷积神经网络的3个基本特征 四、LeNet-5的网络结构 1、Input layer 2、Conv1 3、Subsampling2 4、Conv3 5、Subsampling4 6、Conv5 7、FC6 8、Output7 五、LeNet-5总结 一、LeNet-5的背景 LeNet-5…

这可能是神经网络 LeNet-5 最详细的解释了!

大家好,我是红色石头! 说起深度学习目标检测算法,就不得不提 LeNet- 5 网络。LeNet-5由LeCun等人提出于1998年提出,是一种用于手写体字符识别的非常高效的卷积神经网络。出自论文《Gradient-Based Learning Applied to Document R…

c语言--使用函数输出水仙花数

函数接口定义 1、int narcissistic( int number ); 2、void PrintN( int m, int n ); 函数 narcissistic 判断 number 是否为水仙花数,是则返回1,否则返回0。 函数 PrintN 则打印开区间 (m, n) 内所有的水仙花数,每个数字占一行。 …

【C语言程序设计】C语言水仙花数,阿姆斯特朗数!

阿姆斯特朗数也就是俗称的水仙花数,是指一个三位数,其各位数字的立方和等于该数本身。 例如:153135333,所以 153 就是一个水仙花数。 求出所有的水仙花数。 算法思想 对于阿姆斯特朗数问题,根据水仙花数的定义&#x…

C语言编程练习:水仙花数

文章目录 题目描述思路结果 题目描述 水仙花数是指一个N位正整数(N>3)&#xff0c;它的每个位上的数字的N次幂之和等于它本身。例如:153 1353 33。本题要求编写程序&#xff0c;计算所有N位水仙花数。 输入格式: 输入在一行中给出一个正整数N(3<N<7 )。 输出格式: …

C语言:水仙花数(daffodil),求出三位数中所有水仙花数

水仙花数&#xff08;C语言&#xff09; 文章目录 水仙花数&#xff08;C语言&#xff09;前言一、题目二、解题思路代码运行结果 总结***根据水仙花数满足的条件找出需要求的对象&#xff0c;这里是各位上的位数。*** 前言 刘汝佳算法书《算法竞赛入门经典》第二章上机练习第…

C语言输出三位数的水仙花数

从100-999中找出符合条件的水仙花数 文章目录 从100-999中找出符合条件的水仙花数前言一、水仙花数是什么&#xff1f;二、C语言实现输出水仙花数1.解题思路2.实现过程 总结 前言 提示&#xff1a;找出符合条件的水仙花数&#xff0c;我们需要弄明白什么叫水仙花数&#xff0c…

c语言设计程序计算水仙花数,C语言水仙花数算法

打印出所有的“水仙花数”&#xff0c; 所谓“水仙花数”是指一个三位数&#xff0c;其各位数字立方和等于该数本身。例如&#xff1a;153是一个“水仙花数”&#xff0c;因为1531的三次方5的三次方3的三次方。 1.程序分析&#xff1a;利用for循环控制100-999个数&#xff0c;每…

水仙花数的实现(C语言)

问题描述&#xff1a;一个三位数&#xff0c;百位的立方加上十位的立方加个位的立方对于这个数本身。 即&#xff1a;abc a^3b^3c^3; 例如&#xff1a;153 1^35^33^3 求出所有的水仙花数&#xff1a; 这是一个将一个三位数的百位&#xff0c;十位&#xff0c;个位提出来&…

C语言输出所有的水仙花数

输出所有的“水仙花数”。所谓“水仙花数”是指一个3位数&#xff0c;其各位数字立方之和等于该数本身。 例如&#xff0c;153是一个水仙花数&#xff0c;因为15315&#xff0b;3 解题思路&#xff1a;水仙花数的解题思路是把给出的某个三位数的个位、十位、百位分别拆分&#…