PyTorch从零开始:初学者指南 – wiki基地

“`markdown

PyTorch从零开始:初学者指南

PyTorch是一个开源的机器学习库,由Facebook人工智能研究院(FAIR)开发,因其灵活性、易用性和强大的功能而广受欢迎。本指南将带你从零开始,逐步了解PyTorch的核心概念和基本用法,助你迈出深度学习的第一步。

1. 什么是PyTorch?为什么选择它?

PyTorch主要用于深度学习任务,例如图像识别、自然语言处理和推荐系统。它提供了一个包含张量计算(Numpy的强大GPU加速替代品)和基于自动求导(Autograd)系统的深度神经网络的平台。

为什么选择PyTorch?

  • 动态计算图: PyTorch采用动态计算图(Define-by-Run),这意味着你可以在运行时构建和修改网络结构,这对于调试和处理变长输入序列非常有用。
  • Pythonic: PyTorch的API设计与Python生态系统紧密集成,感觉就像在使用NumPy,易于学习和使用。
  • 强大的GPU加速: 可以无缝地利用NVIDIA GPU进行高性能计算。
  • 丰富的生态系统: 拥有活跃的社区和丰富的工具库,如TorchVision、TorchText等。

2. 安装PyTorch

安装PyTorch非常简单。推荐使用pipconda。首先,访问PyTorch官方网站(pytorch.org)的安装页面,根据你的操作系统、包管理器、Python版本和CUDA版本选择合适的安装命令。

示例 (使用pip安装CPU版本):

bash
pip install torch torchvision torchaudio

示例 (使用pip安装CUDA 11.8版本):

bash
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

安装完成后,你可以在Python环境中验证安装:

python
import torch
print(torch.__version__)
print(torch.cuda.is_available()) # 检查GPU是否可用

3. PyTorch核心概念

3.1. 张量 (Tensors)

张量是PyTorch中最基本的数据结构,它是一个多维数组,与NumPy的ndarray非常相似,但它可以运行在GPU上,从而加速计算。

“`python
import torch

创建一个未初始化的5×3张量

x = torch.empty(5, 3)
print(x)

创建一个随机初始化的张量

x = torch.rand(5, 3)
print(x)

创建一个全零张量,并指定数据类型

x = torch.zeros(5, 3, dtype=torch.long)
print(x)

从Python列表创建张量

x = torch.tensor([5.5, 3.2])
print(x)

张量运算 (与NumPy类似)

x = torch.ones(2, 2)
y = torch.rand(2, 2)
print(x + y)
print(torch.add(x, y))

GPU操作 (如果CUDA可用)

if torch.cuda.is_available():
device = torch.device(“cuda”)
y = y.to(device) # 将张量移动到GPU
x = x.to(device)
z = x + y
print(z)
print(z.to(“cpu”, torch.double)) # 将张量移回CPU并改变数据类型
“`

3.2. 自动求导 (Autograd)

PyTorch的autograd包提供了张量上所有操作的自动微分功能。它是训练神经网络的核心。

当你创建一个张量时,可以设置requires_grad=True来跟踪它上面所有的操作。当你完成计算并调用.backward()时,梯度会自动计算并存储在张量的.grad属性中。

“`python
import torch

x = torch.ones(2, 2, requires_grad=True)
print(x)

y = x + 2
print(y)

z = y * y * 3
out = z.mean()

print(z, out)

反向传播,计算梯度

out.backward()

打印梯度 d(out)/dx

print(x.grad)
“`

4. 构建一个简单的神经网络

我们将通过一个简单的线性回归示例来演示如何使用PyTorch构建和训练一个神经网络。

4.1. 数据加载与准备

对于真实世界的任务,你会用到torch.utils.data.Datasettorch.utils.data.DataLoader来处理数据。这里我们创建一些模拟数据。

“`python
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt

模拟数据

X_np = np.array([[1], [2], [3], [4]], dtype=np.float32)
Y_np = np.array([[2], [4], [6], [8]], dtype=np.float32)

X = torch.from_numpy(X_np)
Y = torch.from_numpy(Y_np)

print(f”X: {X}, Y: {Y}”)
“`

4.2. 定义神经网络模型

PyTorch中的所有神经网络都继承自torch.nn.Module。你的模型将定义在__init__方法中,并通过forward方法执行前向传播。

“`python
class LinearRegression(nn.Module):
def init(self, input_size, output_size):
super(LinearRegression, self).init()
# 定义一个线性层 (y = wx + b)
self.linear = nn.Linear(input_size, output_size)

def forward(self, x):
    # 前向传播
    return self.linear(x)

实例化模型

input_size = 1
output_size = 1
model = LinearRegression(input_size, output_size)
print(model)
“`

4.3. 损失函数和优化器

  • 损失函数 (Loss Function): 衡量模型预测值与真实值之间的差异。对于回归任务,常用的有均方误差 (MSE)。
  • 优化器 (Optimizer): 根据损失函数的梯度来更新模型的权重。常用的有随机梯度下降 (SGD)、Adam等。

“`python

损失函数

criterion = nn.MSELoss()

优化器

learning_rate = 0.01
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
“`

4.4. 训练循环

训练模型通常涉及一个迭代过程:

  1. 前向传播: 模型对输入数据进行预测。
  2. 计算损失: 比较预测值和真实值,计算损失。
  3. 反向传播: 计算损失相对于模型参数的梯度。
  4. 参数更新: 优化器根据梯度更新模型参数。
  5. 梯度清零: 在下一次迭代前,清零所有累积的梯度。

“`python
num_epochs = 100
for epoch in range(num_epochs):
# 前向传播
y_predicted = model(X)
loss = criterion(y_predicted, Y)

# 反向传播和优化
optimizer.zero_grad() # 清零梯度
loss.backward()       # 反向传播计算梯度
optimizer.step()      # 更新参数

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

打印最终的模型参数

print(f’Final weight: {model.linear.weight.item():.4f}, bias: {model.linear.bias.item():.4f}’)
“`

4.5. 模型评估与预测

训练完成后,你可以使用模型进行预测。

“`python

关闭梯度计算,因为我们只做预测,不需要更新参数

with torch.no_grad():
predicted = model(X).numpy()

plt.plot(X_np, Y_np, ‘ro’, label=’Original data’)
plt.plot(X_np, predicted, label=’Fitted line’)
plt.legend()
plt.show()

预测新数据

new_X = torch.tensor([[5.0]], dtype=torch.float32)
with torch.no_grad():
new_Y_predicted = model(new_X).item()
print(f”Prediction for X=5: {new_Y_predicted:.4f}”)
“`

5. 总结与下一步

恭喜你!你已经了解了PyTorch的基础知识,并成功训练了一个简单的线性回归模型。这只是PyTorch世界的冰山一角。

下一步学习建议:

  • 深入理解nn.Module: 学习更多不同类型的层(卷积层、循环层等)。
  • 数据处理: 掌握DatasetDataLoader的使用,以及如何处理图像、文本等复杂数据。
  • 更复杂的模型: 尝试构建更复杂的神经网络,如多层感知机(MLP)、卷积神经网络(CNN)和循环神经网络(RNN)。
  • PyTorch生态系统: 探索TorchVision(计算机视觉)、TorchText(自然语言处理)等库。
  • 模型保存与加载: 学习如何保存和加载训练好的模型。
  • GPU优化: 更深入地了解如何有效地利用GPU进行训练。

PyTorch是一个强大而灵活的工具。通过不断地实践和探索,你将能够构建出令人惊叹的深度学习应用。祝你学习愉快!
“`

滚动至顶部