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

AI开发学习之——PyTorch框架

PyTorch 简介

PyTorch (Python torch)是由 Facebook AI 研究团队开发的开源机器学习库,广泛应用于深度学习研究和生产。它以动态计算图和易用性著称,支持 GPU 加速计算,并提供丰富的工具和模块。

PyTorch的主要特点

  1. 动态计算图:PyTorch 使用动态计算图(Autograd),允许在运行时修改图结构,便于调试和实验。
  2. GPU 加速:支持 CUDA,能够利用 GPU 进行高效计算。
  3. 模块化设计:提供 torch.nn 等模块,便于构建和训练神经网络。
  4. 丰富的生态系统:包括 TorchVision、TorchText 和 TorchAudio 等,支持多种任务。、

PyTorch的安装

通过以下命令安装 PyTorch:

pip install torch torchvision

如果国内的速度慢,可以使用-i 参数使用国内的仓库源。

pip3 install torch -i https://pypi.tuna.tsinghua.edu.cn/simple

除了清华的源之外,也可以使用科大或是北外的数据源。

  • https://mirrors.bfsu.edu.cn/pypi/web/simple

  • https://mirrors.ustc.edu.cn/pypi/web/simple

使用示例

1. 张量操作
import torch

# 创建张量
x = torch.tensor([1.0, 2.0, 3.0])
y = torch.tensor([4.0, 5.0, 6.0])

# 加法
z = x + y
print(z)  # 输出: tensor([5., 7., 9.])

这里的输出为什么不是 tensor([5.0, 7.0, 9.0])呢?
在Python的浮点数表示中,.0后缀通常用于明确表示一个数是浮点数(float),而不是整数(int)。然而,在大多数情况下,Python和许多库(包括PyTorch,这里提到的tensor是由PyTorch生成的)在打印浮点数时,如果小数点后没有额外的数字,它们可能会省略.0后缀以简化输出。

当使用科学计算库如NumPy或PyTorch时,它们通常有统一的输出格式,尤其是在处理数组或tensor时。在你的例子中,tensor([5., 7., 9.])tensor([5.0, 7.0, 9.0])在数值上是完全相同的,只是表示形式略有不同。PyTorch选择省略小数点后没有数字的.0后缀,以使输出更简洁。

这种输出格式的选择主要是出于可读性和简洁性的考虑,并不影响tensor中存储的实际数值。在数值计算中,5.5.0都被视为浮点数,并且在计算中没有任何区别。

2. 自动求导
import torch

# 创建需要梯度的张量
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)

# 定义函数
y = x * 2
z = y.mean()

# 反向传播
z.backward()

# 查看梯度
print(x.grad)  # 输出: tensor([0.6667, 0.6667, 0.6667])

这里的结果是怎么来的呢?

这段代码演示了 PyTorch 中的**自动微分(Autograd)**机制,通过计算梯度来实现反向传播。我们来逐步分析代码的运算过程。


1. 创建需要梯度的张量
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
  • x 是一个包含 [1.0, 2.0, 3.0] 的 1 阶张量(向量)。
  • requires_grad=True 表示 PyTorch 需要跟踪对 x 的所有操作,以便后续计算梯度。

2. 定义函数
y = x * 2
z = y.mean()
  • y = x * 2:对 x 逐元素乘以 2,得到 y = [2.0, 4.0, 6.0]
  • z = y.mean():计算 y 的均值,即:
    在这里插入图片描述

3. 反向传播
z.backward()
  • z.backward() 表示从 z 开始反向传播,计算 zx 的梯度。
  • 由于 z 是一个标量(单个值),PyTorch 会自动计算 zx 的梯度。

4. 梯度计算

PyTorch 通过链式法则计算梯度。具体步骤如下:

(1)计算 zy 的梯度

  • z = y.mean() 可以写成:
    在这里插入图片描述

  • 因此,zy 的梯度为:
    在这里插入图片描述

(2)计算 yx 的梯度

  • y = x * 2 可以写成:
    yi​=2xi​
  • 因此,yx 的梯度为:
    在这里插入图片描述

(3)计算 zx 的梯度
根据链式法则:
在这里插入图片描述

将结果代入:
在这里插入图片描述


5. 查看梯度
print(x.grad)  # 输出: tensor([0.6667, 0.6667, 0.6667])
  • x.grad 存储了 zx 的梯度,结果为:
    在这里插入图片描述

总结

这段代码的运算过程如下:

  1. 创建需要梯度的张量 x
  2. 定义函数 y = x * 2z = y.mean()
  3. 通过 z.backward() 计算 zx 的梯度。
  4. 根据链式法则,梯度计算结果为 [0.6667, 0.6667, 0.6667]

PyTorch 的自动微分机制使得梯度计算变得非常简单,尤其是在深度学习模型中,这种机制可以自动计算损失函数对模型参数的梯度,从而支持梯度下降等优化算法。

3. 简单神经网络
import torch
import torch.nn as nn
import torch.optim as optim

# 定义网络
class SimpleNet(nn.Module):
    def __init__(self):
        super(SimpleNet, self).__init__()
        self.fc = nn.Linear(1, 1)

    def forward(self, x):
        return self.fc(x)

# 创建网络、损失函数和优化器
model = SimpleNet()
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 训练数据
x = torch.tensor([[1.0], [2.0], [3.0], [4.0]])
y = torch.tensor([[2.0], [4.0], [6.0], [8.0]])

# 训练过程
for epoch in range(100):
    optimizer.zero_grad()
    outputs = model(x)
    loss = criterion(outputs, y)
    loss.backward()
    optimizer.step()

    if (epoch+1) % 10 == 0:
        print(f'Epoch [{epoch+1}/100], Loss: {loss.item():.4f}')
4. 使用 GPU
import torch

# 检查 GPU 是否可用
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# 创建张量并移动到 GPU
x = torch.tensor([1.0, 2.0, 3.0]).to(device)
y = torch.tensor([4.0, 5.0, 6.0]).to(device)

# 在 GPU 上执行加法
z = x + y
print(z)  # 输出: tensor([5., 7., 9.], device='cuda:0')

torchtorchvisiontorchaudio

torchtorchvisiontorchaudio 是 PyTorch 生态系统中的三个核心库,分别用于通用深度学习、计算机视觉和音频处理任务。以下是它们的详细介绍和作用:


1. torch

torch 是 PyTorch 的核心库,提供了深度学习的基础功能,包括张量操作、自动求导、神经网络模块等。

主要功能:
  • 张量操作:支持高效的张量计算(如加法、乘法、矩阵运算等)。
  • 自动求导:通过 Autograd 模块实现自动微分,便于梯度计算和优化。
  • 神经网络模块:提供 torch.nn 模块,包含各种层(如全连接层、卷积层)和损失函数。
  • 优化器:提供 torch.optim 模块,包含 SGD、Adam 等优化算法。
  • GPU 加速:支持 CUDA,可以利用 GPU 进行高性能计算。
使用场景:
  • 构建和训练深度学习模型。
  • 实现自定义的数学运算和算法。
  • 进行张量计算和数值模拟。
示例:
import torch

# 创建张量
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)

# 定义计算
y = x * 2
z = y.mean()

# 自动求导
z.backward()

# 查看梯度
print(x.grad)  # 输出: tensor([0.6667, 0.6667, 0.6667])

2. torchvision

torchvision 是 PyTorch 的计算机视觉库,提供了常用的数据集、模型架构和图像处理工具。

主要功能:
  • 数据集:提供常用的计算机视觉数据集(如 MNIST、CIFAR-10、ImageNet)。
  • 模型架构:包含预训练的经典模型(如 ResNet、VGG、AlexNet)。
  • 图像处理工具:提供数据增强和转换工具(如裁剪、旋转、归一化)。
  • 实用工具:包括可视化工具和评估指标。
使用场景:
  • 图像分类、目标检测、分割等计算机视觉任务。
  • 加载和处理图像数据。
  • 使用预训练模型进行迁移学习。
示例:
import torchvision
import torchvision.transforms as transforms
from torchvision.models import resnet18

# 数据预处理
transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])

# 加载数据集
dataset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)

# 加载预训练模型
model = resnet18(pretrained=True)

3. torchaudio

torchaudio 是 PyTorch 的音频处理库,提供了音频数据的加载、处理和转换工具。

主要功能:
  • 音频加载和保存:支持多种音频格式(如 WAV、MP3)。
  • 音频处理:提供音频信号处理工具(如重采样、频谱图生成)。
  • 数据集:包含常用的音频数据集(如 LibriSpeech、VoxCeleb)。
  • 特征提取:支持提取 MFCC、Mel 频谱等音频特征。
使用场景:
  • 语音识别、语音合成、音频分类等任务。
  • 音频数据的预处理和特征提取。
  • 加载和处理音频数据集。
示例:
import torchaudio
import torchaudio.transforms as T

# 加载音频文件
waveform, sample_rate = torchaudio.load('example.wav')

# 重采样
resampler = T.Resample(orig_freq=sample_rate, new_freq=16000)
resampled_waveform = resampler(waveform)

# 提取 Mel 频谱
mel_spectrogram = T.MelSpectrogram(sample_rate=16000)(resampled_waveform)

三者的关系

  • torch 是核心库,提供基础功能(如张量计算、自动求导、神经网络模块)。
  • torchvision 是基于 torch 的扩展库,专注于计算机视觉任务。
  • torchaudio 是基于 torch 的扩展库,专注于音频处理任务。

三者可以结合使用,例如:

  • 使用 torchvision 处理图像数据,用 torch 构建和训练模型。
  • 使用 torchaudio 处理音频数据,用 torch 构建语音识别模型。

安装

可以通过以下命令安装这三个库:

pip install torch torchvision torchaudio

总结

  • torch:核心库,提供深度学习的基础功能。
  • torchvision:计算机视觉库,提供数据集、模型和图像处理工具。
  • torchaudio:音频处理库,提供音频加载、处理和特征提取工具。

三者共同构成了 PyTorch 的完整生态系统,适用于各种深度学习任务。




http://www.kler.cn/a/531748.html

相关文章:

  • Golang 并发机制-3:通道(channels)机制详解
  • 刷题汇总一览
  • Vue3的el-table-column下拉输入实时查询API数据选择的实现方法
  • 如何利用DeepSeek打造医疗领域专属AI助手?从微调到部署全流程解析
  • 一个开源 GenBI AI 本地代理(确保本地数据安全),使数据驱动型团队能够与其数据进行互动,生成文本到 SQL、图表、电子表格、报告和 BI
  • Elasticsearch的索引生命周期管理
  • Java控制台登录系统示例代码
  • nginx 新手指南
  • 强化学习数学原理(五)——随机近似与随机
  • 携程Java开发面试题及参考答案 (200道-下)
  • 分享半导体Fab 缺陷查看系统,平替klarity defect系统
  • 【leetcode练习·二叉树拓展】快速排序详解及应用
  • 蓝桥与力扣刷题(234 回文链表)
  • PHP代码审计学习02
  • Vue-data数据
  • WebSocket——netty实现websocket编码
  • JDK 8 的HashMap扩容源代码分析
  • 【自学笔记】GitHub的重点知识点-持续更新
  • 让万物「听说」:AI 对话式智能硬件方案和发展洞察
  • Ada语言的数据库交互
  • 《LLM大语言模型深度探索与实践:构建智能应用的新范式,融合代理与数据库的高级整合》
  • 一文了解硅基流动(SiliconCloud):有前景的大模型云服务平台
  • 为AI聊天工具添加一个知识系统 之83 详细设计之25 度量空间之2 知识树
  • Spring Boot框架下的单元测试
  • 3 Yarn
  • JAVA实战开源项目:学科竞赛管理系统(Vue+SpringBoot) 附源码