文章目录
一、PyTorch简介
1.1 什么是PyTorch
PyTorch是一个基于Python的深度学习框架,由Facebook人工智能研究院(FAIR)于2016年正式发布。它将数据封装成张量(Tensor)进行处理,提供了构建、训练和部署机器学习模型的完整工具链。与其他框架相比,PyTorch的动态计算图机制让模型调试更直观,API设计更贴近Python习惯,极大降低了深度学习的入门门槛。
1.2 核心特点
- 动态计算图:运行时可动态修改计算流程,便于调试和灵活构建复杂模型
- GPU加速:通过CUDA实现高效的GPU计算,大幅提升训练速度
- 自动微分:
torch.autograd
模块支持自动计算梯度,简化反向传播实现 - 丰富的深度学习组件:内置大量预定义层、损失函数和优化器
- 跨平台支持:兼容CPU、GPU等多种硬件,支持Linux、Windows和macOS系统
1.3 安装方法
使用pip即可快速安装PyTorch:
pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple
如果需要安装GPU版,请去官网下载GPU对应版本的PyTorch:官网链接
二、核心数据结构:张量(Tensor)
张量是PyTorch中最基础的数据结构,可理解为多维数组。与NumPy数组相比,张量支持GPU加速和自动微分,是深度学习计算的核心载体。
2.1 张量的创建
1. 基础创建方法
torch.tensor(data, dtype=None)
:根据数据创建张量import torch # 创建标量张量 scalar = torch.tensor(10) # 从列表创建张量 tensor_from_list = torch.tensor([[1., 2.], [3., 4.]]) # 从NumPy数组创建张量 import numpy as np np_array = np.array([1, 2, 3]) tensor_from_np = torch.tensor(np_array)
torch.Tensor(size)
:根据形状创建未初始化张量(默认float32类型)# 创建2行3列的张量 empty_tensor = torch.Tensor(2, 3)
特定类型张量创建:
# 创建int32类型张量 int_tensor = torch.IntTensor([1, 2, 3]) # 创建float64类型张量 double_tensor = torch.DoubleTensor([1.1, 2.2])
2. 特殊张量创建
全零张量:
torch.zeros(size)
和torch.zeros_like(input)
# 创建3行2列的全零张量 zeros = torch.zeros(3, 2) # 根据已有张量形状创建全零张量 zeros_like = torch.zeros_like(zeros)
全一张量:
torch.ones(size)
和torch.ones_like(input)
ones = torch.ones(2, 2)
指定值张量:
torch.full(size, fill_value)
# 创建填充值为5的2x2张量 filled = torch.full((2, 2), 5)
3. 线性与随机张量
线性序列:
torch.arange(start, end, step)
和torch.linspace(start, end, steps)
# 创建0到10(不包含10)步长为2的序列 arange_tensor = torch.arange(0, 10, 2) # tensor([0, 2, 4, 6, 8]) # 创建0到9的10个均匀分布的数 linspace_tensor = torch.linspace(0, 9, 10)
随机张量:
# 标准正态分布随机数 randn_tensor = torch.randn(2, 3) # [0, 1)均匀分布随机数 rand_tensor = torch.rand(2, 3) # [low, high)区间整数随机数 randint_tensor = torch.randint(0, 10, (2, 3))
2.2 张量类型转换
张量转NumPy数组:
tensor.numpy()
(注意:共享内存)tensor = torch.tensor([1, 2, 3]) np_array = tensor.numpy() # 避免共享内存 np_array_copy = tensor.numpy().copy()
NumPy数组转张量:
# 共享内存 tensor_from_np = torch.from_numpy(np_array) # 不共享内存 tensor_from_np = torch.tensor(np_array)
标量张量提取数值:
tensor.item()
scalar_tensor = torch.tensor(100) value = scalar_tensor.item() # 100
三、张量运算API
3.1 基本算术运算
PyTorch提供了丰富的张量运算函数,支持元素级操作和矩阵运算。
- 基础运算(add/sub/mul/div/neg):
a = torch.tensor([1, 2, 3]) b = torch.tensor([4, 5, 6]) # 加法 c = a.add(b) # 等价于 a + b # 减法 c = a.sub(b) # 等价于 a - b # 乘法(元素级) c = a.mul(b) # 等价于 a * b # 除法 c = a.div(b) # 等价于 a / b # 取负 c = a.neg() # 等价于 -a
注意:带下划线的方法(如
add_
)会直接修改原张量
3.2 矩阵运算
- 矩阵乘法:
torch.matmul(input, other)
或@
运算符# 3x2 矩阵与 2x4 矩阵相乘,结果为3x4矩阵 mat1 = torch.randn(3, 2) mat2 = torch.randn(2, 4) result = torch.matmul(mat1, mat2) # 等价于 result = mat1 @ mat2
3.3 用运算函数
统计函数:
tensor = torch.tensor([[1., 2.], [3., 4.]]) # 均值(dim=0按列计算,dim=1按行计算) mean = tensor.mean() # 整体均值 mean_col = tensor.mean(dim=0) # 按列均值 # 求和 sum_all = tensor.sum() sum_row = tensor.sum(dim=1) # 最大值/最小值 max_val = tensor.max() min_val = tensor.min()
其他常用函数:
# 平方根 sqrt_tensor = tensor.sqrt() # 平方 pow_tensor = tensor.pow(2) # 等价于 tensor **2 # 指数(e^x) exp_tensor = tensor.exp() # 对数(自然对数) log_tensor = tensor.log()
四、张量形状操作
4.1 形状查看与修改
查看形状:
tensor.shape
或tensor.size()
tensor = torch.randn(2, 3) print(tensor.shape) # torch.Size([2, 3])
重塑形状:
tensor.reshape(new_shape)
# 将2x3张量重塑为1x6张量 reshaped = tensor.reshape(1, 6)
4.2 维度操作
增加维度:
tensor.unsqueeze(dim)
# 在0维度增加一个维度 unsqueezed = tensor.unsqueeze(0) # 形状变为(1, 2, 3)
减少维度:
tensor.squeeze(dim)
(移除大小为1的维度)# 移除0维度 squeezed = unsqueezed.squeeze(0) # 恢复为(2, 3)
4.3 维度交换
交换两个维度:
torch.transpose(input, dim0, dim1)
# 交换1和2维度 transposed = torch.transpose(tensor, 1, 2)
多维度交换:
tensor.permute(dims)
# 将(2, 3, 4)张量的维度顺序改为(3, 4, 2) permuted = tensor.permute(1, 2, 0)
4.4 张量拼接
沿现有维度拼接:
torch.cat(tensors, dim)
tensor1 = torch.randn(2, 3) tensor2 = torch.randn(2, 3) # 按0维度拼接(结果为4x3) concatenated = torch.cat([tensor1, tensor2], dim=0)
新增维度拼接:
torch.stack(tensors, dim)
# 新增0维度拼接(结果为2x2x3) stacked = torch.stack([tensor1, tensor2], dim=0)
五、自动微分模块(autograd)
自动微分是PyTorch的核心功能之一,能够自动计算张量的梯度,为反向传播提供支持。
5.1 基本使用方法
1.** 标记需要求导的张量 **:设置requires_grad=True
x = torch.tensor(2.0, requires_grad=True)
2.** 构建计算图 **:
y = x** 2 + 3 * x + 1 # y = x² + 3x + 1
- 计算梯度:
tensor.backward()
y.backward() # 计算梯度 print(x.grad) # 输出x的梯度值(2x + 3 在x=2时为7)
5.2 梯度下降示例
# 初始化参数
x = torch.tensor(10.0, requires_grad=True)
# 迭代优化
for i in range(1000):
# 定义函数 y = x² + 20
y = x **2 + 20
# 梯度清零
if x.grad is not None:
x.grad.zero_()
# 反向传播计算梯度
y.backward()
# 更新参数(学习率0.01)
x.data = x.data - 0.01 * x.grad
print(f"最优解 x = {x.item()}, y = {y.item()}") # 接近x=0, y=20
5.3 注意事项
- 只有标量张量可以直接调用
backward()
,向量张量需要先求和 - 梯度会累加,每次反向传播前需调用
grad.zero_()
清零 - 带
requires_grad=True
的张量不能直接转换为NumPy数组,需先用detach()
方法numpy_array = x.detach().numpy()
六、线性回归模型构建示例
下面通过一个完整的线性回归示例,展示PyTorch API的综合应用:
import torch
from torch.utils.data import TensorDataset, DataLoader
from torch import nn, optim
import matplotlib.pyplot as plt
# 1. 准备数据
x = torch.linspace(-10, 10, 100).reshape(-1, 1)
y = 2 * x + 3 + torch.randn_like(x) * 2 # y=2x+3加噪声
# 构建数据集和数据加载器
dataset = TensorDataset(x, y)
dataloader = DataLoader(dataset, batch_size=16, shuffle=True)
# 2. 定义模型
model = nn.Linear(in_features=1, out_features=1) # 线性层 y = wx + b
# 3. 定义损失函数和优化器
criterion = nn.MSELoss() # 均方误差损失
optimizer = optim.SGD(model.parameters(), lr=0.01) # 随机梯度下降
# 4. 模型训练
epochs = 100
losses = []
for epoch in range(epochs):
total_loss = 0
for batch_x, batch_y in dataloader:
# 前向传播
y_pred = model(batch_x.float())
# 计算损失
loss = criterion(y_pred, batch_y.float())
total_loss += loss.item()
# 反向传播与参数更新
optimizer.zero_grad() # 梯度清零
loss.backward() # 计算梯度
optimizer.step() # 更新参数
losses.append(total_loss / len(dataloader))
# 打印训练结果
print(f"训练后的参数: w={model.weight.item()}, b={model.bias.item()}")
# 绘制损失曲线
plt.plot(losses)
plt.title("损失变化曲线")
plt.show()
七、总结
PyTorch凭借其简洁的API和灵活的特性,成为深度学习领域的重要工具。本文介绍了PyTorch的核心概念和常用API,包括张量创建、运算、形状操作和自动微分等功能。掌握这些基础操作后,你可以进一步探索PyTorch在计算机视觉(torchvision)、自然语言处理(torchaudio)等领域的高级应用。
PyTorch的学习曲线相对平缓,建议通过实际项目练习加深理解,逐步掌握更复杂的模型构建和训练技巧。