在 Ubuntu 上使用 PyTorch 进行深度学习的实操指南
一 环境准备与安装
二 GPU 环境配置要点
三 训练一个 MNIST 卷积神经网络
python - <<‘PY’ import torch, torch.nn as nn, torch.nn.functional as F from torch.utils.data import DataLoader from torchvision import datasets, transforms
device = torch.device(“cuda” if torch.cuda.is_available() else “cpu”)
transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) train_ds = datasets.MNIST(“./data”, train=True, download=True, transform=transform) train_loader = DataLoader(train_ds, batch_size=64, shuffle=True, num_workers=2)
class Net(nn.Module): def init(self): super().init() self.conv1 = nn.Conv2d(1, 10, 5) self.conv2 = nn.Conv2d(10, 20, 5) self.conv2_drop = nn.Dropout2d(0.25) self.fc1 = nn.Linear(320, 50) self.fc2 = nn.Linear(50, 10) def forward(self, x): x = F.relu(F.max_pool2d(self.conv1(x), 2)) x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2)) x = x.view(-1, 320) x = F.relu(self.fc1(x)) x = F.dropout(x, training=self.training) x = self.fc2(x) return F.log_softmax(x, dim=1)
model = Net().to(device) optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.5) criterion = nn.NLLLoss()
model.train() for epoch in range(2): for batch_idx, (data, target) in enumerate(train_loader, 1): data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() if batch_idx % 500 == 0: print(f"Epoch {epoch} [{batch_idx*len(data):>6}/{len(train_loader.dataset)}] Loss: {loss.item():.4f}")
torch.save(model.state_dict(), “mnist_cnn.pth”) model2 = Net().to(device) model2.load_state_dict(torch.load(“mnist_cnn.pth”)) model2.eval() print(“Saved and reloaded model, ready for evaluation.”) PY
四 常见问题与优化建议