深度学习框架:PyTorch使用教程 !!

文章目录

一、PyTorch框架简介

1.1 什么是PyTorch

1.2 PyTorch的优势

二、从入门到精通的PyTorch使用教程

2.1 入门阶段

2.1.1 环境安装与配置

2.1.2 Tensor基础操作

2.1.3 自动求导(Autograd)

2.1.4 构建神经网络(nn模块)

2.1.5 损失函数与优化器

2.2 进阶阶段

2.2.1 GPU加速与多GPU使用

2.2.2 数据加载与预处理(torch.utils.data)

2.2.3 自定义模型与层

2.2.4 模型调试与可视化

2.2.5 高级训练技巧

2.3 实战应用与精通

2.3.1 迁移学习与预训练模型

2.3.2 分布式训练和多机训练

2.3.3 模型优化与调参

2.3.4 实战项目示例

2.3.5 框架内部源码阅读与扩展

三、总结


一、PyTorch框架简介

1.1 什么是PyTorch

PyTorch是由Facebook的人工智能研究团队开发的一款开源深度学习框架。它基于Python语言开发,具有易用性、灵活性和高效性,主要特点包括:

动态计算图:与TensorFlow的静态图相比,PyTorch采用动态图机制(即运行时定义计算图),便于调试和开发复杂模型。

自动求导:内置强大的自动求导(Autograd)模块,可以自动计算梯度,极大简化了反向传播算法的实现。

丰富的API:提供了张量(Tensor)运算、神经网络层(nn模块)、优化器(optim模块)等丰富的工具和函数,方便快速搭建各种模型。

GPU加速:支持CUDA,可以方便地将数据和模型转移到GPU上加速运算。

1.2 PyTorch的优势

灵活性和易用性:由于采用动态图机制,用户可以像写常规Python程序一样定义和修改网络结构,非常适合科研探索与实验。

社区和生态系统:拥有活跃的开发者社区,提供大量的开源模型、工具包和教程。借助TorchVision、TorchText、TorchAudio等扩展库,可以更方便地进行图像、文本和音频的深度学习研究。

调试方便:动态计算图使得每一步计算都可以实时查看和修改,极大地方便了调试和模型理解。

二、从入门到精通的PyTorch使用教程

本教程将分为入门、进阶和实战应用三个阶段,每个阶段都有相应的代码示例与讲解。

2.1 入门阶段

2.1.1 环境安装与配置

打开PyTorch官方,选择合适的版本进行安装。

官网地址:Start Locally | PyTorch

  • 安装方式:可以通过 pip 或 conda 安装
pip install torch torchvision

或者

conda install pytorch torchvision cudatoolkit=11.3 -c pytorch
  • 验证安装:安装完成后,在Python环境中输入以下代码检查是否能正常导入:
import torchprint(torch.__version__)
2.1.2 Tensor基础操作
  • 创建Tensor:类似于numpy数组,但可以在GPU上运算。
import torch# 创建一个未初始化的 3x3 张量
x = torch.empty(3, 3)
print(x)# 创建一个随机初始化的张量
x = torch.rand(3, 3)
print(x)# 创建一个全 0 的张量,并指定数据类型为 long
x = torch.zeros(3, 3, dtype=torch.long)
print(x)
  • Tensor运算:支持加减乘除等多种运算,并且可以与numpy互转。
x = torch.rand(3, 3)
y = torch.rand(3, 3)
# 基本加法
z = x + y
# numpy 转换
np_array = x.numpy()
x_from_np = torch.from_numpy(np_array)
2.1.3 自动求导(Autograd)
  • 基本概念:利用Autograd模块,可以自动记录每一步运算过程,从而在反向传播时自动计算梯度。
# 定义一个 tensor,并设置 requires_grad=True
x = torch.ones(2, 2, requires_grad=True)
print(x)# 定义一个简单运算
y = x + 2
z = y * y * 3
out = z.mean()# 反向传播计算梯度
out.backward()
print(x.grad)
  • 注意:计算图在反向传播后默认会释放,如果需要多次反向传播,需要设置 retain_graph=True。
2.1.4 构建神经网络(nn模块)

nn.Module:所有神经网络模型都需要继承该类。

import torch.nn as nn
import torch.nn.functional as Fclass Net(nn.Module):def __init__(self):super(Net, self).__init__()# 定义一个全连接层:输入维度 784,输出维度 10self.fc1 = nn.Linear(784, 10)def forward(self, x):# 将输入 x 展平成 (batch_size, 784)x = x.view(-1, 784)x = self.fc1(x)return F.log_softmax(x, dim=1)net = Net()
print(net)
  • 层级组合:可以将多层组合在一起,形成更复杂的网络结构。
2.1.5 损失函数与优化器
  • 定义损失函数:例如交叉熵损失函数
criterion = nn.CrossEntropyLoss()
  • 选择优化器:例如SGD优化器
import torch.optim as optim
optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9)
  • 训练循环:
for epoch in range(10):for data, target in train_loader:optimizer.zero_grad()   # 清空梯度output = net(data)loss = criterion(output, target)loss.backward()         # 反向传播optimizer.step()        # 更新参数print(f"Epoch {epoch} finished with loss {loss.item()}")

2.2 进阶阶段

2.2.1 GPU加速与多GPU使用
  • 将模型和数据迁移到GPU:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
net.to(device)
data, target = data.to(device), target.to(device)
  • 多GPU并行:利用nn.DataParallel实现模型的多GPU训练。
if torch.cuda.device_count() > 1:net = nn.DataParallel(net)
2.2.2 数据加载与预处理(torch.utils.data)
  • 自定义数据集:继承 troch.utils.data.Dataset 并重写 __len__ 与 __getitem__ 方法。
from torch.utils.data import Dataset, DataLoaderclass MyDataset(Dataset):def __init__(self, data, labels):self.data = dataself.labels = labelsdef __len__(self):return len(self.data)def __getitem__(self, idx):sample = self.data[idx]label = self.labels[idx]return sample, labeldataset = MyDataset(data, labels)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
  • 常用预处理:使用 torchvision.transforms 对图像数据进行变换,如裁剪、归一化、随机翻转等。
2.2.3 自定义模型与层
  • 自定义层:除了使用内置的层,也可以根据需求自定义层或模块。
class MyLayer(nn.Module):def __init__(self, in_features, out_features):super(MyLayer, self).__init__()self.weight = nn.Parameter(torch.randn(in_features, out_features))def forward(self, x):return torch.matmul(x, self.weight)
  • 模块嵌套:在复杂模型中,可以将子模块封装在一起,实现层级化设计。
2.2.4 模型调试与可视化
  • 调试技巧:利用Python调试器(如pdb)或IDE自带的调试工具,对模型前向传播、反向传播过程进行跟踪。
  • 可视化:使用TensorBoardX或其他可视化工具,监视训练过程中损失、准确率等指标。
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter(log_dir='./logs')
writer.add_scalar('Loss/train', loss.item(), epoch)
2.2.5 高级训练技巧
  • 学习率调度:使用torch.optim.lr_scheduler 动态调整学习率,例如StepLR、ReduceLROnPlateau等。
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1)
for epoch in range(10):train(...)scheduler.step()
  • 模型保存与加载:
# 保存模型
torch.save(net.state_dict(), 'model.pth')
# 加载模型
net.load_state_dict(torch.load('model.pth'))
net.eval()  # 切换到评估模式

2.3 实战应用与精通

2.3.1 迁移学习与预训练模型
  • 利用预训练模型:借助 torchvision.models 中的预训练模型(如 ResNet、VGG),进行微调(fine-tuning)或特征提取。
import torchvision.models as models
resnet18 = models.resnet18(pretrained=True)
# 冻结部分参数
for param in resnet18.parameters():param.requires_grad = False
# 修改最后一层
num_features = resnet18.fc.in_features
resnet18.fc = nn.Linear(num_features, num_classes)
2.3.2 分布式训练和多机训练

分布式训练:利用torch.distributed 包,实现跨GPU、跨节点训练。常见方法包括:

  • DistributedDataParallel(DDP):在单机或多机多卡训练时比DataParallel更高效。
  • 使用 launch 工具:例如 torch.distributed.launch 脚本启动分布式训练任务。

代码示例:

import torch.distributed as dist
dist.init_process_group(backend='nccl')
net = nn.parallel.DistributedDataParallel(net)
2.3.3 模型优化与调参
  • 超参数搜索:利用网格搜索、随机搜索或贝叶斯优化等方法,对学习率、正则化系数等超参数进行调优。
  • 正则化技术:使用 Dropout、Batch Normalization 等方法,提高模型的泛化能力。
  • 混合精度训练:利用 torch.cuda.amp 实现混合精度训练,既能提升训练速度,又能降低显存占用。
scaler = torch.cuda.amp.GradScaler()
for data, target in train_loader:optimizer.zero_grad()with torch.cuda.amp.autocast():output = net(data)loss = criterion(output, target)scaler.scale(loss).backward()scaler.step(optimizer)scaler.update()
2.3.4 实战项目示例
  • 图像分类:利用CIFAR-10、IamgeNet数据集,搭建卷积神经网络(CNN)进行图像分类任务。
  • 自然语言处理:使用RNN、LSTM、Transformer等模型解决文本生成、机器翻译、情感分析等问题。
  • 生成对抗网络(GAN):构建生成器与判别器,进行图像生成任务,体验对抗训练的全过程。
2.3.5 框架内部源码阅读与扩展
  • 源码学习:深入阅读PyTorch的核心模块(如Autograd、nn.Module)源码,有助于理解其底层实现原理,从而更好地扩展或定制功能。
  • 扩展开发:基于PyTorch自定义C++扩展或Python API,结合高性能计算需求,打造个性化的深度学习工具。

三、总结

  • 入门阶段主要掌握 PyTorch 的基本概念、张量操作、自动求导、基本网络构建及训练流程;

  • 进阶阶段深入理解 GPU 加速、数据加载、调试、可视化、学习率调度等技巧,学会自定义模块和高效训练;

  • 实战应用则通过预训练模型、分布式训练、混合精度、超参数优化等高级技术,最终达到精通应用 PyTorch 解决实际问题的水平。

参考资料:矩阵空间,作者-码匠乐乐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统架构设计师:设计模式——创建型设计模式

一、创建型设计模式 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。 随着系统演化得越来越依赖于对象复合而不是类…

Dinero.js - 免费开源的 JavaScript 货币处理工具库,完美解决 JS 浮点数精度丢失问题

今天介绍一个在前后端处理货币的工具库,logo 很可爱,是一只蓝色的招财小猫。 本文封面图底图来自免费 AI 图库 StockCake。 Dinero.js 是一个用于货币计算的 JavaScript 工具库,解决开发者在金融、电商、会计等场景中处理货币时的精度丢失、…

HNUST湖南科技大学-嵌入式考试选择题题库(109道纠正详解版)

HNUST嵌入式选择题题库 1.下面哪点不是嵌入式操作系统的特点。(B) A.内核精简 B.功能强大 C.专用性强 D.高实时性 解析: 嵌入式操作系统特点是内核精简、专用性强、高实时性,而"功能强大"通常指的是通用操作系统&#x…

【工具】Windows批量文件复制教程:用BAT脚本自动化文件管理

一、引言 在日常开发与部署过程中,文件的自动化复制是一个非常常见的需求。无论是在构建过程、自动部署,还是备份任务中,开发者经常需要将某个目录中的 DLL、配置文件、资源文件批量复制到目标位置。相比使用图形界面的复制粘贴操作&#xf…

xray-poc编写示例

禁止未授权扫描和测试行为!!! 1. SQL 时间盲注检测 (Time-Based Blind SQLi) name: generic/time-based-sqli rules:- method: GETpath: "/product?id1 AND (SELECT 1 FROM (SELECT SLEEP(5))a)--"expression: |response.status…

【Day 14】HarmonyOS分布式数据库实战

一、分布式数据库基础 1. 核心概念速记表 术语解释示例场景分布式数据库数据自动同步到同账号设备手机添加商品→平板立即显示KV数据模型键值对存储(类似JSON){"cart_item1": {"name":"牛奶","price":10}}数据…

【数据结构】- 栈

前言: 经过了几个月的漫长岁月,回头时年迈的小编发现,数据结构的内容还没有写博客,于是小编赶紧停下手头的活动,补上博客以洗清身上的罪孽 目录 前言: 栈的应用 括号匹配 逆波兰表达式 数制转换 栈的实…

TDA4VM SDK J721E (RTOS/Linux) bootloaders梳理笔记

文章目录 1. 前言2. RTOS BootLoader2.1 引导模式2.2 启动序列2.2.1 流程框图2.2.2 Memory map2.3 镜像格式详解3. Linux BootLoader镜像格式详解启动流程参考1. 前言 TDA4VM的BootLoader包含两部分:RTOS的和Linux的。 2. RTOS BootLoader 这是在SoC上的所有内核运行FreeRTO…

Spring Boot + MyBatis-Plus 的现代开发模式

之前的Maven项目和本次需要的环境配置并不一样 之前使用的是: 传统的 MyBatis 框架(非 Spring Boot 环境) 手动管理 SqlSession 使用了 .xml 的 Mapper 映射文件 没有 Spring 容器管理(没有 Service / RestController 等&…

【Quest开发】极简版!透视环境下抠出身体并能遮挡身体上的服装

前两天发了一个很复杂的版本,又鼓捣了一下发现完全没有必要。我之前的理解有点偏(不是错误的但用法错了),但是有一些小伙伴收藏了,害怕里面的某些东西对谁有用,所以写了一篇新的,前两步配置环境…

vue 常见ui库对比(element、ant、antV等)

Element UI 1. 简介 Element UI 是一个基于 Vue 2 和 Vue 3 的企业级 UI 组件库,提供了丰富的组件和主题定制功能。官方网站:Element UI 2. 主要特点 丰富的组件:包括表单、表格、布局、导航、弹窗等多种组件。主题定制:支持主…

MATLAB画一把伞

% 伞的参数num_ribs 5; % 伞骨数量修改为5R 1; % 伞的半径height 0.5; % 伞的高度handle_length 2; % 伞柄长度semicircle_radius 0.26; % 伞柄末端半圆的半径% 生成伞叶网格theta linspace(0, 2*pi, 100);phi linspace(0, pi/2, 50);[Theta, Phi] meshgrid(theta, phi…

如何在 Go 中实现各种类型的链表?

链表是动态内存分配中最常见的数据结构之一。它由一组有限的元素组成,每个元素(节点)至少占用两块内存:一块用于存放数据,另一块用于存放指向下一个节点的指针。本文教程将说明在 Go 语言中如何借助指针和结构体类型来…

新一代机载相控阵雷达的发展

相控阵雷达以其优越的性能在军事领域中有着广阔的应用前景,但由于复杂的技术、昂贵的造价使其应用范围还存在一定的局限性。然而,国内外对相控阵技术的研究非常重视,并取得了丰硕的成果。 军用相控阵雷达主要分为陆基、海基和空基几种类型。 …

多数元素题解(LC:169)

169. 多数元素 核心思想(Boyer-Moore 投票算法): 解题思路:可以使用 Boyer-Moore 投票算法、该算法的核心思想是: 维护一个候选元素和计数器、初始时计数器为 0。 遍历数组: 当计数器为 0 时、设置当前元…

数据库 AI 助手测评:Chat2DB、SQLFlow 等工具如何提升开发效率?

一、引言:数据库开发的 “效率革命” 正在发生 在某互联网金融公司的凌晨故障现场,资深 DBA 正满头大汗地排查一条执行超时的 SQL—— 该语句涉及 7 张核心业务表的复杂关联,因索引缺失导致全表扫描,最终引发交易系统阻塞。这类场景在传统数据库开发中屡见不鲜:据 Gartne…

【中间件】bthread效率为什么高?

bthread效率为什么更高? 1 基本概念 bthread是brpc中的用户态线程(也可称为M:N线程库),目的是:提高程序的并发度,同时降低编码难度,在多核cpu上提供更好的scalability和cache locality。其采用…

DeepSeek V2:引入MLA机制与指令对齐

长上下文革命:Multi-Head Latent Attention(MLA)机制 传统 Transformer 的多头注意力需要缓存所有输入token的 Key 和 Value,这对长文本推理时的内存开销极为庞大。DeepSeek V2 针对这一难题提出了“Multi-Head Latent Attention”(MLA)机制。MLA 的核心思想是对多头注意…

Druid监控sql导致的内存溢出--内存分析工具MemoryAnalyzer(mat)

问题 druid监控sql在网页端显示&#xff0c;我的服务插入sql比较大&#xff0c;druid把执行过的sql保存在DruidDataSource类的成员变量JdbcDataSourceStat dataSourceStat&#xff1b; JdbcDataSourceStat类中的LinkedHashMap<String, JdbcSqlStat> sqlStatMap中&#…

《Python实战进阶》No45:性能分析工具 cProfile 与 line_profiler

Python实战进阶 No45&#xff1a;性能分析工具 cProfile 与 line_profiler 摘要 在AI模型开发中&#xff0c;代码性能直接影响训练效率和资源消耗。本节通过cProfile和line_profiler工具&#xff0c;实战演示如何定位Python代码中的性能瓶颈&#xff0c;并结合NumPy向量化操作…