一、数据加载
二、神经网络层
1、激活层 nn.ReLU(inplace=False)
inplace:是否原地操作(节约内存)
2、全连接层 nn.Linear(in_features,out_features)
in_features:输入特征数
out_features:输出特征数
3、卷积层 nn.Conv2d(in_channels,out_channels,kernel_size,padding)
in_channels:输入通道数
out_channels:输出通道数
kernel_size:卷积核大小
padding:向外围的填充数
4、转置卷积层 nn.ConvTranspose2d,参数同卷积层
5、池化层
nn.MaxPool2d(kernel_size,stride)
kernel_size:池化窗口大小
stride:池化时的步长
6、自定义池化 nn.AdaptiveAvgPool2d(output_size)
output_size:输出大小
7、Dropout nn.Dropout(p)
p:丢弃概率
8、批量归一化 nn.BatchNorm2d(num_featrues)
num_features:输入通道数
9、nn.Upsample
10、nn.LSTM/nn.GRU
11、自注意力机制 nn.Transformer
12、nn.Sequential
13、nn.ModuleList
三、模式切换
model.train() : 训练模式,启用batchnorm和dropout等
model.eval() : 测试模式
四、抑制过拟合的方法总结
1、数据层面
数据增强:对训练样本进行随机变换,如随机水平翻转,随机裁剪,旋转,色彩抖动等
增加训练数据
2、模型层面
L2正则化:在损失函数中增加权重的平方和惩罚项,让权重趋于更小的值
Dropout:随机丢弃一部分神经元
简化网络结构:
权重初始化:Xavier或Kaiming等初始化方法
3、训练层面
早停法:当监控到训练时验证集准确率不再上升,停止训练并回到最佳模型
学习率调度,训练中降低学习率
标签平滑:不完全指定正确答案
集成学习:训练多个不同初始化的模型,将所有模型结果平均
五、优化器
| 优化器 | 核心思想 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| SGD | 最基础的梯度下降 | 简单、泛化好 | 收敛慢、需调学习率 | 计算机视觉经典任务 |
| SGD + Momentum | 加入“动量”,模拟惯性 | 加速收敛、减少震荡 | 仍需手动调参 | ResNet 训练标配 |
| Adam | 自适应学习率 + 动量 | 收敛快、对学习率不敏感 | 有时泛化不如SGD | 大多数任务的默认选择 |
| AdamW | Adam + 正确的权重衰减 | 泛化更好 | 同上 | Transformer、现代模型 |
| RMSprop | 自适应学习率 | 适合非平稳目标 | 使用较少 | RNN、强化学习 |
| Adagrad | 累积梯度平方 | 适合稀疏数据 | 学习率会衰减到0 | NLP 稀疏特征 |
#SGD+Momentum,momentum=0时为纯SGD optimizer = optim.SGD(model.parameters(),lr=0.01,momentum=0.9,weight_decay=5e-4,nesterov=True) #Adam optimizer = optim.Adam(model.parameters(),lr=0.001,betas=(0.9, 0.999),eps=1e-8,weight_decay=5e-4) #AdamW optimizer = optim.AdamW(model.parameters(),lr=0.001,betas=(0.9, 0.999),eps=1e-8,weight_decay=0.01) #RMSprop optimizer = optim.RMSprop(model.parameters(),lr=0.001,alpha=0.99,eps=1e-8,momentum=0.9,weight_decay=5e-4) #Adagrad optimizer = optim.Adagrad(model.parameters(),lr=0.01,lr_decay=0,weight_decay=5e-4) #Adadelta optimizer = optim.Adadelta(model.parameters(),lr=1.0,rho=0.9,eps=1e-6,weight_decay=5e-4)六、学习率调度
| 调度器 | 学习率变化 | 调用频率 | 适用场景 |
|---|---|---|---|
StepLR | 阶梯下降 | 每个epoch | 通用,简单 |
MultiStepLR | 多阶段下降 | 每个epoch | 需要精细控制衰减点 |
ExponentialLR | 指数平滑下降 | 每个epoch | 需要平滑衰减 |
CosineAnnealingLR | 余弦曲线 | 每个epoch | 精细收敛,现代常用 |
ReduceLROnPlateau | 自适应下降 | 每个epoch(传入指标) | 无法预判衰减时机 |
OneCycleLR | 先升后降 | 每个batch | 快速训练,Super Convergence |
#每step_size乘gamma scheduler = optim.lr_scheduler.StepLR(self.optimizer,step_size=10,gamma=0.1) #milestones的节点乘gamma scheduler = optim.lr_scheduler.MultiStepLR(optimizer, milestones=[10, 20, 30], gamma=0.1) #每个epoch乘gamma scheduler = optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.95) #余弦曲线 scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=30) #自适应下降 scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=5) scheduler.step(test_loss) #OneCycleLR,每个batch后使用,将学习率从很小升到很大再回到很小 scheduler = optim.lr_scheduler.OneCycleLR(optimizer, max_lr=0.01, total_steps=num_epochs * len(train_loader))