论坛网站模板源码下载,重庆网站优化seo公司,成品app软件大全,公司两个网站可以做友情链接吗基于深度可分离膨胀卷积的MNIST手写体识别
Github链接
项目背景#xff1a; MNIST手写体数据集是深度学习领域中一个经典的入门数据集#xff0c;包含了从0到9的手写数字图像#xff0c;用于评估不同模型在图像分类任务上的性能。在本项目中#xff0c;我们通过设计一种基…基于深度可分离膨胀卷积的MNIST手写体识别
Github链接
项目背景 MNIST手写体数据集是深度学习领域中一个经典的入门数据集包含了从0到9的手写数字图像用于评估不同模型在图像分类任务上的性能。在本项目中我们通过设计一种基于深度可分离膨胀卷积的神经网络模型解决模型参数量大与特征提取能力不足之间的矛盾同时实现对MNIST手写数字的高效识别。
核心技术
深度卷积 深度卷积Depthwise Convolution将标准卷积分解为每个通道独立的卷积操作从而显著减少计算量。相比传统卷积操作深度卷积只需要处理每个通道的卷积不会引入通道间的冗余计算。点卷积 点卷积Pointwise Convolution采用1×1的卷积核用于整合深度卷积生成的特征将通道间信息融合增强表达能力。点卷积是深度可分离卷积不可或缺的部分负责重建多通道的全局信息。膨胀卷积 膨胀卷积Dilated Convolution通过在卷积核间插入空洞扩展感受野允许模型捕获更大范围的上下文信息特别适合处理具有稀疏特征的任务同时避免了增加参数量的开销。 实现流程
数据准备 加载MNIST数据集进行标准化预处理。将数据分为训练集和测试集保证模型的评估结果具备可靠性。 模型设计 构建基于深度卷积、点卷积及膨胀卷积的神经网络结构重点在于设计轻量化且具有良好表达能力的卷积模块。使用ReLU激活函数和全连接层对提取的特征进行分类处理。 模型训练与测试 使用交叉熵损失函数和Adam优化器训练模型记录损失值变化以监控收敛情况。测试阶段评估模型在MNIST测试集上的分类准确率并验证其泛化能力。 参数量对比分析 对比标准卷积和深度可分离卷积在参数量上的差异直观展示优化效果。在同等条件下深度可分离卷积显著减少参数量同时保持了分类性能的稳定性。
项目成果 通过本项目的实验模型在MNIST数据集上的分类准确率达到了接近 98.7% 的水平。结合深度可分离膨胀卷积的轻量化设计我们在大幅减少参数量的同时实现了与传统卷积模型媲美的性能。此方法为资源受限的场景如移动设备和嵌入式系统提供了一种有效的解决方案。
结论与展望 本项目展示了深度可分离膨胀卷积在图像分类任务中的强大能力特别是在参数量和计算量优化方面。未来的工作可以尝试将该方法应用于更复杂的数据集和任务场景例如自然图像分类、目标检测或语义分割从而进一步验证其通用性与潜力。
# Time : 28/12/2024 上午 10:00
# Author : Xuan
# File : 基于深度可分离膨胀卷积的MNIST手写体识别.py
# Software: PyCharmimport torch
import torch.nn as nn
import einops.layers.torch as elt
from torchvision import datasets, transforms
import matplotlib.pyplot as plt# 定义数据转换
transform transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))
])# 下载并加载训练集
train_dataset datasets.MNIST(root./dataset, trainTrue, downloadTrue, transformtransform)
train_loader torch.utils.data.DataLoader(train_dataset, batch_size64, shuffleTrue)# 下载并加载测试集
test_dataset datasets.MNIST(root./dataset, trainFalse, downloadTrue, transformtransform)
test_loader torch.utils.data.DataLoader(test_dataset, batch_size1000, shuffleFalse)# 检查数据集大小
print(fTrain dataset size: {len(train_dataset)}) # Train dataset size: 60000
print(fTest dataset size: {len(test_dataset)}) # Test dataset size: 10000class Model(nn.Module):def __init__(self):super(Model, self).__init__()# 深度、可分离、膨胀卷积self.conv nn.Sequential(nn.Conv2d(1, 12, kernel_size7),nn.ReLU(),nn.Conv2d(in_channels12, out_channels12, kernel_size3, groups6, dilation2),nn.Conv2d(in_channels12, out_channels24, kernel_size1),nn.ReLU(),nn.Conv2d(24, 6, kernel_size7),)self.logits_layer nn.Linear(in_features6 * 12 * 12, out_features10)def forward(self, x):x self.conv(x)x elt.Rearrange(b c h w - b (c h w))(x)logits self.logits_layer(x)return logitsdevice cuda if torch.cuda.is_available() else cpu
model Model().to(device)
criterion nn.CrossEntropyLoss()
optimizer torch.optim.Adam(model.parameters(), lr0.001)epochs 10
for epoch in range(epochs):model.train()for batch_idx, (data, target) in enumerate(train_loader):data, target data.to(device), target.to(device)optimizer.zero_grad()output model(data)loss criterion(output, target)loss.backward()optimizer.step()if batch_idx % 100 0:print(fEpoch: {epoch}, Batch: {batch_idx}, Loss: {loss.item()})# Save the model
torch.save(model.state_dict(), ./modelsave/mnist.pth)# Load the model
model Model().to(device)
model.load_state_dict(torch.load(./modelsave/mnist.pth))# Evaluation
model.eval()
correct 0
first_image_displayed False
with torch.no_grad():for data, target in test_loader:data, target data.to(device), target.to(device)output model(data)pred output.argmax(dim1, keepdimTrue)correct pred.eq(target.view_as(pred)).sum().item()# Display the first image and its predictionif not first_image_displayed:plt.imshow(data[0].cpu().numpy().squeeze(), cmapgray)plt.title(fPredicted: {pred[0].item()})plt.show()first_image_displayed Trueprint(fTest set: Accuracy: {correct / len(test_loader.dataset):.4f}) # Test set: Accuracy: 0.9874# 深度可分离卷积参数比较
# 普通卷积参数量
conv nn.Conv2d(in_channels3 ,out_channels3, kernel_size3) # in(3) * out(3) * k(3) * k(3) out(3) 84
conv_params sum(p.numel() for p in conv.parameters())
print(conv_params:, conv_params) # conv_params: 84# 深度可分离卷积参数量
depthwise nn.Conv2d(in_channels3, out_channels3, kernel_size3, groups3) # in(3) * k(3) * k(3) out(3) 30
pointwise nn.Conv2d(in_channels3, out_channels3, kernel_size1) # in(3) * out(3) * k(1) * k(1) out(3) 12
depthwise_separable nn.Sequential(depthwise, pointwise)
depthwise_separable_params sum(p.numel() for p in depthwise_separable.parameters())
print(depthwise_separable_params:, depthwise_separable_params) # depthwise_separable_params: 42