PyTorch 是一个基于 Python 的科学计算包,主要面向两类人群:
- 作为 NumPy 的替代,利用 GPU 的强大计算能力
- 提供最大灵活性和速度的深度学习研究平台
核心概念 #
1. 张量 (Tensors) #
PyTorch 的核心数据结构是张量,类似于 NumPy 的 ndarray,但可以在 GPU 上运行以加速计算。
import torch
# 创建张量
x = torch.empty(5, 3) # 未初始化的矩阵
x = torch.rand(5, 3) # 随机初始化的矩阵
x = torch.zeros(5, 3, dtype=torch.long) # 全零矩阵,类型为long
x = torch.tensor([5.5, 3]) # 直接从数据创建
# 张量操作
y = torch.rand(5, 3)
print(x + y) # 加法
print(torch.add(x, y)) # 另一种加法方式
print(x[:, 1]) # 索引2. 自动微分 (Autograd) #
PyTorch 的 autograd 包提供了自动求导机制,这是神经网络训练的核心。
# 创建一个张量并设置 requires_grad=True 来跟踪计算
x = torch.ones(2, 2, requires_grad=True)
# 对张量进行操作
y = x + 2
z = y * y * 3
out = z.mean()
# 反向传播
out.backward()
# 打印梯度 d(out)/dx
print(x.grad)3. 神经网络 (Neural Networks) #
torch.nn 包可以用来构建神经网络。
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# 1 input image channel, 6 output channels, 3x3 square convolution
self.conv1 = nn.Conv2d(1, 6, 3)
self.conv2 = nn.Conv2d(6, 16, 3)
# an affine operation: y = Wx + b
self.fc1 = nn.Linear(16 * 6 * 6, 120) # 6*6 from image dimension
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
# Max pooling over a (2, 2) window
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
x = x.view(-1, self.num_flat_features(x))
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
def num_flat_features(self, x):
size = x.size()[1:] # all dimensions except the batch dimension
num_features = 1
for s in size:
num_features *= s
return num_features
net = Net()
print(net)4. 训练过程 #
典型的训练过程包括:
- 定义神经网络
- 迭代输入数据
- 通过网络处理输入
- 计算损失
- 反向传播梯度
- 更新网络权重
import torch.optim as optim
# 创建网络和优化器
net = Net()
optimizer = optim.SGD(net.parameters(), lr=0.01)
# 训练循环
for epoch in range(2): # 多次循环数据集
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
# 获取输入
inputs, labels = data
# 梯度清零
optimizer.zero_grad()
# 前向传播 + 反向传播 + 优化
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 打印统计信息
running_loss += loss.item()
if i % 2000 == 1999: # 每2000个小批次打印一次
print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}')
running_loss = 0.0
print('Finished Training')PyTorch 优势 #
- 动态计算图:PyTorch 使用动态计算图,使得调试更加容易,网络结构可以动态改变。
- Python 优先:与 Python 生态无缝集成,代码更加直观。
- 强大的 GPU 加速:可以轻松地将计算转移到 GPU 上。
- 丰富的预训练模型:通过 torchvision 等包提供大量预训练模型。
- 活跃的社区:广泛用于学术研究和工业应用。
常用扩展库 #
torchvision:计算机视觉相关工具和预训练模型torchtext:文本处理工具torchaudio:音频处理工具transformers:HuggingFace 提供的各种预训练 Transformer 模型
PyTorch 因其灵活性和易用性,已经成为深度学习研究和应用中最受欢迎的框架之一。