机器学习——典型的卷积神经网络
卷积神经网络(Convolutional Neural Networks,CNNs)是一类在图像处理领域应用广泛的深度学习模型。它通过卷积操作和池化操作来提取图像的特征,并通过全连接层来进行分类或回归任务。在本文中,我们将介绍三种典型的卷积神经网络:LeNet-5、AlexNet和ResNet,并用Python实现这些算法。
1. LeNet-5
LeNet-5是由Yann LeCun等人于1998年提出的用于手写数字识别的卷积神经网络,它是深度学习领域的先驱之一。LeNet-5主要由卷积层、池化层和全连接层组成。
网络结构
- 输入层:32x32的灰度图像
- 卷积层C1:6个5x5的卷积核,步长为1
- 池化层S2:2x2的最大池化,步长为2
- 卷积层C3:16个5x5的卷积核,步长为1
- 池化层S4:2x2的最大池化,步长为2
- 全连接层C5:120个神经元
- 全连接层F6:84个神经元
- 输出层:10个神经元,对应10个类别
参数数量
- C1:(5x5+1) * 6 = 156
- C3:(5x5x6+1) * 16 = 2416
- C5:(400+1) * 120 = 48120
- F6:(120+1) * 84 = 10164
- 输出层:(84+1) * 10 = 850
总参数数量:156 + 2416 + 48120 + 10164 + 850 = 61906
Python实现
import torch
import torch.nn as nn
class LeNet5(nn.Module):
def __init__(self):
super(LeNet5, self).__init__()
self.conv1 = nn.Conv2d(1, 6, kernel_size=5)
self.conv2 = nn.Conv2d(6, 16, kernel_size=5)
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 = torch.relu(self.conv1(x))
x = torch.max_pool2d(x, kernel_size=2, stride=2)
x = torch.relu(self.conv2(x))
x = torch.max_pool2d(x, kernel_size=2, stride=2)
x = x.view(-1, 16*5*5)
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
# 创建LeNet-5模型实例
model = LeNet5()
2. AlexNet
AlexNet是由Alex Krizhevsky等人在2012年的ImageNet挑战赛上获胜的卷积神经网络,它是深度学习在计算机视觉领域应用的一个重要里程碑。AlexNet主要由卷积层、池化层和全连接层组成。
网络结构
- 输入层:227x227的RGB图像
- 卷积层C1:96个11x11的卷积核,步长为4
- 池化层S2:3x3的最大池化,步长为2
- 卷积层C3:256个5x5的卷积核,步长为1
- 池化层S4:3x3的最大池化,步长为2
- 卷积层C5:384个3x3的
卷积核,步长为1
7. 卷积层C6:384个3x3的卷积核,步长为1
8. 卷积层C7:256个3x3的卷积核,步长为1
9. 全连接层FC8:4096个神经元
10. 全连接层FC9:4096个神经元
11. 输出层:1000个神经元,对应1000个类别
参数数量
- C1:(11x11x3+1) * 96 = 34944
- C3:(5x5x96+1) * 256 = 614656
- C5:(3x3x256+1) * 384 = 885120
- C6:(3x3x384+1) * 384 = 1327488
- C7:(3x3x384+1) * 256 = 884992
- FC8:(9216+1) * 4096 = 37752832
- FC9:(4096+1) * 4096 = 16781312
- 输出层:(4096+1) * 1000 = 4097000
总参数数量:34944 + 614656 + 885120 + 1327488 + 884992 + 37752832 + 16781312 + 4097000 = 62083544
Python实现
import torch
import torch.nn as nn
class AlexNet(nn.Module):
def __init__(self):
super(AlexNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 96, kernel_size=11, stride=4),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(96, 256, kernel_size=5, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(256, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
)
self.avgpool = nn.AdaptiveAvgPool2d((6, 6))
self.classifier = nn.Sequential(
nn.Dropout(),
nn.Linear(256 * 6 * 6, 4096),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Linear(4096, 1000),
)
def forward(self, x):
x = self.features(x)
x = self.avgpool(x)
x = torch.flatten(x, 1)
x = self.classifier(x)
return x
# 创建AlexNet模型实例
model = AlexNet()
3. ResNet
ResNet是由Kaiming He等人在2015年提出的一个非常深的卷积神经网络,它采用了残差连接(Residual Connection)的方式来解决深层神经网络训练过程中的梯度消失问题。ResNet主要由卷积层、残差块和全连接层组成。
网络结构
- 输入层:224x224的RGB图像
- 卷积层:64个7x7的卷积核,步长为2,使用零填充
- 池化层:3x3的最大池化,步长为2
- 残差块(Residual Block):包含多个残差单元(Residual Unit)
- 全局平均池化层(Global Average Pooling)
- 全连接层:1000个神经元,对应1000个类别
参数数量
ResNet的参数数量取决于其深度,因为它的大部分层都是卷积层和残差块。具体参数数量可以根据网络
深度和残差块的数量进行计算。
Python实现
ResNet的实现较为复杂,可以使用PyTorch等深度学习框架提供的预训练模型来直接使用。
import torch
import torchvision.models as models
# 加载预训练的ResNet模型
model = models.resnet50(pretrained=True)
总结
本文介绍了三种典型的卷积神经网络:LeNet-5、AlexNet和ResNet。这些网络在图像分类、目标检测和语义分割等计算机视觉任务中取得了巨大成功。它们的设计思想和结构各不相同,但都为深度学习在图像处理领域的发展做出了重要贡献。