您的位置:首页 > 房产 > 家装 > 现在广西哪里疫情严重_山东东营广饶疫情最新消息_关键词搜索指数_神马seo教程

现在广西哪里疫情严重_山东东营广饶疫情最新消息_关键词搜索指数_神马seo教程

2025/2/24 23:04:03 来源:https://blog.csdn.net/weixin_63019977/article/details/144130878  浏览:    关键词:现在广西哪里疫情严重_山东东营广饶疫情最新消息_关键词搜索指数_神马seo教程
现在广西哪里疫情严重_山东东营广饶疫情最新消息_关键词搜索指数_神马seo教程

卷积神经网络(CNN)从原理到实现

什么是卷积神经网络(CNN)?

卷积神经网络(Convolutional Neural Network, CNN)是一种深度学习模型,主要应用于图像分类、目标检测和自然语言处理等领域。与传统神经网络不同,CNN 通过局部感受野、权值共享和池化操作有效减少参数量,同时保留空间信息。

CNN 结构图

在这里插入图片描述


CNN 的核心概念

CNN 包括三大核心操作:卷积激活函数池化

1. 卷积层(Convolution Layer)

卷积层的目的是提取特征,通过卷积核(Filter)对输入进行特征提取。卷积的数学公式如下:

y [ i , j ] = ∑ m = 0 k − 1 ∑ n = 0 k − 1 x [ i + m , j + n ] ⋅ w [ m , n ] + b y[i, j] = \sum_{m=0}^{k-1} \sum_{n=0}^{k-1} x[i+m, j+n] \cdot w[m, n] + b y[i,j]=m=0k1n=0k1x[i+m,j+n]w[m,n]+b

  • (x):输入图像
  • (w):卷积核权重
  • (b):偏置项
  • (k):卷积核大小

卷积操作示意图:

在这里插入图片描述
在这里插入图片描述


2. 激活函数(Activation Function)

激活函数引入非线性因素,常用的是 ReLU 函数:

f ( x ) = max ⁡ ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x)

ReLU 函数示意图:

在这里插入图片描述


3. 池化层(Pooling Layer)

池化层通过降维保留关键信息,常用的是最大池化(Max Pooling):

y [ i , j ] = max ⁡ m , n ∈ window x [ i + m , j + n ] y[i, j] = \max_{m, n \in \text{window}} x[i+m, j+n] y[i,j]=m,nwindowmaxx[i+m,j+n]

池化操作示意图:

在这里插入图片描述


LeNet-5 的结构

本文实现了经典的 LeNet-5 模型,用于 MNIST 手写数字分类。

LeNet-5 的结构如下:

层类型输入大小卷积核大小输出大小
输入层1 x 28 x 28-1 x 28 x 28
卷积层 11 x 28 x 285 x 56 x 24 x 24
池化层 16 x 24 x 242 x 26 x 12 x 12
卷积层 26 x 12 x 125 x 516 x 8 x 8
池化层 216 x 8 x 82 x 216 x 4 x 4
全连接层 1256-120
全连接层 2120-84
输出层84-10

示意图:
在这里插入图片描述


PyTorch 实现

数据加载

使用 torchvision.datasets 下载 MNIST 数据集,数据经过归一化和转换为张量。

from torchvision import datasets, transforms
from torch.utils.data import DataLoadertransform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,), (0.5,))
])train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transform, download=True)train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)

LeNet-5 模型

LeNet-5 使用两层卷积、两层池化和三层全连接。

import torch
from torch.nn import Module
from torch import nnclass LeNet5(Module):def __init__(self):super(LeNet5, self).__init__()self.conv1 = nn.Sequential(nn.Conv2d(1, 6, 5),nn.ReLU(),nn.MaxPool2d(2))self.conv2 = nn.Sequential(nn.Conv2d(6, 16, 5),nn.ReLU(),nn.MaxPool2d(2))self.fc1 = nn.Sequential(nn.Linear(256, 120),nn.ReLU())self.fc2 = nn.Sequential(nn.Linear(120, 84),nn.ReLU())self.fc3 = nn.Linear(84, 10)def forward(self, x):x = self.conv1(x)x = self.conv2(x)x = x.view(x.size(0), -1)x = self.fc1(x)x = self.fc2(x)x = self.fc3(x)return x

模型训练

模型使用交叉熵损失函数和 Adam 优化器。

import torch.optim as optim
from torch import nnmodel = LeNet5()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)for epoch in range(10):model.train()for batch_idx, (data, label) in enumerate(train_loader):output = model(data)loss = criterion(output, label)optimizer.zero_grad()loss.backward()optimizer.step()if batch_idx % 100 == 0:print(f"Epoch {epoch+1}/10 | Batch {batch_idx}/{len(train_loader)} | Loss: {loss.item():.4f}")torch.save(model.state_dict(), 'mnist_lenet5.pth')
print("模型训练完成,已保存至 'mnist_lenet5.pth'")

模型验证

训练完成后,验证模型的准确率。

model.eval()
correct = 0
total = 0with torch.no_grad():for data, label in test_loader:output = model(data)_, predicted = torch.max(output.data, 1)total += label.size(0)correct += (predicted == label).sum().item()accuracy = correct / total
print(f"模型在测试集上的准确率: {accuracy * 100:.2f}%")

结果分析

训练模型的损失值逐渐下降,最终测试集准确率为 99.2%,表明模型在手写数字分类任务上的效果非常好。

EpochBatchLoss
11002.3096
55000.0701
109000.0268

在这里插入图片描述


总结

本文从原理、实现到结果分析详细介绍了卷积神经网络和 LeNet-5 模型。关键点包括:

  1. 卷积、激活函数和池化操作 是 CNN 的核心。
  2. LeNet-5 是 CNN 的经典结构,适用于简单任务。
  3. PyTorch 提供了强大的工具链,帮助快速构建和训练模型。

参考文献

  • LeNet-5 Paper
  • PyTorch Documentation

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com