smooth l1(huber)+binary cross entropy详解(tensorflow+pytorch)
前言
上篇講到yolo?v2 loss中使用了兩個loss分別時wh使用的smoothl1?loss以及其他的BCEloss,這里做個擴展介紹,并對比pytorch以及tensorflow的api接口的使用
smooth?l1(huber loss)
轉載自知乎高贊回答:https://www.jianshu.com/p/19483787fa24
smooth L1 loss能從兩個方面限制梯度:
- 當預測框與 ground truth 差別過大時,梯度值不至于過大;
- 當預測框與 ground truth 差別很小時,梯度值足夠小。
考察如下幾種損失函數,其中
?
損失函數對 x 的導數分別為:
? ? ? ? ? ? ? ??
觀察 (4),當 x 增大時 L2 損失對 x 的導數也增大。這就導致訓練初期,預測值與 groud truth 差異過于大時,損失函數對預測值的梯度十分大,訓練不穩定。
根據方程 (5),L1 對 x 的導數為常數。這就導致訓練后期,預測值與 ground truth 差異很小時, L1 損失對預測值的導數的絕對值仍然為 1,而 learning rate 如果不變,損失函數將在穩定值附近波動,難以繼續收斂以達到更高精度。
最后觀察 (6),smooth L1 在 x 較小時,對 x 的梯度也會變小,而在 x 很大時,對 x 的梯度的絕對值達到上限 1,也不會太大以至于破壞網絡參數。 smooth L1 完美地避開了 L1 和 L2 損失的缺陷。其函數圖像如下:
? ? ? ? ? ? ? ? ? ??
由圖中可以看出,它在遠離坐標原點處,圖像和 L1 loss 很接近,而在坐標原點附近,轉折十分平滑,不像 L1 loss 有個尖角,因此叫做 smooth L1 loss。
pytorch及tensorflow接口
pytorch:
import torch.nn as nn smooth_l1 = nn.SmoothL1Loss(reduce=False) loss = smooth_l1(coord_wh,?tcoord_wh))tensorflow:
#reduction參數默認返回sum值,若要返回同shape的矩陣則傳入NONE loss = tf.losses.huber_loss(gt_coord_wh, pre_coord_wh, reduction=tf.losses.Reduction.NONE)各參數含義見:https://www.w3cschool.cn/tensorflow_python/tensorflow_python-2cbn2wyj.html
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的smooth l1(huber)+binary cross entropy详解(tensorflow+pytorch)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: QNNPACK高性能前向内核库全面剖析—
- 下一篇: 如何插入8bit量化节点(tensorf
