biubug6 / Pytorch_Retinaface

Retinaface get 80.99% in widerface hard val using mobilenet0.25.
MIT License
2.63k stars 774 forks source link

classification loss 的算法 #41

Open twmht opened 5 years ago

twmht commented 5 years ago

有一段不是很能理解

https://github.com/biubug6/Pytorch_Retinaface/blob/master/layers/modules/multibox_loss.py#L101

loss_c = log_sum_exp(batch_conf) - batch_conf.gather(1, conf_t.view(-1, 1))

batch_conf 的 shape 是 (num_anchors, 2)

但這邊是透過 log_sum_exp 把 batch_conf 中每個 anchor 對於每個 class 的值相加取 log (log_sum_exp(batch_conf)),但是第一個 class 不是背景嗎?有需要把背景考慮進來?

後面又更不懂, batch_conf.gather(1, conf_t.view(-1, 1)) ,這邊為什麼沒有做 log_sum_exp

可以解釋一下這邊的意思嗎?

謝謝

twmht commented 5 years ago

我看 retinaface 的 paper (https://arxiv.org/abs/1905.00641) 也沒有解釋它們怎麼算的...

twmht commented 5 years ago

對於整個算法我的理解

batch_conf: a1_c1, a1_c2 a2_c1, a2_c2 ... an_cn, an_cn

log_sum_exp(batch_conf) 是把 batch_conf 弄成

a1_c1, + a1_c2 a2_c1 + a2_c2 ... an_cn + an_cn

這邊為了方便省略 log 的計算了...

然後去扣這個 anchor 對到的 bounding box (可能是背景),如果是背景的話,就盡可能讓網路學習把前景的 conf 學成 0

我這樣的理解對嗎?

Michael3444 commented 5 years ago

@twmht 这个公式是手动计算cross_entropy为后续ohem作准备的,交叉熵公式-pi*log(qi), 其中pi=1,qi为Softmax的结果,因此公式简化为log( exp(x0-xmax) + exp(x1-xmax) ) - log( exp(xi-xmax) ) = log( exp(x0-xmax) + exp(x1-xmax) ) + xmax - xi = log_sum_exp(xi) - xi, xi为网络的输出值,x0代表背景,x1代表人脸