宿州市浔绾网

Python Pytorch包详解

2026-03-25 15:22:02 浏览次数:1
详细信息

PyTorch 包详解

PyTorch 是一个基于 Torch 的开源机器学习框架,由 Facebook 的人工智能研究团队开发。它提供了两个核心功能:

强大的 GPU 加速张量计算 基于自动微分系统的深度神经网络

一、核心组件

1. Tensor(张量)

PyTorch 的基础数据结构,类似于 NumPy 的 ndarray,但支持 GPU 加速。

import torch

# 创建张量
x = torch.tensor([1, 2, 3])
x = torch.randn(2, 3)  # 随机张量
x = torch.zeros(3, 4)  # 零张量
x = torch.ones(2, 2)   # 单位张量

# 张量操作
y = x + 2
z = torch.mm(x, y.T)  # 矩阵乘法

2. Autograd(自动微分)

PyTorch 的核心特性,自动计算梯度。

# 创建需要梯度的张量
x = torch.tensor([1., 2., 3.], requires_grad=True)

# 进行计算
y = x ** 2
z = y.sum()

# 反向传播计算梯度
z.backward()
print(x.grad)  # 输出: tensor([2., 4., 6.])

二、神经网络模块

1. torch.nn 模块

构建神经网络的核心模块。

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)
        self.relu = nn.ReLU()           # 激活函数
        self.dropout = nn.Dropout(0.2)  # Dropout层

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

# 常用层类型
conv = nn.Conv2d(1, 32, 3)    # 卷积层
pool = nn.MaxPool2d(2)        # 池化层
lstm = nn.LSTM(10, 20, 2)     # LSTM层
batch_norm = nn.BatchNorm2d(3) # 批量归一化

2. 激活函数

relu = nn.ReLU()
sigmoid = nn.Sigmoid()
tanh = nn.Tanh()
leaky_relu = nn.LeakyReLU(0.01)
softmax = nn.Softmax(dim=1)

三、优化器

import torch.optim as optim

model = Net()
criterion = nn.CrossEntropyLoss()  # 损失函数

# 各种优化器
optimizer = optim.SGD(model.parameters(), lr=0.01)
optimizer = optim.Adam(model.parameters(), lr=0.001)
optimizer = optim.RMSprop(model.parameters(), lr=0.01)
optimizer = optim.Adagrad(model.parameters(), lr=0.01)

# 学习率调度器
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)

四、数据加载与处理

1. torch.utils.data

from torch.utils.data import DataLoader, Dataset, TensorDataset

# 自定义数据集
class CustomDataset(Dataset):
    def __init__(self, data, labels):
        self.data = data
        self.labels = labels

    def __len__(self):
        return len(self.data)

    def __getitem__(self, idx):
        return self.data[idx], self.labels[idx]

# 创建数据加载器
dataset = CustomDataset(x, y)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)

2. torchvision(计算机视觉专用)

import torchvision
import torchvision.transforms as transforms

# 数据转换
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])
])

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

五、模型训练示例

def train(model, dataloader, criterion, optimizer, epochs=10):
    model.train()
    for epoch in range(epochs):
        running_loss = 0.0
        for batch_idx, (data, target) in enumerate(dataloader):
            optimizer.zero_grad()  # 梯度清零

            # 前向传播
            output = model(data)
            loss = criterion(output, target)

            # 反向传播
            loss.backward()
            optimizer.step()

            running_loss += loss.item()

        print(f'Epoch {epoch+1}, Loss: {running_loss/len(dataloader):.4f}')

六、GPU 加速

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

# 将模型和数据移动到GPU
model = Net().to(device)
data = data.to(device)
target = target.to(device)

# 多GPU训练
if torch.cuda.device_count() > 1:
    model = nn.DataParallel(model)

七、保存和加载模型

# 保存模型
torch.save(model.state_dict(), 'model.pth')

# 加载模型
model.load_state_dict(torch.load('model.pth'))

# 保存整个模型
torch.save(model, 'model_full.pth')

# 保存训练检查点
checkpoint = {
    'epoch': epoch,
    'model_state_dict': model.state_dict(),
    'optimizer_state_dict': optimizer.state_dict(),
    'loss': loss,
}
torch.save(checkpoint, 'checkpoint.pth')

八、高级特性

1. 混合精度训练

from torch.cuda.amp import autocast, GradScaler

scaler = GradScaler()

with autocast():
    output = model(input)
    loss = criterion(output, target)

scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()

2. 分布式训练

import torch.distributed as dist
import torch.multiprocessing as mp

def setup(rank, world_size):
    dist.init_process_group("nccl", rank=rank, world_size=world_size)

3. TorchScript(模型部署)

# 转换为 TorchScript
scripted_model = torch.jit.script(model)
scripted_model.save('model_scripted.pt')

# 跟踪模型
traced_model = torch.jit.trace(model, example_input)

九、实用工具

1. 可视化(需要安装 tensorboard)

from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter()
writer.add_graph(model, input_tensor)
writer.add_scalar('Loss/train', loss, epoch)

2. 性能分析

with torch.profiler.profile(
    activities=[
        torch.profiler.ProfilerActivity.CPU,
        torch.profiler.ProfilerActivity.CUDA,
    ]
) as prof:
    model(input)
print(prof.key_averages().table())

十、PyTorch Lightning(简化训练的高级框架)

import pytorch_lightning as pl

class LitModel(pl.LightningModule):
    def __init__(self):
        super().__init__()
        self.model = Net()
        self.criterion = nn.CrossEntropyLoss()

    def training_step(self, batch, batch_idx):
        x, y = batch
        y_hat = self.model(x)
        loss = self.criterion(y_hat, y)
        return loss

    def configure_optimizers(self):
        return optim.Adam(self.parameters(), lr=0.001)

# 训练
trainer = pl.Trainer(max_epochs=10)
trainer.fit(model, dataloader)

总结

PyTorch 的主要优势:

动态计算图:更灵活的模型构建和调试 Pythonic 设计:易于学习和使用 强大的社区支持:丰富的预训练模型和工具 与 Python 生态无缝集成:与 NumPy、SciPy 等库兼容

PyTorch 特别适合研究原型开发和实验性工作,同时在生产环境中也有完善的部署方案。

相关推荐