从今天开始,阅读faster rcnn的相关代码,并记录我对faster rcnn中特别的层的理解。本篇主要是对smooth_L1_Loss层进行解读。
RBG大神认为CPU版本的太慢了,故有些操作CPU版压根就没有实现。smooth_L1_Loss是Faster RCNN提出来的计算距离的loss,文章中提到对噪声点更加鲁棒。
输入四个bottom,分别是predict,target,inside_weight, outside_weight.与论文并不完全一致,代码中实现的是更加general的版本。
公式为:
output=wout∗Smoothl1(xnew)
Smoothl1(x)=0.5∗(σ∗x)2 or Smoothl1(x)=|x|−0.5/σ2
xnew=xold∗win
LayerSetup
就是对记录相关参数并计算
σ2
,并判断是否含有weights.
Resharp
就是针对diff_ , errors_ , ones_,进行reshape
Forward
先计算
win∗(b0−b1)
,再计算
wout∗Smoothl1(win∗(b0−b1))
,最终将所有值加起来除以num得到loss。
Backward
backward的公式并不麻烦,公式如下:
Smooth′l1(x)=σ2∗x or Smooth′l1(x)=sign(x)
δlossδb0=wout∗win∗Smooth′l1(win∗(b0−b1))
δlossδb1=−wout∗win∗Smooth′l1(win∗(b0−b1))
直接按照公式去做即可,不过有那么一点点不明白的地方,就是为什么对 b1 也求偏导呢??可能在看了AnchorTargetLayer层之后就会得到答案。
另:blog居然可以用类似与latex的版本,唉之前写的blog排版太丑了,这个好很多,也更加好用啦,哇咔咔。