FCN(6)——從CRF到RNN
本文收錄在無痛的機器學習第一季。
前面我們花了大量的篇章介紹了CRF和DenseCRF的內容,下面我們把FCN和CRF串起來。
CRFasRNN
前面我們在denseCRF中留了一個小尾巴,那就是unary function。為了讓FCN結合起來,這裡我們做兩個設定:
- FCN的結合作為unary function的結果
- FCN的結果作為pairwise function中的Q函數的初始值。
這樣FCN和CRF就連起來了。下面我們還要解決一個問題,就是為什麼是CRFasRNN?
在這篇模型結合的論文中,作者將CRF的求解過程轉換成了RNN的形式。由於CRF的求解演算法是迭代進行的,因此把演算法展開,我們可以將其變成RNN的形式,這裡的細節在此就不多說了,大家看看論文基本就能看懂。
實現
下面就來看看他的具體實現:GitHub - torrvision/crfasrnn: This repository contains the source code for the semantic image segmentation method described in the ICCV 2015 paper: Conditional Random Fields as Recurrent Neural Networks. http://crfasrnn.torr.vision/
我們先來看看它的prototxt,我們可以用下面這張圖表示:
可以看出網路的主體部分是由之前的FCN組成。在前面的FCN中我們沒有介紹其實現,這裡我們就詳細看下它的實現。我們從圖的左上角出發,到圖的左下角,然後再返回到右上角。前面全部是卷積、relu和maxpooling這幾部分,後面是不同scale的結果融合。這裡詳細地展示了這一部分的維度內容。
從實現中,我們可以看出一些值得深思的細節。
首先是一開始的padding=100。為了不讓最終的feature map太小,添加一個較大的padding是十分必要的。
其次就是最後一層的MULTI_STAGE_MEANFIELD,這一層我們需要特別介紹一下,雖然在文章中作者提到了CRF as RNN的概念,但是實際上它的實現並沒有用RNN的框架,當然Caffe裡面並沒有這裡可用的RNN。這裡是將所有的CRF的內容集成到了一個層中,所以這一層會比較複雜,計算量也比較大,其中的反向傳播也比較複雜。
首先我們將演算法的流程圖展示出來:
可以看出,這其中的計算主要涉及到兩個類別—— MultiStageMeanfieldLayer和MeanfieldIteration,其中的MultiStageMeanfieldLayer類主要負責演算法內容的組織,而其中的MeanfieldIteration類主要負責迭代計算過程。這些內容我們都可以從上面的圖中讀出。
可以看出這其中的細節除了計算高斯濾波部分的Permutohedral比較複雜,屬於超綱內容,其他的部分相對比較好理解。關於Permutohedral部分的細節,有機會我們可以開一個CV系列的文章另行講解。
MeanfieldIteration的反向操作實際上並不複雜,只要記得把這些過程拆解成一個個小部分慢慢算梯度就好,而MultiStageMeanfieldLayer的反向操作也只是把MeanfieldIteration的反向結果合併起來,具體細節可以去看看源碼,這裡我們就不再贅述了。
到這裡,我們已經實現了將CNN和CRF無縫連接起來了。比起之前的單獨由CNN組成的FCN,我們已經有了很大的進步。
到這裡,實際上我們花了很大的力氣在介紹CRF和無向概率圖模型的內容,但是我們終於把這部分的內容講完了。讓我休息一下……
廣告時間
更多精彩盡在《深度學習輕鬆學:核心演算法與視覺實踐》!
推薦閱讀:
TAG:机器学习 | 深度学习DeepLearning | 概率图模型 |