天池2021全国数字生态创新大赛 智能算法赛:生态资产智能分析
- segmentation-models-pytorch
pip install git+https://github.com/qubvel/segmentation_models.pytorch
python train.py
python inference.py
zip -r results.zip results
- 修改代码中bug(test 中图像格式需要从BGR 转换为 RGB)
- 线上分数 0.3406
- 增加 re-weight 策略
- 线上分数 0.3511 (线下验证集 miou 分数下降, 线上分数反而提高了, 可能是因为训练集和测试的数据分布不同导致的)
- 更换baseline
- backbone: efficient
- model: unet++
- image_scale: 256
- 联合loss: dice_loss + label_smooth
- optimize: adamW
- scheduler: warmUpConsineScheduler
- batch_size: 6
- num_train:num_val = 0.85:0.15
- lr: 3e-4
- 线上分数 0.3712
- epoch: 44
- 增大epoch: 30 -> 44
- 线上分数 0.3763
- epoch 44
- class_weights: [0.25430845, 0.24128766, 0.72660323, 0.57558217, 0.74196072, 0.56340895, 0.76608468, 0.80792181, 0.47695224, 1.]
- 增加 re-weight 策略 不 wrok
- num_train:num_val = 1 : 0.15
- batch_size: 6
- epoch 44
- 使用全量数据进行训练
- 线上分数 0.3768
-
num_train:num_val = 1 :0.15
-
batch_size: 6 * 3 = 18
-
epoch 44
-
增大 batch-size: 6 -> 18
使用 gradient accumulate 训练, 进行梯度累加要注意batch_size 与 learning_rate 匹配的问题:
- 通常来说,batch_size 与 learning rate 要等比例地放大, 此时不需要修改loss, 累计多个batch的loss之和, 再执行一次更新, 本质上相当于扩大了learning rate,代码如下
# 2.1 loss regularization regular_loss = loss # 2.2 back propagation scaler.scale(regular_loss).backward() # 2.3 update parameters of net if (batch_idx + 1) % accumulation_steps == 0: scaler.step(optimizer) scaler.update() optimizer.zero_grad() scheduler.step(epoch + batch_idx / train_loader_size)
- 如果由于GPU显存的限制,只希望扩大batch_size, 同时保持学习大小不变,此时需要对累计的多个batch的loss求平均, 再执行一次更新, 代码如下
# 2.1 loss regularization regular_loss = loss / accumulation_steps # 2.2 back propagation scaler.scale(regular_loss).backward() # 2.3 update parameters of net if (batch_idx + 1) % accumulation_steps == 0: scaler.step(optimizer) scaler.update() optimizer.zero_grad() scheduler.step(epoch + batch_idx / train_loader_size)
如果 batch size 大了,那么 gradient 里的 noise 会变小,SGD 越来越像 gradient descent, 此时迭代时的泛化性可能会降低。
- 通常来说,batch_size 与 learning rate 要等比例地放大, 此时不需要修改loss, 累计多个batch的loss之和, 再执行一次更新, 本质上相当于扩大了learning rate,代码如下
-
线上分数 0.3808
- num_train:num_val = 1 :0.15
- batch_size: 16
- epoch 44
- 线上分数 0.3820
- num_train:num_val = 1 :0.15
- batch_size: 16
- optimize: SGDM
- scheduler: NoamLR
- lr: 0.01
- epoch 80
- warmup
- re-weight
- re-sample
- dice loss
- lovasz_loss
- CosineAnnealingWarmRestarts
- data augmentation
- TTA
- 针对 grass、construction、 bareland 训练二分类模型
- SWA(Stochastic Weights Averaging)