当前位置:网站首页>卷积神经网络模型之——LeNet网络结构与代码实现
卷积神经网络模型之——LeNet网络结构与代码实现
2022-07-25 12:43:00 【1 + 1=王】
文章目录
LeNet简介
LeNet原文地址:https://ieeexplore.ieee.org/abstract/document/726791

LeNet可以说是卷积神经网络的“HelloWorld”,它通过巧妙的设计,利用卷积、池化等操作提取特征,再使用全连接神经网络进行分类。
Lenet是一个 7 层的神经网络(不包含输入层),包含 3 个卷积层,2 个池化层,2 个全连接层。它的网络结构图如下所示:
LeNet7层结构
第0层:输入
输入的原始图像大小是32×32像素的3通道图像。
C1:第一个卷积层
C1是一个卷积层,卷积核大小为5,输入大小为3X32X32,输出特征图大小为16X28X28。
self.conv1 = nn.Conv2d(3, 16, 5)
torch.nn.Conv2d()的参数解释如下:
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)
- in_channels (int) – Number of channels in the input image
- out_channels (int) – Number of channels produced by the convolution
- kernel_size (int or tuple) – Size of the convolving kernel
- stride (int or tuple, optional) – Stride of the convolution. Default: 1
- padding (int, tuple or str, optional) – Padding added to all four sides of the input. Default: 0
- padding_mode (string, optional) – ‘zeros’, ‘reflect’, ‘replicate’ or ‘circular’. Default: ‘zeros’
- dilation (int or tuple, optional) – Spacing between kernel elements. Default: 1
- groups (int, optional) – Number of blocked connections from input channels to output channels. Default: 1
- bias (bool, optional) – If True, adds a learnable bias to the output. Default: True
经过卷积后的输出大小计算为下:
S2:第一个下采样层
S2是一个池化层,kernel_size为2,stride为2,输入大小为16X28X28,输出特征图大小为16X14X14。
self.pool1 = nn.MaxPool2d(2, 2)
torch.nn.MaxPool2d的参数解释如下:
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
- kernel_size – the size of the window to take a max over
- stride – the stride of the window. Default value is kernel_size
- padding – implicit zero padding to be added on both sides
- dilation – a parameter that controls the stride of elements in the window
- return_indices – if True, will return the max indices along with the outputs. Useful for torch.nn.MaxUnpool2d later
- ceil_mode – when True, will use ceil instead of floor to compute the output shape
经过池化后的输出大小计算为下:
C3:第2个卷积层
C3是一个卷积层,卷积核大小为5,输入大小为16X14X14,输出特征图大小为32X10X10。
self.conv2 = nn.Conv2d(16, 32, 5)
S4:第2个下采样层
S4是一个池化层,kernel_size为2,stride为2,输入大小为32X10X10,输出特征图大小为32X5X5。
self.pool2 = nn.MaxPool2d(2, 2)
C5:第3个卷积层
C5是一个卷积层,卷积核大小为5,输入大小为32X5X5,输出特征图大小为120X1X1。
此处用全连接层代替
self.fc1 = nn.Linear(32*5*5, 120)
F6:第1个全连接层
F6是一个全连接层,输入大小为120,输出特征图大小为84。
self.fc2 = nn.Linear(120, 84)
F7:第2个全连接层
F7是一个全连接层,输入大小为84,输出特征图大小为10(表示有10种类别)。
self.fc3 = nn.Linear(84, 10)
使用pytorch搭建LeNet
搭建一个网络模型,最少需要分两步进行
1. 创建一个类并继承nn.Module
import torch.nn as nn
# pytorch:通道排序:[N,Channel,Height,Width]
class LeNet(nn.Module):
2. 类中实现两个方法
def __init__(self):定义搭建网络中需要使用的网络层结构
def forward(self, x): 定义正向传播过程
LeNet网络结构pytorch实现:
class LeNet(nn.Module):
def __init__(self):
super(LeNet, self).__init__()
self.conv1 = nn.Conv2d(3, 16, 5) # C1
self.pool1 = nn.MaxPool2d(2, 2) # S2
self.conv2 = nn.Conv2d(16, 32, 5) # C3
self.pool2 = nn.MaxPool2d(2, 2) # S4
self.fc1 = nn.Linear(32*5*5, 120) # C5(用全连接代替)
self.fc2 = nn.Linear(120, 84) # F6
self.fc3 = nn.Linear(84, 10) # F7
def forward(self, x):
x = F.relu(self.conv1(x)) # input(3, 32, 32) 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(-1, 32*5*5) # 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
打印LeNet结构如下:
model = LeNet()
print(model)

边栏推荐
- Perf performance debugging
- How to understand metrics in keras
- 状态(State)模式
- Moving Chinese figure liushenglan
- 公安部:国际社会普遍认为中国是世界上最安全的国家之一
- 【AI4Code】《InferCode: Self-Supervised Learning of Code Representations by Predicting Subtrees》ICSE‘21
- pytorch创建自己的Dataset加载数据集
- 简单了解流
- 【CSDN 年终总结】结束与开始,一直在路上—— “1+1=王”的2021总结
- Make a general cascade dictionary selection control based on jeecg -dictcascadeuniversal
猜你喜欢

cv2.resize函数报错:error: (-215:Assertion failed) func != 0 in function ‘cv::hal::resize‘

Want to go whoring in vain, right? Enough for you this time!

AtCoder Beginner Contest 261 F // 树状数组

【AI4Code】《CoSQA: 20,000+ Web Queries for Code Search and Question Answering》 ACL 2021

Atcoder beginer contest 261 f / / tree array

Emqx cloud update: more parameters are added to log analysis, which makes monitoring, operation and maintenance easier

A hard journey

How to use causal inference and experiments to drive user growth| July 28 tf67

Shell常用脚本:检测某域名、IP地址是否通

B树和B+树
随机推荐
[today in history] July 25: IBM obtained the first patent; Verizon acquires Yahoo; Amazon releases fire phone
[problem solving] ibatis.binding BindingException: Type interface xxDao is not known to the MapperRegistry.
Want to go whoring in vain, right? Enough for you this time!
Memory layout of program
Detailed explanation of switch link aggregation [Huawei ENSP]
“蔚来杯“2022牛客暑期多校训练营2 补题题解(G、J、K、L)
【AI4Code】《GraphCodeBERT: Pre-Training Code Representations With DataFlow》 ICLR 2021
B树和B+树
How to understand metrics in keras
pytorch创建自己的Dataset加载数据集
Perf performance debugging
What does the software testing process include? What are the test methods?
[operation and maintenance, implementation of high-quality products] interview skills for technical positions with a monthly salary of 10k+
Masscode is an excellent open source code fragment manager
State mode
需求规格说明书模板
485 communication (detailed explanation)
微软提出CodeT:代码生成新SOTA,20个点的性能提升
如何用因果推断和实验驱动用户增长? | 7月28日TF67
More accurate and efficient segmentation of organs-at-risk in radiotherapy with Convolutional Neural