PyTorch快速入门

发布于:2025-08-08 ⋅ 阅读:(10) ⋅ 点赞:(0)

一、PyTorch简介

1.1 什么是PyTorch

PyTorch是一个基于Python的深度学习框架,由Facebook人工智能研究院(FAIR)于2016年正式发布。它将数据封装成张量(Tensor)进行处理,提供了构建、训练和部署机器学习模型的完整工具链。与其他框架相比,PyTorch的动态计算图机制让模型调试更直观,API设计更贴近Python习惯,极大降低了深度学习的入门门槛。

1.2 核心特点

  • 动态计算图:运行时可动态修改计算流程,便于调试和灵活构建复杂模型
  • GPU加速:通过CUDA实现高效的GPU计算,大幅提升训练速度
  • 自动微分torch.autograd模块支持自动计算梯度,简化反向传播实现
  • 丰富的深度学习组件:内置大量预定义层、损失函数和优化器
  • 跨平台支持:兼容CPU、GPU等多种硬件,支持Linux、Windows和macOS系统

1.3 安装方法

使用pip即可快速安装PyTorch:

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

如果需要安装GPU版,请去官网下载GPU对应版本的PyTorch:官网链接

在这里插入图片描述


二、核心数据结构:张量(Tensor)

张量是PyTorch中最基础的数据结构,可理解为多维数组。与NumPy数组相比,张量支持GPU加速和自动微分,是深度学习计算的核心载体。

2.1 张量的创建

1. 基础创建方法

  • torch.tensor(data, dtype=None):根据数据创建张量

    import torch
    
    # 创建标量张量
    scalar = torch.tensor(10)
    
    # 从列表创建张量
    tensor_from_list = torch.tensor([[1., 2.], [3., 4.]])
    
    # 从NumPy数组创建张量
    import numpy as np
    np_array = np.array([1, 2, 3])
    tensor_from_np = torch.tensor(np_array)
    
  • torch.Tensor(size):根据形状创建未初始化张量(默认float32类型)

    # 创建2行3列的张量
    empty_tensor = torch.Tensor(2, 3)
    
  • 特定类型张量创建:

    # 创建int32类型张量
    int_tensor = torch.IntTensor([1, 2, 3])
    
    # 创建float64类型张量
    double_tensor = torch.DoubleTensor([1.1, 2.2])
    

2. 特殊张量创建

  • 全零张量:torch.zeros(size)torch.zeros_like(input)

    # 创建3行2列的全零张量
    zeros = torch.zeros(3, 2)
    
    # 根据已有张量形状创建全零张量
    zeros_like = torch.zeros_like(zeros)
    
  • 全一张量:torch.ones(size)torch.ones_like(input)

    ones = torch.ones(2, 2)
    
  • 指定值张量:torch.full(size, fill_value)

    # 创建填充值为5的2x2张量
    filled = torch.full((2, 2), 5)
    

3. 线性与随机张量

  • 线性序列:torch.arange(start, end, step)torch.linspace(start, end, steps)

    # 创建0到10(不包含10)步长为2的序列
    arange_tensor = torch.arange(0, 10, 2)  # tensor([0, 2, 4, 6, 8])
    
    # 创建0到9的10个均匀分布的数
    linspace_tensor = torch.linspace(0, 9, 10)
    
  • 随机张量:

    # 标准正态分布随机数
    randn_tensor = torch.randn(2, 3)
    
    # [0, 1)均匀分布随机数
    rand_tensor = torch.rand(2, 3)
    
    # [low, high)区间整数随机数
    randint_tensor = torch.randint(0, 10, (2, 3))
    

2.2 张量类型转换

  • 张量转NumPy数组:tensor.numpy()(注意:共享内存)

    tensor = torch.tensor([1, 2, 3])
    np_array = tensor.numpy()
    
    # 避免共享内存
    np_array_copy = tensor.numpy().copy()
    
  • NumPy数组转张量:

    # 共享内存
    tensor_from_np = torch.from_numpy(np_array)
    
    # 不共享内存
    tensor_from_np = torch.tensor(np_array)
    
  • 标量张量提取数值:tensor.item()

    scalar_tensor = torch.tensor(100)
    value = scalar_tensor.item()  # 100
    

三、张量运算API

3.1 基本算术运算

PyTorch提供了丰富的张量运算函数,支持元素级操作和矩阵运算。

  • 基础运算(add/sub/mul/div/neg):
    a = torch.tensor([1, 2, 3])
    b = torch.tensor([4, 5, 6])
    
    # 加法
    c = a.add(b)  # 等价于 a + b
    
    # 减法
    c = a.sub(b)  # 等价于 a - b
    
    # 乘法(元素级)
    c = a.mul(b)  # 等价于 a * b
    
    # 除法
    c = a.div(b)  # 等价于 a / b
    
    # 取负
    c = a.neg()   # 等价于 -a
    

注意:带下划线的方法(如add_)会直接修改原张量

3.2 矩阵运算

  • 矩阵乘法:torch.matmul(input, other)@ 运算符
    # 3x2 矩阵与 2x4 矩阵相乘,结果为3x4矩阵
    mat1 = torch.randn(3, 2)
    mat2 = torch.randn(2, 4)
    result = torch.matmul(mat1, mat2)
    # 等价于 result = mat1 @ mat2
    

3.3 用运算函数

  • 统计函数:

    tensor = torch.tensor([[1., 2.], [3., 4.]])
    
    # 均值(dim=0按列计算,dim=1按行计算)
    mean = tensor.mean()          # 整体均值
    mean_col = tensor.mean(dim=0) # 按列均值
    
    # 求和
    sum_all = tensor.sum()
    sum_row = tensor.sum(dim=1)
    
    # 最大值/最小值
    max_val = tensor.max()
    min_val = tensor.min()
    
  • 其他常用函数:

    # 平方根
    sqrt_tensor = tensor.sqrt()
    
    # 平方
    pow_tensor = tensor.pow(2)  # 等价于 tensor **2
    
    # 指数(e^x)
    exp_tensor = tensor.exp()
    
    # 对数(自然对数)
    log_tensor = tensor.log()
    

四、张量形状操作

4.1 形状查看与修改

  • 查看形状:tensor.shapetensor.size()

    tensor = torch.randn(2, 3)
    print(tensor.shape)  # torch.Size([2, 3])
    
  • 重塑形状:tensor.reshape(new_shape)

    # 将2x3张量重塑为1x6张量
    reshaped = tensor.reshape(1, 6)
    

4.2 维度操作

  • 增加维度:tensor.unsqueeze(dim)

    # 在0维度增加一个维度
    unsqueezed = tensor.unsqueeze(0)  # 形状变为(1, 2, 3)
    
  • 减少维度:tensor.squeeze(dim)(移除大小为1的维度)

    # 移除0维度
    squeezed = unsqueezed.squeeze(0)  # 恢复为(2, 3)
    

4.3 维度交换

  • 交换两个维度:torch.transpose(input, dim0, dim1)

    # 交换1和2维度
    transposed = torch.transpose(tensor, 1, 2)
    
  • 多维度交换:tensor.permute(dims)

    # 将(2, 3, 4)张量的维度顺序改为(3, 4, 2)
    permuted = tensor.permute(1, 2, 0)
    

4.4 张量拼接

  • 沿现有维度拼接:torch.cat(tensors, dim)

    tensor1 = torch.randn(2, 3)
    tensor2 = torch.randn(2, 3)
    
    # 按0维度拼接(结果为4x3)
    concatenated = torch.cat([tensor1, tensor2], dim=0)
    
  • 新增维度拼接:torch.stack(tensors, dim)

    # 新增0维度拼接(结果为2x2x3)
    stacked = torch.stack([tensor1, tensor2], dim=0)
    

五、自动微分模块(autograd)

自动微分是PyTorch的核心功能之一,能够自动计算张量的梯度,为反向传播提供支持。

5.1 基本使用方法

1.** 标记需要求导的张量 **:设置requires_grad=True

x = torch.tensor(2.0, requires_grad=True)

2.** 构建计算图 **:

y = x** 2 + 3 * x + 1  # y = x² + 3x + 1
  1. 计算梯度tensor.backward()
    y.backward()  # 计算梯度
    print(x.grad)  # 输出x的梯度值(2x + 3 在x=2时为7)
    

5.2 梯度下降示例

# 初始化参数
x = torch.tensor(10.0, requires_grad=True)

# 迭代优化
for i in range(1000):
    # 定义函数 y = x² + 20
    y = x **2 + 20
    
    # 梯度清零
    if x.grad is not None:
        x.grad.zero_()
    
    # 反向传播计算梯度
    y.backward()
    
    # 更新参数(学习率0.01)
    x.data = x.data - 0.01 * x.grad

print(f"最优解 x = {x.item()}, y = {y.item()}")  # 接近x=0, y=20

5.3 注意事项

  • 只有标量张量可以直接调用backward(),向量张量需要先求和
  • 梯度会累加,每次反向传播前需调用grad.zero_()清零
  • requires_grad=True的张量不能直接转换为NumPy数组,需先用detach()方法
    numpy_array = x.detach().numpy()
    

六、线性回归模型构建示例

下面通过一个完整的线性回归示例,展示PyTorch API的综合应用:

import torch
from torch.utils.data import TensorDataset, DataLoader
from torch import nn, optim
import matplotlib.pyplot as plt

# 1. 准备数据
x = torch.linspace(-10, 10, 100).reshape(-1, 1)
y = 2 * x + 3 + torch.randn_like(x) * 2  # y=2x+3加噪声

# 构建数据集和数据加载器
dataset = TensorDataset(x, y)
dataloader = DataLoader(dataset, batch_size=16, shuffle=True)

# 2. 定义模型
model = nn.Linear(in_features=1, out_features=1)  # 线性层 y = wx + b

# 3. 定义损失函数和优化器
criterion = nn.MSELoss()  # 均方误差损失
optimizer = optim.SGD(model.parameters(), lr=0.01)  # 随机梯度下降

# 4. 模型训练
epochs = 100
losses = []

for epoch in range(epochs):
    total_loss = 0
    for batch_x, batch_y in dataloader:
        # 前向传播
        y_pred = model(batch_x.float())
        
        # 计算损失
        loss = criterion(y_pred, batch_y.float())
        total_loss += loss.item()
        
        # 反向传播与参数更新
        optimizer.zero_grad()  # 梯度清零
        loss.backward()        # 计算梯度
        optimizer.step()       # 更新参数
    
    losses.append(total_loss / len(dataloader))

# 打印训练结果
print(f"训练后的参数: w={model.weight.item()}, b={model.bias.item()}")

# 绘制损失曲线
plt.plot(losses)
plt.title("损失变化曲线")
plt.show()

七、总结

PyTorch凭借其简洁的API和灵活的特性,成为深度学习领域的重要工具。本文介绍了PyTorch的核心概念和常用API,包括张量创建、运算、形状操作和自动微分等功能。掌握这些基础操作后,你可以进一步探索PyTorch在计算机视觉(torchvision)、自然语言处理(torchaudio)等领域的高级应用。

PyTorch的学习曲线相对平缓,建议通过实际项目练习加深理解,逐步掌握更复杂的模型构建和训练技巧。


网站公告

今日签到

点亮在社区的每一天
去签到