PyTorch

PyTorch是一个开源的机器学习库,广泛用于计算机视觉和自然语言处理等应用。它由Facebook的AI研究团队开发,并得到了全球开发者社区的广泛支持。

1. PyTorch的本质

无论做什么,PyTorch的底层本质可以归结为两点:

PyTorch是一个动态图框架,意味着:

2. 张量(Tensor)操作(核心对象)

2.1 创建Tensor

共性:任何数据(标量、向量、矩阵、多维数组)都可以转为torch.Tensor
常用方式:

import torch
# 直接创建
x = torch.tensor([1, 2, 3])

# 创建指定大小,随机数填充
rand = torch.rand(2, 3)  # [0, 1)均匀分布
randn = torch.randn(2, 3)  # 标准正态分布

# 全0或全1
zeros = torch.zeros(2, 3)
ones = torch.ones(2, 3)

# 指定数据类型
float_tensor = torch.tensor([1, 2, 3], dtype=torch.float32)

# 和 numpy 互转
import numpy as np
a = np.array([1, 2, 3])
b = torch.from_numpy(a)  # numpy -> tensor
c = b.numpy()  # tensor -> numpy

不变的东西

2.2 Tensor常见属性

x.shape
x.dtype
x.device

共性:每个Tensor都有shape、dtype、device,任何操作必须保持一致或者有自动广播机制。

3. Tensor的基本运算

3.1 算术运算

+、-、*、/、** 等运算,支持逐元素操作

a = torch.tensor([1, 2])
b = torch.tensor([3, 4])

c = a + b  # 元素加
d = a * b  # 元素乘
e = a ** 2  # 幂

PyTorch保证:

3.2 矩阵运算

mat1 = torch.randn(2, 3)
mat2 = torch.randn(3, 4)
result = torch.matmul(mat1, mat2)  # 矩阵乘法

注意:*是逐元素,matmul是矩阵乘。

3.3 其他常用操作

# 改形状
x = torch.randn(4, 4)
y = x.view(2, 8)  # 或 reshape
# 合并
z = torch.cat((x, x), dim=0)

4. Autograd:自动求导(神经网络训练的核心)

每个Tensor都有一个requires_grad属性。

x = torch.ones(2, 2, requires_grad=True)
y = x + 2
z = y * y * 3
out = z.mean()

out.backward()  # 反向传播
print(x.grad)  # 查看x的梯度

不变的逻辑:

optimizer.zero_grad()  # 每次训练步骤前清梯度

5. 模型构建(神经网络基本框架)

PyTorch有一套torch.nn模块,抽象了神经网络层和损失函数。
常见套路(完全不变的框架):

5.1 定义模型

import torch.nn as nn

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(784, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

net = Net()

共性:

5.2 损失函数

criterion = nn.CrossEntropyLoss()

常见:

5.3 优化器

import torch.optim as optim

optimizer = optim.SGD(net.parameters(), lr=0.01)

6. 训练基本流程(固定套路)

无论任何模型,PyTorch训练流程都是固定的:

for epoch in range(num_epochs):
    for inputs, labels in dataloader:
        outputs = net(inputs)       # 正向
        loss = criterion(outputs, labels)  # 计算损失
        optimizer.zero_grad()       # 清除旧梯度
        loss.backward()             # 反向传播
        optimizer.step()            # 更新参数

共性:

7. 设备管理(CPU / GPU)

PyTorch张量可以在CPU或GPU上操作,且设备要统一

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = Net().to(device)
inputs = inputs.to(device)
labels = labels.to(device)

共性:

总结:PyTorch中所有共性、不变的东西

模块 本质 不变的规律
Tensor 多维数组 每个Tensor有shape、dtype、device
运算 张量逐元素或矩阵级运算 自动广播,遵循numpy风格
Autograd 计算图和梯度记录 backward从标量出发,grad默认累加
Module模型 层组合成网络 定义forward,继承nn.Module
优化 梯度下降 zero_grad ➔ backward ➔ step 顺序
设备管理 CPU/GPU切换 to(device)确保同一设备