Alex_McAvoy

想要成为渔夫的猎手

经典卷积神经网络之 LeNet-5

References:

【概述】

LeNet-5 是一个经典的深度卷积神经网络,由 Yann LeCun 在 1998 年提出,旨在解决手写数字识别问题,被认为是卷积神经网络的开创性工作之一

在当时的手写数字识别任务中,Let-5 取得了很好的效果,可以达到 $98\%$ 以上的准确率,这是当时最先进的技术水平

它的成功证明了深度学习的潜力,吸引了更多研究者加入到深度学习的研究中,同时,也为后来更加复杂的卷积神经网络奠定了基础,例如:AlexNet、VGG、GoogLeNet、ResNet 等,这些网络都采用了类似 LeNet-5 的卷积神经网络结构,但增加了更多的层数和参数,从而在图像分类、目标检测等任务中取得了更好的效果

虽然 LeNet-5 在当今深度学习的发展中已经不再是最先进的技术,但它的经典结构和训练方法仍然对深度学习的发展和应用有重要意义

【网络结构】

LeNet-5 将卷积、激活、池化视为一层,共有两个卷积层,卷积核大小均为 $5\times5$,同时池化层均采用平均池化,此外,当时 ReLU 函数还没有出现,因此其使用的激活函数是 Sigmoid 和 Tanh 函数

其网络结构如下图:

参数形状如下表:

Shape Size Parameters
Input $(32,32,3)$ $3072$ $0$
Conv1($f=5,s=1,n=6$) $(28,28,6)$ $4704$ $450+6$
Pool1 $(14,14,6)$ $1176$ $0$
Conv2($f=5,s=1,n=16$) $(10,10,16)$ $1600$ $2400+16$
Pool2 $(5,5,16)$ $400$ $0$
FC3 $(120,1)$ $120$ $48000+120$
FC4 $(84,1)$ $84$ $10080+84$
Output($\text{softmax}$) $(10,1)$ $10$ $840+110$

【实现】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import torch
import torch.nn as nn

class LeNet5(nn.Module):
def __init__(self):
super(LeNet5, self).__init__()

# 卷积层1
self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5, stride=1)
self.pool1 = nn.AvgPool2d(kernel_size=2, stride=2)

# 卷积层2
self.conv2 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5, stride=1)
self.pool2 = nn.AvgPool2d(kernel_size=2, stride=2)

# 全连接层
self.fc1 = nn.Linear(in_features=16 * 4 * 4, out_features=120)
self.fc2 = nn.Linear(in_features=120, out_features=84)
self.fc3 = nn.Linear(in_features=84, out_features=10)

def forward(self, x):
x = self.pool1(torch.relu(self.conv1(x)))
x = self.pool2(torch.relu(self.conv2(x)))
x = x.view(-1, 16 * 4 * 4)
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
感谢您对我的支持,让我继续努力分享有用的技术与知识点!