160 lines
3.6 KiB
Markdown
160 lines
3.6 KiB
Markdown
# WideResNet 4G显存优化
|
||
|
||
本项目针对WideResNet模型在4G显存上的训练进行了全面优化,解决了准确率瓶颈问题,并提供了多种显存配置选项。
|
||
|
||
## 优化措施
|
||
|
||
### 1. 数据增强增强
|
||
|
||
- 添加了颜色抖动(ColorJitter)
|
||
- 添加了随机旋转(RandomRotation)
|
||
- 添加了随机仿射变换(RandomAffine)
|
||
- 添加了随机擦除(RandomErasing)
|
||
|
||
### 2. 模型结构优化
|
||
|
||
- 将激活函数从ReLU替换为GELU
|
||
- 在全连接层前添加了额外的Dropout层
|
||
- 优化了Block结构
|
||
- 添加了专门针对WideResNet的权重初始化方法
|
||
|
||
### 3. 训练策略改进
|
||
|
||
- **标签平滑(Label Smoothing)**:使用平滑因子0.1
|
||
- **余弦退火学习率调度器**:替代原来的MultiStepLR
|
||
- **Nesterov动量**:在SGD优化器中启用nesterov=True
|
||
- **学习率预热**:前5个epoch进行学习率预热
|
||
- **梯度累积**:减少显存使用
|
||
- **早停机制**:添加30个epoch的耐心值
|
||
|
||
## 配置选项
|
||
|
||
项目提供了四种预定义配置,适用于不同显存大小的GPU:
|
||
|
||
### 4G显存配置(默认)
|
||
|
||
```python
|
||
config_name = "4gb"
|
||
```
|
||
|
||
- 模型深度: 22
|
||
- 宽度因子: 4
|
||
- 批量大小: 64
|
||
- 梯度累积步数: 2
|
||
|
||
### 2G显存配置
|
||
|
||
```python
|
||
config_name = "2gb"
|
||
```
|
||
|
||
- 模型深度: 16
|
||
- 宽度因子: 2
|
||
- 批量大小: 32
|
||
- 梯度累积步数: 4
|
||
|
||
### 8G显存配置
|
||
|
||
```python
|
||
config_name = "8gb"
|
||
```
|
||
|
||
- 模型深度: 28
|
||
- 宽度因子: 10
|
||
- 批量大小: 128
|
||
- 梯度累积步数: 1
|
||
|
||
### 高性能配置
|
||
|
||
```python
|
||
config_name = "high_performance"
|
||
```
|
||
|
||
- 模型深度: 34
|
||
- 宽度因子: 10
|
||
- 批量大小: 128
|
||
- 梯度累积步数: 1
|
||
|
||
## 使用方法
|
||
|
||
### 1. 选择配置
|
||
|
||
在 `main.py`中修改配置名称:
|
||
|
||
```python
|
||
config_name = "4gb" # 可以改为 "2gb", "8gb" 或 "high_performance"
|
||
```
|
||
|
||
### 2. 运行训练
|
||
|
||
```bash
|
||
python main.py
|
||
```
|
||
|
||
### 3. 测试显存使用
|
||
|
||
运行显存测试脚本,查看不同配置的显存使用情况:
|
||
|
||
```bash
|
||
python test_memory.py
|
||
```
|
||
|
||
## 文件结构
|
||
|
||
```
|
||
Cifar100/
|
||
├── src/cifar100/
|
||
│ ├── __init__.py
|
||
│ ├── config.py # 配置文件
|
||
│ ├── data.py # 数据加载和增强
|
||
│ ├── model.py # WideResNet模型定义
|
||
│ ├── trainer.py # 训练器
|
||
│ └── visualizer.py # 训练可视化
|
||
├── main.py # 主训练脚本
|
||
├── test_memory.py # 显存测试脚本
|
||
└── plots/ # 训练图表保存目录
|
||
```
|
||
|
||
## 预期效果
|
||
|
||
这些优化措施应该能够:
|
||
|
||
1. **提高模型泛化能力**:通过增强的数据增强和标签平滑
|
||
2. **加速收敛**:通过余弦退火调度器和Nesterov动量
|
||
3. **防止过拟合**:通过标签平滑、Dropout和早停机制
|
||
4. **突破准确率瓶颈**:综合以上所有改进,应该能显著超过52%-53%的准确率
|
||
|
||
## 自定义配置
|
||
|
||
如果预定义配置不满足需求,可以在 `src/cifar100/config.py`中添加自定义配置:
|
||
|
||
```python
|
||
CUSTOM_CONFIG = {
|
||
"depth": 28,
|
||
"width_factor": 8,
|
||
"dropout": 0.3,
|
||
"batch_size": 96,
|
||
"learning_rate": 0.1,
|
||
"accumulation_steps": 1,
|
||
"warmup_epochs": 5,
|
||
"description": "自定义配置"
|
||
}
|
||
```
|
||
|
||
然后在 `get_config`函数中添加对应的映射。
|
||
|
||
## 注意事项
|
||
|
||
1. 确保PyTorch版本支持CUDA
|
||
2. 如果遇到显存不足,尝试减小批量大小或增加梯度累积步数
|
||
3. 训练过程中会保存最佳模型和定期检查点
|
||
4. 训练图表会保存在 `./plots`目录中
|
||
|
||
## 性能基准
|
||
|
||
在4G显存的GPU上,使用默认配置(WRN-22-4):
|
||
|
||
- 训练时间: 约2-3小时(200个epoch)
|
||
- 峰值显存使用: 约3.5GB
|
||
- 预期测试准确率: 70%+
|