一、介绍
LeNet5是由Yann LeCun在1998年提出的,是深度学习领域中非常重要的神经网络模型。LeNet5是一个卷积神经网络模型,在当时在手写数字识别、人脸识别等领域都有应用。该模型的成功启发了更加复杂的卷积神经网络的设计,是卷积神经网络发展史上的重要一步。
二、LeNet5网络结构
LeNet5是由7层神经网络组成,分别是输入层、C1层、S2层、C3层、S4层、F5层和输出层。下面是LeNet5的网络结构图:
输入层是一张32*32的图片。接下来的C1层是一个卷积层,包含6个卷积核。在C1层中,6个卷积核会对输入图像执行卷积运算,每个卷积核生成一个卷积特征图。
```python class LeNet5(nn.Module): def __init__(self): super(LeNet5, self).__init__() self.conv1 = nn.Conv2d(1, 6, 5) # C1 layer self.pool1 = nn.MaxPool2d(2, 2) # S2 layer self.conv2 = nn.Conv2d(6, 16, 5) # C3 layer self.pool2 = nn.MaxPool2d((2,2), (2,2)) # S4 layer self.fc1 = nn.Linear(16*5*5, 120) # F5 layer self.fc2 = nn.Linear(120, 84) # F6 layer self.fc3 = nn.Linear(84, 10) # Output layer def forward(self, x): x = F.relu(self.conv1(x)) x = self.pool1(x) x = F.relu(self.conv2(x)) x = self.pool2(x) x = x.view(-1, 16*5*5) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) output = self.fc3(x) return output net = LeNet5() ```三、各层功能详解
1. 卷积核层(C1)
输入图片经过C1层后,会得到6个卷积特征图,大小为28*28,每个特征图的大小是后面第二个池化层S2的大小。C1层使用的卷积核大小是5*5,步长为1,padding为0,输入通道为1,输出通道为6,这意味着C1层使用了6个5*5*1的卷积核,每个卷积核都会对输入图片做一次卷积运算,将得到的结果映射到对应的卷积特征图中。
```python class LeNet5(nn.Module): def __init__(self): super(LeNet5, self).__init__() self.conv1 = nn.Conv2d(1, 6, 5) # C1 layer ... ```2. 平均池化层(S2)
在经过C1层后,接下来是平均池化层S2。该层的主要作用是降低相邻像素间的相关性,减少参数数量,把大尺寸的特征图缩小为小尺寸的特征图。S2层的大小为14*14,每个特征图的大小为14*14。S2层使用的池化窗口大小为2*2,步长也为2*2。
```python class LeNet5(nn.Module): def __init__(self): super(LeNet5, self).__init__() ... self.pool1 = nn.MaxPool2d(2, 2) # S2 layer ... ```3. 卷积核层(C3)
C3层对S2层的特征图再次进行卷积得到16个卷积特征图,C3层使用的卷积核大小是5*5,步长为1,padding为0,输入通道为S2层的输出6,输出通道为16。
```python class LeNet5(nn.Module): def __init__(self): super(LeNet5, self).__init__() ... self.conv2 = nn.Conv2d(6, 16, 5) # C3 layer ... ```4. 平均池化层(S4)
在经过C3层后,接下来是平均池化层S4。S4层的大小为5*5,每个特征图的大小为5*5。S4层使用的池化窗口大小为2*2,步长也为2*2。
```python class LeNet5(nn.Module): def __init__(self): super(LeNet5, self).__init__() ... self.pool2 = nn.MaxPool2d((2,2), (2,2)) # S4 layer ... ```5. 全连接层(F5)
在S4层后面接着一个全连接层F5,对所有的神经元都进行连接,连接方式类似于经典的神经网络。F5层有120个神经元,接收来自S4层的16个5*5的卷积特征图。F5层的输入是一维的,所以需要把输入的16个特征图展开成一维的向量。
```python class LeNet5(nn.Module): def __init__(self): super(LeNet5, self).__init__() ... self.fc1 = nn.Linear(16*5*5, 120) # F5 layer ... ```6. 全连接层(F6)
F6层有84个神经元,接收来自F5层的120个神经元信号。该层主要作用在于增强网络的非线性,提高网络的拟合能力。
```python class LeNet5(nn.Module): def __init__(self): super(LeNet5, self).__init__() ... self.fc2 = nn.Linear(120, 84) # F6 layer ... ```7. 输出层
输出层一般是一个全连接层,每个神经元代表一个类别。
```python class LeNet5(nn.Module): def __init__(self): super(LeNet5, self).__init__() ... self.fc3 = nn.Linear(84, 10) # Output layer ... ```四、LeNet5的应用
LeNet5由于其简洁的网络结构和很好的性能,被广泛应用在手写数字识别等领域。随着深度学习的发展,卷积神经网络在图像识别、目标检测、语音识别等领域都有很好的应用。可以看到在LeNet5的基础上,会有更加复杂,更加深层次的卷积神经网络。
五、总结
LeNet5是在深度学习领域中具有重要意义的卷积神经网络,其在手写数字识别等领域都有很好的应用。该网络模型结构简洁明了,可以通过加深层数、增加节点等方式对其进行扩展,可以适用于更加复杂的图像识别任务。