RoI Pooling中一個很容易理解出錯的地方在於對於某個bin,其由RoI中哪些特徵點做Max Pooling。

最近發現網上很多教程中給的示例都是錯誤的,比如以下教程給出的示例:

Region of interest pooling explained

閱讀caffe2的源碼:caffe2/operators/roi_pool_op.cc可知:

上面這句注釋的意思是RoI Pooling結果的每個bin在RoI中起始和結束的index。

比如對於上圖來說最終RoI Pooling的結果的第0個bin,其實際計算應該是:start_{0h}=floor(0*5/2)=0 end_{0h}=ceil(1*5/2)=3

start_{0w}=floor(0*7/2)=0

end_{0w}=ceil(1*7/2)=4 所以 Pool[0,0]=Max(RoI[0:3,0:4]) 同理可得

Pool[0,1]=Max(RoI[0:3,3:7])

Pool[1,0]=Max(RoI[2:5,0:4]) Pool[1,1]=Max(RoI[2:5,3:7]) 也就是實際上應該如下圖劃分bin:

可以看到在實際劃分時,roi中有一些特徵點是被重複使用的,最終得到RoI Pooling結果應該是:

上述內容實際上在RoI Pooling的反向傳播公式中也有體現:

frac{partial{L}}{partial{x_i}}=sum_{r}{sum_{j}{[i=i^*(r,j)]frac{partial{L}}{partial{y_{rj}}}}}

其中j的累加意思就是對於RoI中的特徵點i,在相同的RoI中其可能會被多個bin所使用,所以其梯度需要考慮多個RoI的多個bin。


推薦閱讀:
相關文章