1.引言
欢迎阅读本篇“一小时入门 PyTorch”的教程!PyTorch 是一个开源的机器学习库,由 Facebook AI Research 开发,广泛用于构建和训练神经网络。它基于 Python,易于使用,特别适合初学者和研究人员。其动态计算图功能允许你在运行时修改模型,相比静态图框架(如 TensorFlow 的早期版本)更灵活。本教程旨在在一小时内帮助你掌握 PyTorch 的基本概念和实践,适合完全没有经验的初学者。
2.安装 PyTorch
首先,确保你已安装 Python。可以通过以下命令安装 PyTorch:
- CPU 版本安装:
pip install torch
- 如果有 CUDA 支持的 GPU,可以安装 GPU 版本,参考 官方安装指南。
安装完成后,你可以导入 PyTorch 并开始学习。
3.张量:PyTorch 的基础
张量是 PyTorch 的核心数据结构,类似于 NumPy 数组,但支持 GPU 加速,这对深度学习任务至关重要。
3.1 创建张量
- 从 Python 列表创建
import torch
a = torch.Tensor([[1, 2], [3, 4]])
print(a)
- 从 NumPy 数组创建:
import numpy as np
np_array = np.array([[1, 2], [3, 4]])
tensor_from_np = torch.from_numpy(np_array)
print(tensor_from_np)
- 使用特定函数创建:
b = torch.zeros(2, 3) # 2x3 的零张量
c = torch.ones(2, 3) # 2x3 的全 1 张量
d = torch.randn(2, 3) # 2x3 的随机值张量(正态分布)
3.2 张量操作
PyTorch 支持多种张量操作,类似于 NumPy:
- 加法
x = torch.Tensor([1, 2])
y = torch.Tensor([3, 4])
z = x + y # 或 torch.add(x, y)
print(z)
- 乘法
z = x * y # 或 torch.mul(x, y)
print(z)
- 矩阵乘法:
a = torch.Tensor([[1, 2], [3, 4]])
b = torch.Tensor([[5, 6], [7, 8]])
c = torch.mm(a, b) # 或 a @ b(Python 3.6+)
print(c)
3.3 张量属性
张量有形状(shape)、大小(size)和设备(CPU 或 GPU)等属性:
- 查看形状:
print(a.size()) # 返回维度元组
print(a.shape) # 同 size()
- 移动到 GPU:
if torch.cuda.is_available():
device = torch.device("cuda")
a = a.to(device)
4. 自动微分(Autograd)
Autograd 是 PyTorch 的自动微分引擎,用于计算张量相对于某些参数的梯度,这是训练神经网络的关键。
4.1 Autograd 基础
创建具有 requires_grad=True
的张量时,它会跟踪操作以便计算梯度:
x = torch.Tensor([1, 2, 3], requires_grad=True)
y = x * 2
z = y.sum()
z.backward() # 计算梯度
print(x.grad) # 打印 x 的梯度
4.2 禁用 Autograd
有时你可能不想跟踪梯度(例如推理阶段),可以使用 torch.no_grad()
:
with torch.no_grad():
# 这里的操作不会跟踪梯度
5. 构建简单神经网络
我们将通过一个线性回归示例,学习如何定义和训练一个简单模型。
5.1 定义模型
使用 nn
模块定义一个线性模型:
import torch.nn as nn
class LinearModel(nn.Module):
def __init__(self):
super(LinearModel, self).__init__()
self.linear = nn.Linear(1, 1) # 输入 1 维,输出 1 维
def forward(self, x):
return self.linear(x)
model = LinearModel()
nn.Module
是所有神经网络模块的基类,forward
方法定义输入如何通过网络转换。
6. 训练模型
训练模型需要损失函数和优化器。
6.1 损失函数
对于回归任务,我们使用均方误差(MSE):
criterion = nn.MSELoss()
6.2 优化器
我们使用随机梯度下降(SGD):
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
6.3 训练循环
假设我们有输入数据 X_tensor
和目标数据 y_tensor
,训练循环如下:
num_epochs = 100
for epoch in range(num_epochs):
# 前向传播
outputs = model(X_tensor)
loss = criterion(outputs, y_tensor)
# 反向传播
optimizer.zero_grad() # 清零梯度
loss.backward() # 计算梯度
optimizer.step() # 更新参数
# 每 10 个 epoch 打印损失
if (epoch + 1) % 10 == 0:
print(f'Epoch {epoch+1}, Loss: {loss.item()}')
7. 进行预测
训练完成后,可以使用模型进行预测:
with torch.no_grad():
new_data = torch.Tensor([[2.0]]) # 示例新数据点
prediction = model(new_data)
print("Prediction:", prediction.item())
8. 保存和加载模型
8.1 保存模型:
torch.save(model.state_dict(), 'model.pth')
8.2 加载模型:
model = LinearModel()
model.load_state_dict(torch.load('model.pth'))
model.eval() # 设置为评估模式
9. 额外注意事项
- **数据分割:**在实际场景中,建议将数据分为训练集和验证集,以监控模型在未见数据上的表现,帮助检测过拟合和调整超参数。
- **进一步学习:**官方文档和教程是深入学习的宝贵资源,访问 PyTorch 官方教程 获取更多内容。
表格:PyTorch 核心组件总结
组件 | 描述 | 示例用法 |
---|---|---|
张量 (Tensor) | 多维数组,支持 GPU 加速 | torch.Tensor([[1, 2], [3, 4]]) |
Autograd | 自动微分引擎,计算梯度 | x.requires_grad=True; x.backward() |
nn.Module | 神经网络模块基类,定义模型结构 | class LinearModel(nn.Module): ... |
损失函数 | 衡量预测与实际值差异(如 MSE) | criterion = nn.MSELoss() |
优化器 | 更新模型参数(如 SGD) | optimizer = torch.optim.SGD(...) |
10. 最后
本教程为你提供了一个坚实的基础,帮助你理解和使用 PyTorch 进行深度学习任务。通过实践和探索更高级主题,你可以利用 PyTorch 解决复杂的机器学习问题。
访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站,邮箱:80764001@qq.com,予以删除。