PyTorch是当前主流的深度学习框架之一,凭借动态计算图、简洁的API设计以及丰富的生态支持,成为很多开发者和研究者的首选工具。它基于Python语言开发,和NumPy的使用逻辑高度相似,上手难度较低,同时支持GPU加速,能够满足从基础模型训练到复杂科研任务的需求。

环境安装
安装PyTorch前需要先确保本地已经安装了Python 3.8及以上版本,推荐使用conda或者pip进行安装。如果使用pip安装CPU版本,可以执行以下命令:
pip install torch torchvision torchaudio
如果需要安装GPU版本,需要根据本地的CUDA版本选择对应的安装命令,具体可以到PyTorch官方网站查询对应版本的安装指令。
核心概念:张量
张量(Tensor)是PyTorch中最基础的数据结构,可以理解为多维数组,和NumPy的ndarray类似,但张量支持在GPU上运行,并且自带自动求导功能。我们可以通过多种方式创建张量:
import torch # 创建全零张量 zero_tensor = torch.zeros(2, 3) print(zero_tensor) # 从Python列表创建张量 list_tensor = torch.tensor([[1, 2], [3, 4]]) print(list_tensor) # 创建随机张量 rand_tensor = torch.rand(3, 3) print(rand_tensor)
张量支持和NumPy数组之间的相互转换,方便我们复用已有的数据处理逻辑:
import numpy as np # NumPy数组转张量 np_array = np.array([1, 2, 3]) tensor_from_np = torch.from_numpy(np_array) print(tensor_from_np) # 张量转NumPy数组 tensor_to_np = tensor_from_np.numpy() print(tensor_to_np)
自动求导机制
PyTorch的自动求导功能是深度学习模型训练的核心,它能够自动计算张量的梯度,不需要我们手动推导反向传播公式。要让张量支持自动求导,只需要在创建时设置requires_grad=True:
import torch # 创建需要求导的张量 x = torch.tensor([2.0], requires_grad=True) y = torch.tensor([3.0], requires_grad=True) # 定义计算关系 z = x * x + y * y # 反向传播计算梯度 z.backward() # 查看x和y的梯度 print(x.grad) # 输出 tensor([4.]) print(y.grad) # 输出 tensor([6.])
需要注意的是,只有标量输出才能直接调用backward()方法,如果是多维输出,需要传入对应的梯度权重参数。
搭建简单神经网络
PyTorch提供了torch.nn模块,帮助我们快速搭建神经网络。我们可以通过继承nn.Module类来定义自己的网络结构:
import torch
import torch.nn as nn
# 定义简单的全连接神经网络
class SimpleNet(nn.Module):
def __init__(self):
super(SimpleNet, self).__init__()
# 定义第一层全连接层,输入特征数10,输出特征数20
self.fc1 = nn.Linear(10, 20)
# 定义激活函数
self.relu = nn.ReLU()
# 定义第二层全连接层,输入特征数20,输出特征数1
self.fc2 = nn.Linear(20, 1)
def forward(self, x):
# 前向传播逻辑
x = self.fc1(x)
x = self.relu(x)
x = self.fc2(x)
return x
# 实例化网络
net = SimpleNet()
print(net)
模型训练基础流程
一个简单的模型训练流程包含数据准备、前向传播、损失计算、反向传播、参数更新几个步骤,以下是使用随机数据训练上述简单网络的示例:
import torch
import torch.nn as nn
import torch.optim as optim
# 实例化网络
net = SimpleNet()
# 定义损失函数,这里使用均方误差损失
criterion = nn.MSELoss()
# 定义优化器,使用随机梯度下降,学习率设为0.01
optimizer = optim.SGD(net.parameters(), lr=0.01)
# 生成随机训练数据,假设输入特征数为10,样本数为32
inputs = torch.rand(32, 10)
# 生成随机标签,这里用随机值模拟
labels = torch.rand(32, 1)
# 训练循环,迭代100次
for epoch in range(100):
# 前向传播,得到模型输出
outputs = net(inputs)
# 计算损失
loss = criterion(outputs, labels)
# 清空之前的梯度
optimizer.zero_grad()
# 反向传播计算梯度
loss.backward()
# 更新参数
optimizer.step()
# 每10次迭代打印一次损失
if (epoch + 1) % 10 == 0:
print(f"Epoch [{epoch+1}/100], Loss: {loss.item():.4f}")
掌握以上内容后,你就可以尝试使用PyTorch搭建更复杂的网络,处理图像、文本等不同领域的深度学习任务了。