Depth-wise Convolution keras 運行時間緩慢原因

提到depth-wise conv2D 大家都如數家珍,這裏我就簡單的介紹一下,用兩張圖就可以概述出來了,大家想要看具體的介紹可以看

A Basic Introduction to Separable Convolutions 這篇文章介紹的很清楚。

上圖是一個正常的卷積操作,是一個12×12×3的特徵圖經過256個卷積核大小爲5×5×3的卷積得到了一個8×8×256的特徵圖。這是正常的卷積。參數量爲256 x 5 x 5 x 3 = 19200,乘法次數爲256 x 5 x 5 x 3 x 8 x 8 = 1228800。

上圖就是一個depthwisie-conv2D 卷積了。可以看到它採用了3個5×5×1的卷積核來操作得到3個8×8 ×3的特徵圖。其參數量

3 x 5 x 5 x 1 乘法次數爲3 x 5 x 5 x 1 x 8 x 8。我們可以看到參數量核乘法次數大大降低了。下面是一個 Point-wise Conv.的操作。這兩個加起來就是一個Separable Conv 了。

我們可以看到這兩個卷積操作加起來的參數量和正常的卷積操作比起來大大降低了參數量。那麼我們是不是可以直接用這個了。都有這麼多優點了爲啥我見到的用的人比較少暱。當我們使用keras 中的depthwiseconv2D 操作時這個時候發現網絡的運行速度大大降低了。不是說好參數量減少了,不是說運行速度提升呀。這個問題我也時一直疑惑的。直到我看到這個文章。

Flops與模型的推理速度。這個文章解釋的很清楚了。簡單來說,depth-wise卷積的FLOPs更少沒錯,但是在相同的FLOPs條件下,depth-wise卷積需要的IO讀取次數是普通卷積的100倍,因此,由於depth-wise卷積的小尺寸,相同的顯存下,我們能放更大的batch來讓GPU跑滿,但是此時速度的瓶頸已經從計算變成了IO。自然desired小尺寸卷積應該有的快速的特性,也無法實現。

看到這裏我終於明白爲啥一些大組喜歡用這個卷積了,因爲他們有很好的機器的,可以更好的發揮depthwiseconv2D 網絡的性能了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章