深度学习基础概念回顾(Pytorch架构)
本篇将详细介绍 PyTorch 深度学习框架,包括pytorch的基础库和函数,以及深度学习中的一些基础概念,如张量、优化器、激活函数、超参数等。
Pytorch
1. PyTorch 简介
PyTorch 是一个开源的深度学习框架,由 Facebook 的人工智能研究院(FAIR)开发和维护。它支持动态计算图(Dynamic Computational Graph),广泛应用于计算机视觉、自然语言处理、强化学习等领域。
2. PyTorch 的主要特点
-
动态图机制(Dynamic Computation Graph)
- 每次运行模型时都会动态创建计算图。便于调试,与静态图(如 TensorFlow 1.x)相比,代码更直观。
-
强大的 GPU 支持
- 通过 CUDA 支持 NVIDIA GPU 加速。(
tensor.to(device)
)
- 通过 CUDA 支持 NVIDIA GPU 加速。(
-
张量(Tensor)操作
- 类似于 NumPy 的多维数组操作。
- 自动求导(
autograd
),方便计算梯度和反向传播。
-
模块化,内置函数多
- 模型可以通过继承
nn.Module
自定义。 - 内置常用层(卷积、线性、RNN 等)和损失函数。
- 模型可以通过继承
-
工具包多
- TorchVision:计算机视觉工具包。
- TorchText:自然语言处理工具包。
- TorchAudio:音频处理工具包。
- PyTorch Lightning、FastAI 等高层封装,简化训练流程。
3. PyTorch 的核心组成
-
Tensor(张量)
- PyTorch 的基本数据结构(计算单位),类似于多维数组。
- 支持 GPU 计算、自动求导。
import torch x = torch.randn(3, 4) # 创建一个 3x4 的随机张量 y = x + 2 # 张量运算
-
Autograd(自动求导)
- 自动计算梯度,用于反向传播。
x = torch.tensor([2.0], requires_grad=True) y = x ** 2 y.backward() # 自动计算梯度 print(x.grad) # 4.0
requires_grad=True:告诉 PyTorch 要追踪这个张量的计算历史,因为我们后面要对它求导(梯度)。有了这个属性,PyTorch 就会记录所有涉及 x 的操作,为反向传播做准备。
-
nn 模块(神经网络模块)
- 提供层、损失函数和常用工具。
import torch.nn as nn class SimpleNet(nn.Module):def __init__(self):super(SimpleNet, self).__init__()self.fc = nn.Linear(10, 1)def forward(self, x):return self.fc(x)
-
Optimizer(优化器)
- 更新模型参数,如 SGD、Adam 等。
import torch.optim as optim model = SimpleNet() optimizer = optim.SGD(model.parameters(), lr=0.01)
-
DataLoader(数据加载)
- 批量读取数据,支持打乱和多线程加载。
from torch.utils.data import DataLoader, TensorDataset dataset = TensorDataset(torch.randn(100, 10), torch.randn(100, 1)) loader = DataLoader(dataset, batch_size=32, shuffle=True)
4. PyTorch 的训练流程
-
定义模型:继承
nn.Module
或使用现成模型。 -
准备数据:使用
DataLoader
加载训练和测试数据。数据清洗、数据划分… -
定义损失函数:如
nn.MSELoss()
或nn.CrossEntropyLoss()
。 -
定义优化器:如
optim.Adam()
。 -
训练循环:
- 前向传播计算输出。
- 计算损失。
- 反向传播 (
loss.backward()
)。 - 更新参数 (
optimizer.step()
)。 - 清空梯度 (
optimizer.zero_grad()
)。
Pytorch 基础库和函数
1. 张量(Tensor)相关
PyTorch 的核心是张量,它类似于 NumPy 的多维数组,但支持 GPU 加速和自动求导。
常用库:
import torch
常用函数:
功能 | 函数 | 说明 |
---|---|---|
创建张量 | torch.tensor(data) | 从列表/数组创建张量 |
随机初始化 | torch.randn(shape) | 标准正态分布随机张量 |
全零/全一 | torch.zeros(shape) , torch.ones(shape) | 初始化张量 |
形状操作 | x.view() , x.reshape() , x.squeeze() , x.unsqueeze() | 改变张量形状 |
计算操作 | torch.sum() , torch.mean() , torch.max() , torch.min() , torch.argmax() | 常用数学操作 |
GPU操作 | x.to('cuda') , x.cuda() , x.cpu() | 张量在 CPU/GPU 间转换 |
自动求导 | x.requires_grad_() , x.grad | 开启梯度计算、获取梯度 |
2. 自动求导(Autograd)
用于反向传播计算梯度。
3. 神经网络模块(nn)
构建和训练深度学习模型。
import torch.nn as nn
常用类和函数:
功能 | 类/函数 | 说明 |
---|---|---|
模型基类 | nn.Module | 所有模型需继承 |
全连接层 | nn.Linear(in_features, out_features) | 常用线性层 |
卷积层 | nn.Conv2d(in_channels, out_channels, kernel_size) | 2D卷积 |
激活函数 | nn.ReLU() , nn.Sigmoid() , nn.Softmax(dim) | 非线性激活 |
损失函数 | nn.MSELoss() , nn.CrossEntropyLoss() , nn.BCELoss() | 训练目标函数 |
Dropout/BatchNorm | nn.Dropout(p) , nn.BatchNorm2d(num_features) | 正则化和归一化 |
4. 优化器(Optimizer)
import torch.optim as optim
常用类:
优化器 | 说明 |
---|---|
optim.SGD(model.parameters(), lr=0.01) | 随机梯度下降 |
optim.Adam(model.parameters(), lr=0.001) | 自适应学习率优化 |
optim.RMSprop(model.parameters(), lr=0.001) | RMSProp 优化 |
常用方法:
optimizer.zero_grad() # 清空梯度
loss.backward() # 反向传播
optimizer.step() # 更新参数
5. 数据加载(DataLoader)
from torch.utils.data import Dataset, DataLoader, TensorDataset
6. 其他常用工具
- 设备管理:
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
x = x.to(device)
model.to(device)
- 保存与加载模型:
torch.save(model.state_dict(), 'model.pth') # 保存模型参数
model.load_state_dict(torch.load('model.pth')) # 加载模型参数
- 梯度裁剪(防止梯度爆炸):
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
总结来说,PyTorch 最常用的库主要包括:
- torch → 张量操作 & 自动求导
- torch.nn → 神经网络层 & 损失函数
- torch.optim → 优化器
- torch.utils.data → 数据加载
- torch.cuda / device → GPU 加速
深度学习基础概念
超参数
是人为设定的,不是网络自己学习的参数。
学习率(Learning Rate, lr)
定义:控制每次参数更新的步长大小。
-
作用:
- 学习率过大 → 训练不稳定,可能发散
- 学习率过小 → 收敛慢,可能陷入局部最优
示例:
import torch
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
Pytorch 中在设置优化器的时候设置 learning rate
- 这里
lr=0.001
表示每次梯度更新权重时,步长为 0.001。
通常会用学习率衰减(lr decay),训练后期降低学习率以精细调整参数。
批大小(Batch Size)
定义:一次送入网络训练的样本数量。
-
作用:
- 小 batch → 梯度估计噪声大,但更容易跳出局部最优
- 大 batch → 梯度更稳定,速度快,但占用显存大
Epoch
定义:完整遍历训练集一次算 1 个 epoch。
- 作用:控制训练轮次,通常配合早停(Early Stopping)防止过拟合。
优化器(Optimizer)
定义:控制参数如何根据梯度更新。
-
常见优化器:
- SGD:随机梯度下降
- Momentum:加速收敛
- Adam / AdamW:自适应学习率
- RMSProp:适合非平稳目标
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
常见优化器示例:
优化器 | 特点 | PyTorch 示例 |
---|---|---|
SGD | 基础随机梯度下降 | torch.optim.SGD(model.parameters(), lr=0.01) |
SGD + Momentum | 梯度累积,减少震荡 | torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9) |
RMSProp | 自适应学习率,适合非平稳目标 | torch.optim.RMSprop(model.parameters(), lr=0.001) |
Adam | 自适应学习率 + momentum | torch.optim.Adam(model.parameters(), lr=0.001) |
AdamW | Adam + 权重衰减(更好的正则化) | torch.optim.AdamW(model.parameters(), lr=0.001, weight_decay=0.01) |
一般 Adam 或 AdamW 作为默认优化器,收敛快,参数调节少。
激活函数(Activation Function)
定义:为神经元引入非线性能力,让网络能拟合复杂函数。
-
常用激活函数:
- ReLU:
f(x)=max(0,x)
→ 高效,常用 - Sigmoid:0~1 → 二分类输出
- Tanh:-1~1 → 对称激活
- GELU / LeakyReLU → 改进 ReLU
- ReLU:
示例:
import torch.nn as nn
act = nn.ReLU()
网络层数 / 神经元数(Model Capacity)
定义:网络的深度和宽度。
-
作用:
- 层数越多、神经元越多 → 模型更强大,可拟合复杂数据
- 但参数多 → 容易过拟合,需要更多数据
示例:
nn.Linear(128, 64) # 输入 128 个特征,输出 64 个神经元
正则化(Regularization)
定义:防止模型过拟合,控制复杂度。
-
常用方法:
- L1 / L2 正则化:权重约束
- Dropout:随机屏蔽部分神经元
示例:
nn.Dropout(p=0.5) # 50% 概率丢弃神经元