CNN架构演变:从LeNet到ResNet,深度学习的里程碑
发布时间: 2024-08-17 08:26:11 阅读量: 34 订阅数: 45
![CNN架构演变:从LeNet到ResNet,深度学习的里程碑](https://liuruiyang98.github.io/posts/2021/09/16/tnt-1.png)
# 1. 卷积神经网络(CNN)概述**
卷积神经网络(CNN)是一种深度学习模型,专为处理具有网格状结构的数据(如图像)而设计。CNN的基本原理是利用卷积操作和池化操作来提取数据中的特征。
卷积操作通过滑动一个称为内核的权重矩阵来扫描输入数据,并计算每个位置的加权和。这有助于提取局部特征,例如边缘和纹理。池化操作通过将相邻元素合并成一个值来减少特征图的大小,从而降低计算成本并提高鲁棒性。
CNN的架构通常由交替的卷积层和池化层组成,每个层负责提取不同层次的特征。通过堆叠多个层,CNN可以学习复杂的高级表示,从而实现出色的图像识别和分析性能。
# 2. CNN架构演变
### 2.1 LeNet:CNN的先驱
**LeNet**(LeCun et al., 1998)是第一个成功的卷积神经网络,它为后续的CNN架构奠定了基础。LeNet的主要特点包括:
- **卷积层:**LeNet包含两个卷积层,每个卷积层使用5x5的卷积核进行卷积操作,提取图像中的局部特征。
- **池化层:**卷积层之后是池化层,使用2x2的平均池化操作,减少特征图的尺寸并增强特征的鲁棒性。
- **全连接层:**卷积层和池化层之后是两个全连接层,用于将提取的特征映射到输出类别。
**代码块:**
```python
import torch
import torch.nn as nn
import torch.nn.functional as F
class LeNet(nn.Module):
def __init__(self):
super(LeNet, self).__init__()
self.conv1 = nn.Conv2d(1, 6, 5)
self.pool1 = nn.AvgPool2d(2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.pool2 = nn.AvgPool2d(2)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool1(F.relu(self.conv1(x)))
x = self.pool2(F.relu(self.conv2(x)))
x = x.view(x.size(0), -1)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
```
**逻辑分析:**
* `nn.Conv2d`创建卷积层,第一个参数指定输入通道数,第二个参数指定输出通道数,第三个参数指定卷积核大小。
* `nn.AvgPool2d`创建平均池化层,参数指定池化窗口大小。
* `nn.Linear`创建全连接层,参数指定输入特征数和输出特征数。
* `F.relu`应用ReLU激活函数。
### 2.2 AlexNet:突破性进展
**AlexNet**(Krizhevsky et al., 2012)是CNN架构的突破性进展,它在ImageNet图像分类竞赛中取得了冠军。AlexNet的主要特点包括:
- **更深的网络结构:**AlexNet包含8层卷积层和3层全连接层,比LeNet更深,可以提取更复杂的特征。
- **更大的卷积核:**AlexNet使用11x11和5x5的卷积核,比LeNet的5x5卷积核更大,可以捕获更大的局部区域。
- **重叠池化:**AlexNet使用重叠池化,即池化窗口重叠,可以提取更多信息。
**代码块:**
```python
import torch
import torch.nn as nn
import torch.nn.functional as F
class AlexNet(nn.Module):
def __init__(self):
super(AlexNet, self).__init__()
self.conv1 = nn.Conv2d(3, 96, 11, stride=4)
self.pool1 = nn.MaxPool2d(3, stride=2)
self.conv2 = nn.Conv2d(96, 256, 5, padding=2)
self.pool2 = nn.MaxPool2d(3, stride=2)
self.conv3 = nn.Conv2d(256, 384, 3, padding=1)
self.conv4 = nn.Conv2d(384, 384, 3, padding=1)
self.conv5 = nn.Conv2d(384, 256, 3, padding=1)
self.pool5 = nn.MaxPool2d(3, stride=2)
self.fc1 = nn.Linear(256 * 6 * 6, 4096)
self.fc2 = nn.Linear(4096, 4096)
self.fc3 = nn.Linear(4096, 1000)
def forward(self, x):
x = self.pool1(F.relu(self.conv1(x)))
x = self.pool2(F.relu(self.conv2(x)))
x = F.relu(self.conv3(x))
x = F.relu(self.conv4(x))
x = self.pool5(F.relu(self.conv5(x)))
x = x.view(x.size(0), -1)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
```
**逻辑分析:**
* `nn.MaxPool2d`创建最大池化层,参数指定池化窗口大小和步长。
* `nn.ReLU`应用ReLU激活函数。
* `F.relu`应用ReLU激活函数。
* `nn.Linear`创建全连接层,参数指定输入特征数和输出特征数。
### 2.3 VGGNet:加深网络结构
**VGGNet**(Simonyan and Zisserman, 2014)进一步加深了CNN的网络结构,它包含16层或19层卷积层,没有全连接层。VGGNet的主要特点包括:
- **更深的网络结构:**VGGNet-16包含16层卷积层,VGGNet-19包含19层卷积层,比AlexNet更深。
0
0