24 从零到上手系统学习 PyTorch 详细教程

24 从零到上手系统学习 PyTorch 详细教程

1. 什么是 PyTorch?

PyTorch 是一个开源的深度学习框架,由 Facebook’s AI Research Lab 开发。它基于动态图机制,具有灵活性和易用性,广泛应用于计算机视觉、自然语言处理等领域。

2. 安装 PyTorch

在开始之前,我们需要先安装 PyTorch。可以使用以下命令在终端中安装:

1
pip install torch torchvision torchaudio

确认安装

安装完成后,可以通过执行以下代码验证安装是否成功:

1
2
import torch
print(torch.__version__)

3. PyTorch 基础

3.1 Tensor

Tensor 是 PyTorch 中的核心数据结构,类似于 NumPy 的数组,但支持 GPU 运算。

创建 Tensor

1
2
3
4
5
import torch

# 创建一个 2x3 的浮点 Tensor
x = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
print(x)

3.2 Tensor 运算

PyTorch 提供了丰富的数学运算,可以直接在 Tensor 上进行:

1
2
3
4
5
6
7
8
# Tensor 加法
y = torch.tensor([[1.0, 1.0, 1.0], [1.0, 1.0, 1.0]])
z = x + y
print(z)

# 矩阵乘法
a = torch.matmul(x, y.T)
print(a)

3.3 转换 NumPy 数组

可以方便地在 PyTorch Tensor 和 NumPy 数组之间转换:

1
2
3
4
5
6
7
8
9
10
import numpy as np

# NumPy 数组转 Tensor
array = np.array([[1, 2, 3], [4, 5, 6]])
tensor = torch.from_numpy(array)
print(tensor)

# Tensor 转 NumPy 数组
array_back = tensor.numpy()
print(array_back)

4. 深度学习基础

4.1 神经网络

在 PyTorch 中可以使用 torch.nn 构建神经网络。

创建简单的神经网络

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import torch.nn as nn

class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(3, 2) # 输入层到隐藏层
self.fc2 = nn.Linear(2, 1) # 隐藏层到输出层

def forward(self, x):
x = torch.relu(self.fc1(x)) # 激活函数
x = self.fc2(x)
return x

model = SimpleNN()
print(model)

4.2 训练模型

训练模型包括前向传播、计算损失、反向传播以及优化步骤。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 模拟数据
inputs = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
targets = torch.tensor([[1.0], [0.0]])

# 损失函数和优化器
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# 训练过程
for epoch in range(100):
model.train() # 设置为训练模式
optimizer.zero_grad() # 清空梯度

outputs = model(inputs) # 前向传播
loss = criterion(outputs, targets) # 计算损失
loss.backward() # 反向传播
optimizer.step() # 更新参数

if (epoch+1) % 10 == 0:
print(f'Epoch [{epoch+1}/100], Loss: {loss.item():.4f}')

5. 数据加载与预处理

5.1 使用 DataLoader

torch.utils.data 提供了用于处理数据集和批处理数据的工具。

示例代码

1
2
3
4
5
6
7
8
9
from torch.utils.data import DataLoader, TensorDataset

# 创建数据集
dataset = TensorDataset(inputs, targets)
dataloader = DataLoader(dataset, batch_size=1, shuffle=True)

# 遍历 DataLoader
for batch_inputs, batch_targets in dataloader:
print(batch_inputs, batch_targets)

6. 实战案例:手写数字识别

6.1 数据集准备

使用 torchvision 加载 MNIST 数据集。

1
2
3
4
5
6
7
8
9
10
import torchvision.transforms as transforms
from torchvision import datasets

transform = transforms.Compose([
transforms.ToTensor(), # 转换为 Tensor
transforms.Normalize((0.5,), (0.5,)) # 归一化
])

train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)

6.2 构建并训练模型

基于前面的知识,可以构建一个更复杂的模型来处理 MNIST。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class MNISTNN(nn.Module):
def __init__(self):
super(MNISTNN, self).__init__()
self.fc1 = nn.Linear(28*28, 128)
self.fc2 = nn.Linear(128, 10) # 10 类别

def forward(self, x):
x = x.view(-1, 28*28) # 展平
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x

# 实例化模型、定义损失和优化器
model = MNISTNN()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

# 训练模型
for epoch in range(5):
for images, labels in train_loader:
optimizer.zero_grad() # 清空梯度
outputs = model(images) # 前向传播
loss = criterion(outputs, labels) # 计算损失
loss.backward() # 反向传播
optimizer.step() # 更新参数
print(f'Epoch [{epoch+1}/5], Loss: {loss.item():.4f}')

7. 总结

通过本教程,我们从基础到实战,系统学习了 PyTorch。我们了解了 Tensor 的创建与运算,神经网络的构建与训练,以及如何处理数据集并应用于实际的深度学习任务。希望能帮助你在深度学习的旅程上起到良好的助推作用!

24 从零到上手系统学习 PyTorch 详细教程

https://zglg.work/pytorch-tutorial/24/

作者

AI教程网

发布于

2024-08-07

更新于

2024-08-10

许可协议