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/cu118

3.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) + b

5. 自动微分

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,开发者可以快速构建和部署各种深度学习模型,为实际应用提供智能解决方案。

分页导航

下一页 →