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.xdnf.cn/news/1555063.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

分布式事务(Seata-AT模式)

角色说明 TC (Transaction Coordinator) - 事务协调者 维护全局和分支事务的状态,驱动全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器 定义全局事务的范围:开始全局事务、提交或回滚全局事务。 RM (Resource Manager) - 资源管理器 管理分…

发现一篇瑞芯微RK3588上使用Gstreamer的文章(野火)

1. 前言 最近经常使用英伟达的Orin和瑞芯微RK3588做开发,自己还买了好几块开发板,很多需要自己琢磨,今天忽然发现了一篇文章,意外解决了一些之前的问题,以此作为记录: 文章链接:https://doc.embedfire.com/linux/rk356x/quick_start/zh/latest/lubancat_rk_software_har…

【STM32开发之寄存器版】(三)-详解NVIC中断

一、前言 STM32F103ZET6具备强大的中断控制能力,其嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连,可以实现低延迟的中断处理和高效地处理晚到的中断。NVIC主要具备以下特性: 68个可屏蔽中断通道(不包含16个Cortex™-M3的中断线)&#xf…

使用ValueConverters扩展实现枚举控制页面的显示

1、ValueConverters 本库包含了IValueConverter接口的的最常用的实现,ValueConverters用于从视图到视图模型的值得转换,某些情况下,可用进行反向转换。里面有一些抽象类、模板类的定义,可以继承这些类实现一些自己想要实现的功能…

GO网络编程(三):海量用户通信系统1:登录功能

一、准备工作 需求分析 1)用户注册 2)用户登录 3)显示在线用户列表 4)群聊(广播) 5)点对点聊天 6)离线留言 主界面 首先,在项目根目录下初始化mod,然后按照如下结构设计目录: 海量用户通信系统/ ├── go.mod ├── client/ │ ├──…

YOLO11改进|卷积篇|引入全维动态卷积ODConv

目录 一、【ODConv】全维动态卷积1.1【ODConv】卷积介绍1.2【ODConv】核心代码 二、添加【ODConv】卷积2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【ODConv】全维动态卷积 1.1【ODConv】卷积介绍 ODConv利用一种全新的多维注意力机…

操作系统实验之银行算法

一、实验目的 采用高级语言编写一个动态分配系统资源的程序,模拟死锁现象,观察死锁发生的条件,并采用适当的算法,有效地防止死锁的发生。 二、实验内容 本次实验采用银行算法防止死锁的发生。设有3个并发进程共享10个系统资源。在…

无神论文解读之ControlNet:Adding Conditional Control to Text-to-Image Diffusion Models

一、什么是ControlNet ControlNet是一种能够控制模型生成内容的方法,能够对文生图等模型添加限制信息(边缘、深度图、法向量图、姿势点图等),在当今生成比较火的时代很流行。 这种方法使得能够直接提供空间信息控制图片以更细粒…

AQS机制详解

案例一 public class AqsThread extends Thread {private Lock lock;public AqsThread(String name, Lock lock) {super(name);this.lock lock;}Overridepublic void run() {lock.lock();try {System.out.println(Thread.currentThread().getName() "running");} …

【LeetCode】每日一题 2024_10_5 完成旅途的最少时间(二分答案)

前言 每天和你一起刷 LeetCode 每日一题~ 大家国庆节快乐呀~ LeetCode 启动! 突然发现,国庆的每日一题,不是坐公交就是坐火车,不是坐火车就是做飞机,这就是你的国庆旅游计划吗!力扣! 题目&a…

图表不会做怎么办?AI一键生成好看图表!

本期教你如何用AI一键生成各种数据图表! 本文阅读难度:★☆☆☆☆ 看看别人做的这些图表,是不是挺好看的? 特别是作为接商单的新写手,看到这些,头都大了,该怎么办呢? 不用怕&…

ModuleNotFoundError: No module named ‘package‘

报错: Traceback (most recent call last): File “”, line 198, in run_module_as_main File “”, line 88, in run_code File "D:\python\helloworld.venv\Scripts\pip.exe_main.py", line 4, in File "D:\python\helloworld.venv\Lib\site-pac…

MAC备忘录空白解决方案

打开icloud->备忘录 取消勾选同步此MAC后再次勾选,然后点击完成即可。

S7-200 SMART的数据类型说明

S7-200 SMART的数据主要分为: 与实际输入/输出信号相关的输入/输出映象区: I:数字量输入(DI)Q:数字量输出(DO)AI:模拟量输入AQ:模拟量输出 内部数据存储区…

NVIDIA网卡系列之ConnectX-4规格信息(50G-PCIe 3.0x8-8PF256VF-2015年发布)

背景 NVIDIA ConnectX-4系列的网卡,早期还在Mellanox未被NVIDIA收购的时候就发布了,支持50G,PCIe3.0,最大x8通道lanes。 是50G级别的一代(10G-CX3,50G-CX4,100G-CX5,200G-CX6&#…

基于Python的自然语言处理系列(24):BiDAF(双向注意力流)

在自然语言处理领域,机器阅读理解(Machine Comprehension, MC)是一个重要的任务。在这篇博文中,我们将实现论文 BiDAF 中提出的双向注意力流模型。BiDAF 主要改进了传统注意力机制中的早期信息摘要问题,并引入了字符嵌入来加强对单词细粒度信息的理解。 1. 加载 SQuAD 数据…

ThreadLocal底层原理及数据结构详解

ThreadLocal允许为每个线程创建独立的变量副本,使得同一个ThreadLocal对象在不同的线程中拥有不同的值。它的主要作用是在并发环境下提供线程隔离,避免多个线程共享同一个变量,从而减少线程间的相互干扰。 ThreadLocal的核心在于为每个线程维…

【案例】距离限制模型透明

开发平台:Unity 2023 开发工具:Unity ShaderGraph   一、效果展示 二、路线图 三、案例分析 核心思路:计算算式:透明值 实际距离 / 最大距离 (实际距离 ≤ 最大距离)   3.1 说明 | 改变 Alpha 值 在 …

【JAVA开源】基于Vue和SpringBoot的服装生产管理系统

本文项目编号 T 066 ,文末自助获取源码 \color{red}{T066,文末自助获取源码} T066,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

git diff 查看到一行变动,但是目测无差异怎么办?

1. 目测无变化 直接用 git diff main.js 提示有一行变动,但是目测看不出来差异。 结果如图:up panel. 2. 大概是空格的问题,使用参数 --ws-error-highlightall $ git diff --ws-error-highlightall main.js结果如图: down panel.