Pytorch
Pytorch
PyTorch 是一个开源的深度学习框架,由 Facebook 的人工智能研究团队开发和维护。
1. 基本概念
1.1 张量(Tensor)
张量是 PyTorch 的核心数据结构,类似于 NumPy 的 ndarray,但增加了对 GPU 的支持。张量可以是多维数组,支持各种数学运算。
import torch
tensor = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
1.2 自动微分(Autograd)
PyTorch 提供了自动微分功能,通过 autograd 模块实现。它可以自动计算张量的梯度,方便进行反向传播。
import torch
x = torch.tensor(2.0, requires_grad=True)
y = x ** 2
y.backward()
print(x.grad)
backward() 方法用于计算标量函数相对于其输入张量的梯度。如果你直接对一个非标量张量调用 backward(),PyTorch 会报错,因为它不知道如何处理非标量张量的梯度计算。
import torch
a = torch.tensor([[1.0, 2.0], [3.0, 4.0]], requires_grad=True)
b = a ** 2
b.backward() # RuntimeError: grad can be implicitly created only for scalar outputs
grad_output = torch.ones_like(b)
b.backward(grad_output) # Should provide grad for vector
2. 模块和层(Modules and Layers)
PyTorch 提供了丰富的神经网络模块和层,方便构建复杂的神经网络模型。常用的模块包括 nn.Module、nn.Linear、nn.Conv2d 等。
import torch.nn as nn
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(10, 5)
self.fc2 = nn.Linear(5, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
model = SimpleNN()
print(model)
3. 优化器(Optimizers)
PyTorch 提供了多种优化器,用于更新模型参数。常用的优化器包括 SGD、Adam 等。
import torch.optim as optim
loss_fn = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
for epoch in range(100):
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
optimizer.step()
4. 数据加载(Data Loading)
PyTorch 提供了强大的数据加载和预处理工具,包括 Dataset 和 DataLoader。这些工具可以方便地加载和处理大规模数据集。
from torch.utils.data import DataLoader, Dataset
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(data, labels)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
for batch_data, batch_labels in dataloader:
output = model(batch_data)
loss = loss_fn(output, batch_labels)
# Training...
5. GPU 加速
PyTorch 支持 GPU 加速,可以利用 CUDA 进行高效的并行计算。
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
data = data.to(device)
labels = labels.to(device)