何为EMA?
定义: 滑动平均/指数加权平均:用来估计变量的局部均值,使得变量的更新与一段时间内的历史取值有关,滑动平均可以看作是变量的过去一段时间取值的均值。
优点: 相比于直接赋值,滑动平均得到的值在图像上更加平缓光滑,抖动性更小。也可以理解为,由于model在最后收敛时,weights会在全局最优点抖动,所有在最后收敛过程中使用模型权重均值更能代表模型的最终训练结果,即仅在测试时使用。
需要注意的是 ,训练时计算EMA得到的shadow-weights更新值不在训练时使用,其使用的仍然是原始weights。而shadow-weights使用在val测试中,这部分可以通过代码理解。
yolox/core/trainer.py
验证是否使用了ema
跳转yolox/exp/yolox_base.py
继续回到self.ema_model,进入ModelEMA跳转至 yolox/utils/ema.py
通过代码,我们可以看见训练时计算EMA得到的shadow-weights更新值被存到v中,其并不会参加梯度下降,即只在测试时使用。此外,在计算时使用了.detach(),说明所得到的v是被生成的一个新的tensor,其不会影响训练时梯度求导,即weights和shadow-weights是两个分离的tensor。