机器学习——典型的卷积神经网络

卷积神经网络(Convolutional Neural Networks,CNNs)是一类在图像处理领域应用广泛的深度学习模型。它通过卷积操作和池化操作来提取图像的特征,并通过全连接层来进行分类或回归任务。在本文中,我们将介绍三种典型的卷积神经网络:LeNet-5、AlexNet和ResNet,并用Python实现这些算法。

1. LeNet-5

LeNet-5是由Yann LeCun等人于1998年提出的用于手写数字识别的卷积神经网络,它是深度学习领域的先驱之一。LeNet-5主要由卷积层、池化层和全连接层组成。

网络结构

  1. 输入层:32x32的灰度图像
  2. 卷积层C1:6个5x5的卷积核,步长为1
  3. 池化层S2:2x2的最大池化,步长为2
  4. 卷积层C3:16个5x5的卷积核,步长为1
  5. 池化层S4:2x2的最大池化,步长为2
  6. 全连接层C5:120个神经元
  7. 全连接层F6:84个神经元
  8. 输出层: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主要由卷积层、池化层和全连接层组成。

网络结构

  1. 输入层:227x227的RGB图像
  2. 卷积层C1:96个11x11的卷积核,步长为4
  3. 池化层S2:3x3的最大池化,步长为2
  4. 卷积层C3:256个5x5的卷积核,步长为1
  5. 池化层S4:3x3的最大池化,步长为2
  6. 卷积层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主要由卷积层、残差块和全连接层组成。

网络结构

  1. 输入层:224x224的RGB图像
  2. 卷积层:64个7x7的卷积核,步长为2,使用零填充
  3. 池化层:3x3的最大池化,步长为2
  4. 残差块(Residual Block):包含多个残差单元(Residual Unit)
  5. 全局平均池化层(Global Average Pooling)
  6. 全连接层:1000个神经元,对应1000个类别

参数数量

ResNet的参数数量取决于其深度,因为它的大部分层都是卷积层和残差块。具体参数数量可以根据网络

深度和残差块的数量进行计算。

Python实现

ResNet的实现较为复杂,可以使用PyTorch等深度学习框架提供的预训练模型来直接使用。

import torch
import torchvision.models as models

# 加载预训练的ResNet模型
model = models.resnet50(pretrained=True)

总结

本文介绍了三种典型的卷积神经网络:LeNet-5、AlexNet和ResNet。这些网络在图像分类、目标检测和语义分割等计算机视觉任务中取得了巨大成功。它们的设计思想和结构各不相同,但都为深度学习在图像处理领域的发展做出了重要贡献。

04-05 01:25