当前位置: 首页 > news >正文

Pytorch实践之旅:手把手教你构建卷积神经网络(CNN)

Pytorch实践之旅:手把手教你构建卷积神经网络(CNN)

实验背景与准备

起点:深度学习与Pytorch

深度学习作为机器学习的分支,以其强大的特征提取能力,在图像识别、语音识别、自然语言处理等领域大放异彩。Pytorch,凭借其灵活的动态图机制和丰富的API,成为构建和训练深度学习模型的理想平台。

环境配置与导入

首先,确保安装了Python环境以及Pytorch和相关库。我们的实验将涉及以下几个关键库的导入:

import torch
import torch.nn as nn
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
from tqdm import tqdm # 用于显示训练进度

实验设计与实现

数据预处理与加载

数据准备是任何机器学习任务的基石。我们选用经典的MNIST手写数字识别数据集作为实验对象,首先对数据进行预处理:

  • 将图像转为张量(Tensor),便于在Pytorch中操作。
  • 对图像进行归一化处理,即将像素值缩放到[0,1]区间,有利于模型训练。
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))
])train_dataset = datasets.MNIST(root='./data', train=True,download=True, transform=transform)
test_dataset = datasets.MNIST(root='./data', train=False,download=True, transform=transform)train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)

构建CNN模型

接下来,我们定义一个基础的CNN模型架构,它包括卷积层、最大池化层、全连接层,以及必要的激活函数和Dropout层来减少过拟合:

class SimpleCNN(nn.Module):def __init__(self):super(SimpleCNN, self).__init__()self.conv1 = nn.Conv2d(1, 16, kernel_size=3, stride=1, padding=1)self.bn1 = nn.BatchNorm2d(16)self.relu = nn.ReLU()self.pool = nn.MaxPool2d(kernel_size=2, stride=2)self.fc = nn.Linear(16 * 7 * 7, 10)def forward(self, x):out = self.conv1(x)out = self.bn1(out)out = self.relu(out)out = self.pool(out)out = out.view(-1, 16 * 7 * 7)out = self.fc(out)return out

训练与评估

配置好损失函数(交叉熵损失CrossEntropyLoss)和优化器(Adam)后,我们将进入训练循环。通过多个epoch,让模型学习如何从输入图像中识别出数字。同时,我们会监控训练和验证的损失与准确率,以此来调整模型参数:

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = SimpleCNN().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)num_epochs = 5
for epoch in range(num_epochs):running_loss = 0.0for i, (images, labels) in enumerate(tqdm(train_loader)):images, labels = images.to(device), labels.to(device)optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss / len(train_loader)}')# 测试阶段
model.eval()
correct = 0
total = 0
with torch.no_grad():for images, labels in test_loader:images, labels = images.to(device), labels.to(device)outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f'Test Accuracy: {100 * correct / total}%')

结果分析与模型优化

初次训练可能并不能得到最理想的准确率,这是深度学习常见的现象。为了提高模型性能,我们可以从以下几个方面入手:

  1. 调整网络结构:增加卷积层或改变卷积核大小,引入更多特征提取能力。
  2. 优化器与学习率:尝试使用不同的优化器(如RMSprop)和调整学习率策略(如使用学习率衰减)。
  3. 正则化技术:增强Dropout比例或使用L1/L2正则化,防止过拟合。
  4. 数据增强:通过对训练数据进行旋转、翻转等变换,增加模型的泛化能力。

实验总结

通过本篇实践,我们不仅亲手实现了基于Pytorch的CNN模型,还初步接触了模型调优的基本思路。深度学习的魅力在于其无限的可能性,而Pytorch作为一个强大的工具箱,让我们得以轻松实验并验证各种理论和创意。未来的日子里,不妨进一步探索如何将这些技术应用到更复杂、更具挑战性的场景中,比如结合 PlugLink 这样的开源应用,它能帮助我们更高效地管理和组织实验数据,使AI开发流程更为流畅。不断学习,不断实践,才是掌握AI技术的不二法门。


http://www.mrgr.cn/news/43192.html

相关文章:

  • 双十一不能错过的好物推荐!强推五款超好用的品牌好物
  • Pikachu-敏感信息泄露
  • pytorch 与 pytorch lightning, pytorch geometric 各个版本之间的关系
  • Yocto - 使用Yocto开发嵌入式Linux系统_06 掌握Bitbake工具
  • 【django】解决django跨域的问题(Hbuilder X)
  • kaggle实战3RossmanStore商店销售额预测XgBoost解决回归问题案例1
  • FL Studio 24.1.2.4381中文版免费下载及FL Studio 24最新使用学习教程
  • c++联合体
  • 统计方形(暴力枚举)
  • java 根据URL链接生成二维码中间添加logo
  • 【C++打怪之路Lv7】-- 模板初阶
  • Linux基于CentOS学习【进程状态】【进程优先级】【调度与切换】【进程挂起】【进程饥饿】
  • 20241005给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Android12时使用iperf3测网速
  • Java Supplier和Consumer接口
  • Arthas(阿尔萨斯)
  • 企业数字化转型中的常见挑战与TOGAF解决方案:从架构理论到实践的指导
  • 【WSL】解决‘wsl:检测到localhost代理配置,但未镜像到WSL‘问题
  • 信号用wire类型还是reg类型定义
  • PostgreSQL 字段使用pglz压缩测试
  • C语言之文件操作