PyTorch入门到进阶 实战计算机视觉与自然语言处理项目
PyTorch 是一个广泛使用的深度学习框架,它提供了灵活的张量操作、自动求导和模型定义机制。以下是 PyTorch 的基础语法详解,包括张量操作、自动求导和模型定义的内容。
1. 张量操作(Tensor Operations)
张量(Tensor)是 PyTorch 中最基本的数据结构,类似于 NumPy 数组,但可以在 GPU 上进行高效的计算。下面是 PyTorch 中张量的常见操作。
创建张量
ini
pythonimport torch
# 创建一个未初始化的张量,形状为 (2, 3)
x = torch.empty(2, 3)
# 创建一个全为零的张量
y = torch.zeros(2, 3)
# 创建一个全为1的张量
z = torch.ones(2, 3)
# 从数据创建张量
data = [1, 2, 3, 4]
t = torch.tensor(data)
# 使用随机数生成张量
r = torch.rand(2, 3)
# 创建一个单位矩阵
identity_matrix = torch.eye(3)
# 获取张量的形状
shape = r.shape
张量运算
ini
python# 张量加法
a = torch.tensor([1, 2])
b = torch.tensor([3, 4])
c = a + b
# 张量减法
d = a - b
# 张量乘法(逐元素相乘)
e = a * b
# 矩阵乘法
f = torch.matmul(a.view(1, -1), b.view(-1, 1))
# 张量的求和、均值等
sum_val = a.sum() # 求和
mean_val = a.mean() # 求均值
张量的索引和切片
ini
python# 张量的索引
x = torch.rand(4, 4)
x[0, 0] # 访问第 0 行,第 0 列元素
x[:, 1] # 访问第 1 列的所有元素
张量转换
ini
python# 转换形状
y = x.view(2, 8) # 修改形状为 (2, 8)
# 转换为 NumPy 数组
numpy_array = x.numpy()
# 转换为 GPU 张量
if torch.cuda.is_available():
x_cuda = x.cuda()
2. 自动求导(Autograd)
PyTorch 的核心之一是 autograd,它允许我们自动计算张量的梯度,方便反向传播和模型训练。
启用梯度计算
ini
python# 创建一个张量并启用梯度计算
x = torch.randn(3, 3, requires_grad=True)
# 计算张量的某些操作
y = x * 2
z = y.mean()
# 反向传播计算梯度
z.backward()
# 查看梯度
print(x.grad)
防止梯度计算
ini
python# 使用 `torch.no_grad()` 来停止梯度计算
with torch.no_grad():
y = x * 2
创建计算图
ini
pythona = torch.tensor([2.0], requires_grad=True)
b = a ** 2 + 3 * a
c = b.mean()
c.backward()
print(a.grad) # 打印梯度
3. 模型定义(Model Definition)
PyTorch 提供了一个灵活的方式来定义神经网络模型,通常通过继承 torch.nn.Module 来构建自定义模型。
定义一个简单的神经网络
python
pythonimport torch.nn as nn
import torch.optim as optim
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(2, 3) # 第一层:2个输入,3个输出
self.fc2 = nn.Linear(3, 1) # 第二层:3个输入,1个输出
def forward(self, x):
x = torch.relu(self.fc1(x)) # ReLU 激活
x = self.fc2(x)
return x
# 创建模型实例
model = SimpleNN()
# 查看模型结构
print(model)
训练模型
在训练模型时,我们需要定义损失函数(Loss Function)和优化器(Optimizer),然后使用反向传播来更新模型的参数。
ini
python# 创建损失函数和优化器
criterion = nn.MSELoss() # 均方误差损失函数
optimizer = optim.SGD(model.parameters(), lr=0.01) # 随机梯度下降优化器
# 输入数据
inputs = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
targets = torch.tensor([[1.0], [2.0]])
# 训练步骤
for epoch in range(100):
# 前向传播
outputs = model(inputs)
loss = criterion(outputs, targets)
# 反向传播
optimizer.zero_grad() # 清空之前的梯度
loss.backward() # 计算梯度
optimizer.step() # 更新模型参数
if (epoch + 1) % 10 == 0:
print(f'Epoch [{epoch+1}/100], Loss: {loss.item():.4f}')
4. 其他常用功能
迁移到 GPU
ini
python# 将模型和张量迁移到 GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
inputs = inputs.to(device)
targets = targets.to(device)
保存和加载模型
php
# 保存模型
torch.save(model.state_dict(), 'model.pth')
# 加载模型
model = SimpleNN()
model.load_state_dict(torch.load('model.pth'))
model.eval() # 设为评估模式
总结
PyTorch 提供了非常丰富的功能,帮助我们高效地进行深度学习研究与开发。我们可以通过张量操作、自动求导和灵活的模型定义来构建、训练和优化神经网络。使用 torch.nn.Module 类构建模型非常简洁,而自动求导系统则简化了梯度计算,使得反向传播更加方便。