在跑 Faster-RCNN 的代碼的時候,可能手殘想更改官方的Pascal VOC數據集,改成跑自己的數據集。
但是可能會出現這樣或者類似的warning:
RuntimeWarning: invalid value encountered in true_divide
RuntimeWarning: invalid value encountered in greater_equal
...
接着可能就會出現loss = nan的情況,且一直不見好轉
通過一步步調試和網上搜集,發現可能的原因:
就是這篇博客給出的原因,具體討論也可以參照rbg大佬github官方issue。
由於我們更換了數據集,所以在製作自己的數據集的annotation時候,可能會出現bbox的寬w和高h爲0的情況,這樣導致在代碼中計算偏移的時候,或者爲負無窮大。
這樣求得的rpn_loc和gt_rpn_loc算rpn loss的時候會使得loss = nan
具體做法:嘗試修改rpn網絡中把anchor轉location的地方添加一個限制,即限制和不能太小
參考代碼:
BBOX_XFORM_CLIP = np.log(bbox_min / img_max) # bbox: 16 img_max: 1000
tw = np.maximum(tw, BBOX_XFORM_CLIP)
th = np.maximum(th, BBOX_XFORM_CLIP)
其中bbox_min是預先設置的bbox的最小框寬高,img_max是在crop圖片時候保留的最大寬高,也是bbox的最大框寬高。
當然,網上也有方法說降低學習率,比如講1e-3改成1e-4
或者改RNG_SEED = 3到RNG_SEED = 4
參考:
【1】https://www.jianshu.com/p/1168fe20cc23