返回

LeNet:以 PyTorch 实现的早期卷积神经网络模型

人工智能

引言

卷积神经网络(CNN)在计算机视觉领域取得了突破性的成就,在图像识别、目标检测和图像分割等任务中展现出了强大的能力。LeNet是CNN领域的一块基石,它是最早应用于手写数字识别的手写数字识别的手写数字识别的手写数字识别的手写数字识别的手写数字识别的卷积神经网络模型之一,由Yann LeCun在1989年提出。

LeNet 的网络架构

LeNet由七层组成,包括两层卷积层、两层池化层、两层全连接层和一层输出层。网络架构如下:

  1. 卷积层 1(6x5x5):6 个 5x5 大小的卷积核
  2. 池化层 1(2x2):2x2 大小的最大池化
  3. 卷积层 2(16x5x5):16 个 5x5 大小的卷积核
  4. 池化层 2(2x2):2x2 大小的最大池化
  5. 全连接层 1(120 个神经元)
  6. 全连接层 2(84 个神经元)
  7. 输出层(10 个神经元)

LeNet 的 PyTorch 实现

使用 PyTorch 可以轻松实现 LeNet 模型:

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.MaxPool2d(2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.pool2 = nn.MaxPool2d(2)
        self.fc1 = nn.Linear(16 * 4 * 4, 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(-1, 16 * 4 * 4)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

训练 LeNet 模型

使用 MNIST 数据集训练 LeNet 模型:

import torch
from torchvision import datasets, transforms

# 定义数据集和数据加载器
train_dataset = datasets.MNIST("./data", train=True, download=True, transform=transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)

# 定义模型、损失函数和优化器
model = LeNet()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# 训练模型
for epoch in range(10):
    running_loss = 0.0
    for i, data in enumerate(train_loader, 0):
        # 获取输入数据和目标值
        inputs, labels = data

        # 前向传播
        outputs = model(inputs)

        # 计算损失
        loss = criterion(outputs, labels)

        # 反向传播
        optimizer.zero_grad()
        loss.backward()

        # 更新权重
        optimizer.step()

        # 累加损失
        running_loss += loss.item()

    # 打印训练信息
    print(f"Epoch {epoch + 1}: loss = {running_loss / len(train_loader)}")

评估 LeNet 模型

使用测试集评估训练后的 LeNet 模型:

import torch
from torchvision import datasets, transforms

# 定义测试集和数据加载器
test_dataset = datasets.MNIST("./data", train=False, download=True, transform=transforms.ToTensor())
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=True)

# 评估模型
correct = 0
total = 0
with torch.no_grad():
    for data in test_loader:
        # 获取输入数据和目标值
        inputs, labels = data

        # 前向传播
        outputs = model(inputs)

        # 预测结果
        _, predicted = torch.max(outputs.data, 1)

        # 计算正确数
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f"Accuracy of the network on the 10000 test images: {100 * correct / total} %")