全卷積網路
全卷積網路
FCN的概念由Jonathan Long等人在2015年發表的論文中首次提出,用於語義分割(根據影象所屬物體的類別對影象中的每個畫素點進行分類的任務)。作者指出,可以用卷積層代替CNN頂部的密集層。
假設一個具有200個神經元的密集層位於一個卷積層的頂部,該卷積層輸出100個特徵圖,每個特徵圖的大小為\(7\times7\)。每個神經元將計算來自卷積層的\(100\times\times7\times7\)的加權和(加上偏差項)。如果使用200個濾波器(每個濾波器大小為\(7\times7\))並使用“valid"填充將卷積層替換為密集層。該層將輸出200個特徵圖,每個特徵圖為\(1\times1\)(因為核心正好是輸入特徵圖的大小,並且使用的是'valid'填充)。它將輸出200個數字,就像密集層一樣。唯一的區別是:密集層的輸出是形狀為[批量大小,200]的張量,而卷積層將輸出形狀為[批量大小, 1, 1, 200]的張量
要將密集層轉換為卷積層,卷積層中的濾波器數必須等於密集層中單元數,濾波器大小必須等於輸入特徵圖的大小,並且必須使用‘valid’填充、步幅可以設定為1或者更大
雖然密集層需要特定的輸入大小(因為每個輸入特徵只有一個權重),但是卷積層可以愉快地處理任何大小的影象(但是,它確實希望輸入具有特定數量的通道,因為每個核心為每個輸入通道包含一組不同的權重)。由於FCN僅包含卷積層(以及具有相同屬性的池化層),因此可以在任何大小的影象上對其進行訓練和執行
例如,假設已經訓練了CNN以進行花的分類和定位。它在\(224\times224\)影象上進行訓練,並輸出10個數字:通過softmax啟用函式輸出0到4,這給出了類別概率(每個類別一個);通過邏輯啟用函式輸出5,這給出了客觀分數;不使用任何啟用函式輸出6到9,它們表示邊界框的中心座標及其高度和寬度。可以將其密集層轉換為卷積層。實際上,甚至不需要重新訓練,可以將權重從密集層複製到卷積層,或者在訓練之前將CNN轉換為FCN
現在假設當網路被送入一個\(224\times224\)影象時,輸出層之前的最後一個卷積層(也成為bottleneck層)輸出\(7\times7\)特徵圖。如果向FCN提供\(448\times448\)的影象,則瓶頸層將輸出\(14\times14\)的特徵圖。由於密集層已被卷積層替換,使用了10個大小為\(7\times7\)的濾波器,填充為‘valid’且步幅為1,卷積層輸出將由10個特徵圖組成,每個特徵圖的大小為\(8\times8\)(14-7+1=8)。FCN將只處理一次整個影象,並且輸出一個\(8\times8\)的網格,其中每個單元包含10個數字(5個類別概率、1個客觀分數和4個邊界框座標)。這就像拿一個原始的CNN,以每行8步和每列8步的方式在影象上滑動一樣。
將原始影象切成\(14\times14\)的網格,然後在該網格上滑動\(7\times7\)的視窗。該視窗將有\(8\times8=64\)個可能的位置,因此有\(8\times8\)個預測。但是,由於網路只檢視一次影象,因此FCN方法效率更高。