0. 前言
- paper: 商汤 CVPR2017 Residual Attention_Network for Image Classification
- code: caffe, caffe网络可视化工具 Netscope, pytorch
- paper: ECCV2018_CBAM: Convolutional Block Attention Module
- code: pytorch
- paper: GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond
- code: pytorch 这篇论文也是讲 attention map 的,主要用于分类,说实话,没有太理解其中的创新点,可能是因为不懂整个 attention map 的进程,前人做到了什么地步,从效果图上看,感觉比 Dual Attention 那篇论文还是差一些。不过能上 CVPR 的肯定有牛的地方,只是自己水平不够。
1. Residual Attention Network
每个 Attention Module 都分为两个分支:mask branch and trunk branch。

其中,c表示通道,i表示所有的位置,$M_{i,c}(x)\in[0,1]$
1.1 Spatial Attention and Channel Attention
Mixed attention:
Channel Attention:
Spatial Attention:


2. code
代码有点绕,暂时没有看懂。
3. CBAM

4. code
简单明了
1 | class ChannelAttention(nn.Module): |
5. GCNet

综合考虑了 SE-block 和 NL-block。
代码有点绕,暂时不看。
5. 优化器 optimizer
不同的优化器,对结果也有很大的影响,先只记录一下 SGD, Adam 的常见参数配置。
原始 SGD:
- 学习率太小 0.20 ,有限步内无法达到最优,全程都没有震荡
- 学习率太大 0.61 ,会造成剧烈震荡,随着学习率的增加,后期震荡逐渐变大,0.52时后期震荡就已经无法收敛了
- 学习率适中 0.42 ,会成功达到最优点,前期会有震荡,后期没有震荡
- 对学习率很敏感

带动量的 SGD:
- 适中的动量 beta=0.42 可以减少大学习率 lr=0.61 的震荡,达到最优点
- 较大的动量 beta=0.81 会对大学习率 lr=0.61 引入更大的震荡
- 一般的做法是大的动量 beta=0.9 和小的学习率 lr=0.02 or 0.03,会以比较平缓的方式加速达到最优
- 当 lr=0.01 时,beta不管怎么取都达不到最优,或者没到,或者超过
- 当 beta=0.9 时,对学习率也比较敏感,0.01会到不了最优点、0.02会到最优点前面、0.03会到最优点后面,区别比较大
- 常用设置:beta=0.9,weight-decay=5e-4,nesterov=True,之后再调节 lr 吧。
1 | torch.optim.SGD(params, lr, momentum=0.9, weight_decay=5e-4, nesterov=True) |
Adam:
- 对学习率不敏感
- 训练稳定
- 在最优点附件
- 参数设置:beta1=0.9, beta2=0.999, eta=1e-8
虽然 Adam 对初始学习率不敏感,训练也比较稳定,但最终能达到的精度没有手动调好的SGD来得高。
1 | torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=1e-4) |