最漫长的一次训练

这几天为了参加Kaggle某图像处理比赛,训练了一个大尺寸的u-net模型。一共训练了42轮,每轮3800秒以上,花费了将近48个小时。此外,为了生成提交文件,又额外花费了7个小时。两天半的时间就这样没了。

 

过程之所以这么漫长,是因为精度要求比较高(0.997以上才有希望拿到好的名次)。输入图片尺寸1024*1024,经过实验,只有采用了1024个以上filter的卷积层组成的U-NET,才有可能达到这样的精度。对于这个复杂的U-NET,我的GTX 1060 6G显存的GPU真地吃不消。一个批次最多只能训练两条数据,否则就内存溢出。如果有12G显存的GPU的话,训练时间可以减少一半以上。

 

这次漫长的训练,最大的收获是:学会了耐心等待,确认了带不断衰退的学习率的SGD优化器是可靠的。

------------------------------------------------------------------------------------------------------------

0823,更新

尝试训练1280x1280尺寸的图片,结果一次只能训练一张图片,训练一轮需要5430秒,实在是太慢了。考虑用mxnet方案来替换tensorflow。

 

转载于:https://my.oschina.net/qinhui99/blog/1518753

### Deformable DETR 模型的训练时间及其影响因素 Deformable DETR 是一种改进版的目标检测模型,旨在解决原始 DETR 收敛速度较慢的问题。通过采用稀疏空间采样的方式,Deformable DETR 显著提高了计算效率并减少了训练时间[^5]。 #### 训练时间的影响因素 以下是可能导致 Deformable DETR 训练时间变化的主要因素: 1. **数据集规模** 数据集越大,每次迭代所需的计算量也越多,从而延长整体训练时间。对于大规模的数据集(如 COCO),训练时间会显著增加。 2. **输入分辨率** 输入图像的分辨率越高,特征图上的像素数量就越多,导致变形注意力模块需要处理更多的采样点。这不仅增加了单次前向传播的时间开销,还会使反向传播更加耗时。 3. **网络深度与宽度** 更深或更宽的 Transformer 编码器/解码器架构意味着更大的参数量和更高的计算需求,进而拉长训练周期。 4. **硬件配置** 使用高性能 GPU 或 TPU 可以大幅缩短每轮 epoch 所需时间;反之,如果依赖较低端设备,则可能会经历漫长的等待过程。 5. **批量大小 (Batch Size)** 较大批次能够充分利用现代GPU内存资源,减少单位时间内完成epoch次数所需的实际秒数。然而过大的batch size也可能因显存不足而导致OOM错误或者降低终效果质量。 6. **优化策略设置** 学习率调整计划、权重衰减系数以及其他超参的选择都会直接影响收敛速率及总步数,间接作用于整个流程持续多久才能达到预期性能水平。 #### 优化方法 为了有效控制和缩减 Deformable DETR 的训练时间,可以考虑以下几种途径: - **利用预训练模型初始化权值** 基础骨干网路(pre-trained backbone networks),比如 ResNet, Swin Transformers 等经过充分调优后的版本可以直接拿来当作起点,这样可以从一开始就具备较好的泛化能力和表征学习基础,大大加快后续微调的速度。 - **应用混合精度训练(Mixed Precision Training)** FP16半精度浮点运算相较于传统FP32全精度操作能节省一半存储空间的同时保持几乎相同的数值范围覆盖程度,这对于缓解显卡压力很有帮助,并且通常还能带来一定幅度的速度提升。 - **分布式训练(Distributed Training)** 当单一机器难以满足快速实验的需求时,可以通过多节点或多进程协同工作的方式分散负载至不同物理位置下的计算单元之上共同推进任务进展。 - **引入正则项约束(Regularization Terms)** 如 DN Loss 提供的一种去噪机制有助于稳定早期阶段可能出现的不稳定现象,促进更快进入平稳区域[^2]。 ```python import torch.nn as nn class OptimizedDeformableDETR(nn.Module): def __init__(self, pretrained_backbone=True, mixed_precision=False): super(OptimizedDeformableDETR, self).__init__() # Initialize with pre-trained weights if specified self.backbone = BackboneNetwork(pretrained=pretrained_backbone) # Enable Mixed-Precision training if required if mixed_precision: self.scaler = torch.cuda.amp.GradScaler() def forward(self, x): features = self.backbone(x) return features ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值