PyTorch入门与基础概念
1. PyTorch简介
PyTorch是由Facebook(现Meta)开发和维护的开源深度学习框架,专注于灵活性和易用性。自2016年发布以来,PyTorch已经成为研究领域最受欢迎的深度学习框架之一,也逐渐在生产环境中得到广泛应用。
1.1 PyTorch的历史
- 2016年10月:Facebook开源PyTorch 0.1版本
- 2018年4月:发布PyTorch 1.0版本,引入TorchScript
- 2020年10月:发布PyTorch 1.7版本,增强了对CUDA的支持
- 2022年3月:发布PyTorch 1.11版本,引入FSDP(完全分片数据并行)
- 2023年:发布PyTorch 2.0版本,引入编译优化和新的并行策略
1.2 PyTorch的特点
- 动态计算图:支持动态构建计算图,便于调试和灵活开发
- 强大的自动微分系统:基于磁带的自动微分,支持复杂的梯度计算
- Python友好:与Python生态系统无缝集成,使用Pythonic的API
- 丰富的生态系统:TorchVision、TorchText、TorchAudio等扩展库
- 高性能:优化的C++后端,支持CUDA加速
- 易于部署:支持模型导出和部署到各种环境
2. 核心概念
2.1 张量(Tensor)
张量是PyTorch中最基本的数据结构,类似于NumPy数组,但具有GPU加速能力。张量的维度称为阶(rank),例如:
- 0阶张量:标量(scalar)
- 1阶张量:向量(vector)
- 2阶张量:矩阵(matrix)
- n阶张量:高维数组
2.2 动态计算图(Dynamic Computation Graph)
PyTorch使用动态计算图,这意味着计算图是在运行时动态构建的,而不是像TensorFlow 1.x那样需要先定义静态图。这种设计使得PyTorch更加灵活,便于调试和动态控制流。
2.3 自动微分(Automatic Differentiation)
PyTorch的自动微分系统基于torch.autograd模块,使用磁带(tape)记录操作,然后反向遍历计算梯度。这对于训练神经网络非常重要。
2.4 变量(Variables)
在PyTorch中,张量本身就支持自动微分,不需要像早期版本那样使用专门的Variable类。通过设置requires_grad=True,可以追踪张量上的操作并计算梯度。
3. 安装与环境配置
3.1 安装PyTorch
# 安装CPU版本
pip install torch torchvision torchaudio
# 安装GPU版本(需要CUDA支持)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu1183.2 验证安装
import torch
print(torch.__version__)
print(torch.cuda.is_available())
if torch.cuda.is_available():
print(torch.cuda.get_device_name(0))3.3 环境要求
- Python 3.7-3.10
- CUDA 11.7+(GPU版本)
- cuDNN 8.5+(GPU版本)
4. 基本操作
4.1 创建张量
# 创建标量
s = torch.tensor(42)
# 创建向量
v = torch.tensor([1, 2, 3, 4, 5])
# 创建矩阵
m = torch.tensor([[1, 2], [3, 4]])
# 创建高维张量
t = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
# 创建随机张量
rand_tensor = torch.rand(3, 3)
# 创建全零张量
zero_tensor = torch.zeros(2, 3)
# 创建全一张量
one_tensor = torch.ones(2, 3)4.2 张量操作
# 基本运算
a = torch.tensor(5)
b = torch.tensor(3)
add = a + b # 加法
sub = a - b # 减法
mul = a * b # 乘法
div = a / b # 除法
# 矩阵运算
m1 = torch.tensor([[1, 2], [3, 4]])
m2 = torch.tensor([[5, 6], [7, 8]])
dot = torch.matmul(m1, m2) # 矩阵乘法
# 张量形状操作
t = torch.rand(2, 3)
resized = t.view(3, 2) # 改变形状
flattened = t.flatten() # 展平
# 索引和切片
t = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(t[0, 1]) # 访问单个元素
print(t[:, 1]) # 访问整列
print(t[1:, :2]) # 访问子矩阵4.3 变量操作
# 创建需要梯度的张量
w = torch.randn(2, 3, requires_grad=True)
b = torch.zeros(3, requires_grad=True)
# 执行操作
y = torch.matmul(torch.randn(4, 2), w) + b
loss = y.sum()
# 计算梯度
loss.backward()
# 访问梯度
print(w.grad)
print(b.grad)
# 禁止梯度追踪
with torch.no_grad():
y = torch.matmul(torch.randn(4, 2), w) + b5. 自动微分
5.1 计算梯度
# 定义函数
def f(x):
return x ** 2
# 计算梯度
x = torch.tensor(3.0, requires_grad=True)
y = f(x)
y.backward()
print(x.grad) # 输出: tensor(6.)5.2 多变量梯度
def f(x, y):
return x ** 2 + y ** 2
x = torch.tensor(3.0, requires_grad=True)
y = torch.tensor(4.0, requires_grad=True)
z = f(x, y)
z.backward()
print(x.grad) # 输出: tensor(6.)
print(y.grad) # 输出: tensor(8.)5.3 梯度累积
# 梯度累积示例
x = torch.tensor(1.0, requires_grad=True)
# 第一次前向传播
y = x * 2
y.backward()
print(x.grad) # 输出: tensor(2.)
# 第二次前向传播(不清除梯度)
y = x * 2
y.backward()
print(x.grad) # 输出: tensor(4.) # 梯度累积
# 清除梯度
x.grad.zero_()
y = x * 2
y.backward()
print(x.grad) # 输出: tensor(2.) # 梯度已清除6. 线性回归示例
6.1 数据准备
import numpy as np
# 生成随机数据
X = np.random.rand(100, 1)
y = 2 * X + 1 + np.random.randn(100, 1) * 0.1
# 转换为张量
X = torch.tensor(X, dtype=torch.float32)
y = torch.tensor(y, dtype=torch.float32)6.2 模型定义
# 定义参数
w = torch.randn(1, 1, requires_grad=True)
b = torch.zeros(1, requires_grad=True)
# 定义模型
def model(X):
return torch.matmul(X, w) + b
# 定义损失函数
def loss(y_true, y_pred):
return torch.mean(torch.square(y_true - y_pred))6.3 训练模型
# 优化器
optimizer = torch.optim.SGD([w, b], lr=0.01)
# 训练循环
epochs = 1000
for epoch in range(epochs):
# 前向传播
y_pred = model(X)
current_loss = loss(y, y_pred)
# 反向传播
optimizer.zero_grad() # 清除梯度
current_loss.backward() # 计算梯度
optimizer.step() # 更新参数
if epoch % 100 == 0:
print(f"Epoch {epoch}, Loss: {current_loss.item()}")
# 打印结果
print(f"训练后参数: w={w.item()}, b={b.item()}")7. 总结与展望
本教程介绍了PyTorch的基本概念和使用方法,包括张量、动态计算图、自动微分等核心概念,以及如何使用PyTorch实现线性回归模型。
PyTorch是一个灵活强大的深度学习框架,它的动态计算图设计使得模型开发和调试更加直观。在后续教程中,我们将深入探讨PyTorch的高级功能,如神经网络、模型保存和加载、分布式训练等。
通过学习PyTorch,开发者可以快速构建和部署各种深度学习模型,为实际应用提供智能解决方案。