# LeNet
1 | Conv2d output shape: torch.Size([1, 6, 28, 28]) |
# 数据集
1 | train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size=b, num_workers=n) |
# 效率评估
# 实验数据
1 | learning rate = 0.9, num_epochs = 5 |
| Batch Size | Num Workers | Device | Time | Accuracy |
|---|---|---|---|---|
| 64 | 2 | GPU | 53.6s | 0.795 |
| 256 | 4 | GPU | 57.5s | 0.635 |
| 32 | 2 | GPU | 1m05s | 0.803 |
| 32 | 1 | GPU | 1m09s | 0.822 |
| 16 | 1 | GPU | 1m20s | 0.854 |
| 8 | 1 | GPU | 1m55s | 0.856 |
| 256 | 8 | GPU | 1m55s | 0.509 |
| 8 | 1 | CPU | 3m01s | 0.852 |
# 分析
- 过多的
num workers会导致效率下降,可能系硬盘资源占用过多(虚拟内存) batch size增大,在训练轮数相同时,一定程度上降低预测准确率Time存在瓶颈,不随batch size增大一直增大,考虑系 数据加载的速度跟不上显卡处理的速度Batch size=256, 64 时accuracy较低,可能是因为训练轮数较少,尚未收敛
# 训练时遇到的问题
DataLoader worker exited unexpectedly- Vscode 卡退
oomcrashed - 显存不足
- 训练卡死,长时间保持在一个进度
- 训练结束后仍占用 GPU 资源 (~1500MB)
前两者主要为电脑内存不足导致,解决方法系 高级系统设置,调整虚拟内存(D 盘)
3 解决方法为使用较小的 batch size
4 尚不清楚原因(锁死?GPU 缓存?),解决方法为重启内核
5 会带来什么影响吗,会影响接下来的训练吗,是否需要重启内核或者 torch.cuda.empty_cache() 呢
并且 torch.cuda.empty_cache() 后还会有显存占用,貌似是因为 load_data_fashion_mnist 默认使用 device 为 cuda:0
# 修改网络架构
# 将所有 sigmoid 改为 ReLU

保持训练条件 lr = 0.9, num_epochs = 5 不变,发现:
train acc 和 test acc 均只有 0.1, Loss 相当大,这与未经训练随机猜没有区别,
模型出现欠拟合可能是由学习率过大引发梯度爆炸所致
将 lr 由 0.9 修改为 0.1 后,准确率显著提升,达到 0.84~0.85
经过 10 轮训练, loss 0.290, train acc 0.891, test acc 0.867
# 使用 MaxPool

lr = 0.1, num_epochs = 10
loss 0.261, train acc 0.902, test acc 0.885
效果略有提升
补充:又进行了几次实验,发现 lr = 0.1 还是有概率出现(梯度爆炸)欠拟合情况,故设置 lr = 0.05
# 可视化卷积层结果
# 对比 原始 LeNet (b=64, n=2)
# 更多的结果
第一个 ReLU 层的 6 个通道
第二个 ReLU 层的 16 个通道
First written 2024/08/07
Last updated 2024/08/08