PyTorch 是一个强大的深度学习框架,它易于使用且非常灵活。本教程将引导您从安装到编写第一个神经网络模型,并涵盖一些基本概念和功能。
一、引言
PyTorch 是一个开源机器学习框架,它基于 Torch 构建,但使用 Python 作为主要编程语言。PyTorch 提供了动态计算图的能力,这使得调试更容易,并允许用户在运行时修改网络结构。它广泛应用于自然语言处理(NLP)、计算机视觉等多个领域。
二、安装 PyTorch
首先,您需要安装 Python 和 PyTorch。推荐使用 Anaconda 或者 Miniconda 来管理您的 Python 环境。安装 Anaconda 后,可以创建一个新的环境并安装 PyTorch:
Bash
深色版本
1conda create -n pytorch_env python=3.9
2conda activate pytorch_env
3conda install pytorch torchvision torchaudio -c pytorch
三、基本用法
一旦安装完成,就可以开始使用 PyTorch 了。以下是一些基本的例子。
3.1 导入库
Python
深色版本
1import torch
2import torchvision
3from torchvision import datasets, transforms
3.2 创建张量
张量是 PyTorch 中的主要数据结构,类似于 NumPy 的数组。
Python
深色版本
1# 创建一个未初始化的张量
2x = torch.empty(2, 3)
3
4# 创建一个随机初始化的张量
5y = torch.rand(2, 3)
6
7# 创建一个全零张量
8z = torch.zeros(2, 3)
9
10# 创建一个包含特定数值的张量
11a = torch.tensor([[1., -1.], [1., -1.]])
12
13# 打印张量
14print(x)
15print(y)
16print(z)
17print(a)
3.3 操作张量
Python
深色版本
1# 张量加法
2result = y + z
3
4# 张量乘法
5result = torch.matmul(a, a)
6
7# 元素级别的乘法
8result = torch.mul(a, a)
9
10# 访问张量的维度
11print(result.shape)
12
13# 将张量转换为 NumPy 数组
14np_array = result.numpy()
15
16# 将 NumPy 数组转换为张量
17tensor_from_np = torch.from_numpy(np_array)
四、自动微分
PyTorch 的一大特色是自动微分机制,这意味着您可以轻松地计算梯度。
4.1 计算梯度
Python
深色版本
1# 创建一个需要计算梯度的张量
2x = torch.ones(2, 2, requires_grad=True)
3
4# 进行一些操作
5y = x + 2
6z = y * y * 3
7out = z.mean()
8
9# 反向传播
10out.backward()
11
12# 打印梯度
13print(x.grad)
五、构建神经网络
PyTorch 提供了一个 nn
模块来帮助构建神经网络。
5.1 定义网络
Python
深色版本
1import torch.nn as nn
2import torch.nn.functional as F
3
4class Net(nn.Module):
5 def __init__(self):
6 super(Net, self).__init__()
7 # 定义网络层
8 self.fc1 = nn.Linear(28 * 28, 128)
9 self.fc2 = nn.Linear(128, 64)
10 self.fc3 = nn.Linear(64, 10)
11
12 def forward(self, x):
13 # 定义前向传播过程
14 x = F.relu(self.fc1(x))
15 x = F.relu(self.fc2(x))
16 x = self.fc3(x)
17 return x
18
19net = Net()
5.2 训练网络
Python
深色版本
1# 数据加载
2transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
3trainset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
4trainloader = torch.utils.data.DataLoader(trainset, batch_size=100, shuffle=True)
5
6# 定义损失函数和优化器
7criterion = nn.CrossEntropyLoss()
8optimizer = torch.optim.SGD(net.parameters(), lr=0.01)
9
10# 训练循环
11for epoch in range(2): # loop over the dataset multiple times
12 running_loss = 0.0
13 for i, data in enumerate(trainloader, 0):
14 inputs, labels = data
15
16 # 零化梯度
17 optimizer.zero_grad()
18
19 # 前向传播 + 反向传播 + 优化
20 outputs = net(inputs.view(-1, 28*28))
21 loss = criterion(outputs, labels)
22 loss.backward()
23 optimizer.step()
24
25 # 打印统计信息
26 running_loss += loss.item()
27 if i % 2000 == 1999: # 每2000个批次打印一次
28 print('[%d, %5d] loss: %.3f' %
29 (epoch + 1, i + 1, running_loss / 2000))
30 running_loss = 0.0
31
32print('Finished Training')
六、测试网络
Python
深色版本
1# 加载测试集
2testset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)
3testloader = torch.utils.data.DataLoader(testset, batch_size=100, shuffle=False)
4
5correct = 0
6total = 0
7with torch.no_grad():
8 for data in testloader:
9 images, labels = data
10 outputs = net(images.view(-1, 28*28))
11 _, predicted = torch.max(outputs.data, 1)
12 total += labels.size(0)
13 correct += (predicted == labels).sum().item()
14
15print('Accuracy of the network on the 10000 test images: %d %%' % (
16 100 * correct / total))
七、结论
通过以上步骤,您已经成功地构建并训练了一个简单的神经网络。PyTorch 的强大之处在于其灵活性和直观的 API 设计,这使得开发者能够轻松地实现复杂的模型。