學界|在有池化層、1步幅的CNN上減少冗餘計算,一種廣泛適用的架構轉換方法

選自arXiv

機器之心編譯

參與:劉天賜、劉曉坤

CNN 的近鄰圖像塊計算中一般都存在冗餘問題,當存在池化層或步幅為 1 時,減少冗餘的方法將變得更加複雜。本文中,來自德國 AI 研究中心等機構的研究者提出了一種在有池化層和步幅為 1 時也能有效減少冗餘的方法。他們的方法普遍性很強,可應用於幾乎全部現有的 CNN 架構上,來實現快速的特徵提取。

雖然絕大多數的 CNN 都直接運行在整張圖像上,但還有很多重要任務需要使用基於圖像塊(patch based)的 CNN 來處理:在一個鄰近、重疊的圖像塊上多次運行同一個 CNN。這類問題大多可以歸為基於 CNN 的特徵提取的範疇 [8, 10],其中包括如攝影機校準、圖像塊匹配 [2]、光流估計 [1, 5],以及立體匹配 [13]。另一方面,也有一些重要的基於圖像塊的應用場景,如滑動窗口的物體識別與檢測 [7],通常並不會被歸為特徵提取任務。

所有基於圖像塊的任務,在近鄰的 CNN 計算之間都存在大量冗餘,如圖 1 所示。如果沒有池化層(pooling layer)或步幅等於 1(striding layer),則可以通過在整張圖像上運行某個通過有限圖像塊訓練的 CNN 來避免這些計算冗餘。但如果存在池化層,情況就會變得很複雜。目前,人們的做法一般是:徹底避免池化層或步幅為 1 [13]、直接使用冗餘計算 [5] 或設計出一個也能得到更稀疏結果的方法 [6, 7]。研究者意識到,僅有他們之前的研究 [1] 來嘗試避免這一冗餘,但也沒有詳細介紹用於避免冗餘的方法。

学界|在有池化层、1步幅的CNN上减少冗余计算,一种广泛适用的架构转换方法

圖 1:左:一個簡單的 1 維 CNN。右:如果將此 CNN 運行在圖像的每個像素位上,來為每個像素位創造特徵,許多中間層結果會在網絡之間實現共享。節點上的數字為該節點被共享的次數。紅色連接展示了紅色節點是如何共享的。步長為 2 的池化減半了輸出分辨率。因此,我們需要兩個池化層:一個原始的(藍色)和一個平移了一個像素的(綠色),來避免輸出分辨率被減半。

在本文中,研究者展示了一個優美的、可推廣的避免冗餘計算的方法,存在池化層或步幅為 1 時本方法依然有效。此方法只需要在原始 CNN 層的基礎上添加實現轉置和重塑(reshape)運算的神經層。這兩種運算基本在所有的機器學習框架中都適用。另外,此方法幾乎可以在目前所有的 CNN 架構中使用。

論文結構如下:第 2 部分展示相關研究;第 3 部分展示本文的方法;第 4 部分展示該方法的一個基準測試。最後在附錄部分,為深度學習框架 Torch 的示例源代碼,使本研究的貢獻更加清楚易懂。

方法

本文中我們希望將一個 CNN CP(利用圖像塊 P T 訓練得到)迅速高效的運行於輸入圖像 I 的所有圖像塊 P(x, y) 上。輸出向量 O(x, y) = CP(P(x, y)) 為一個 k 通道向量,屬於 (I_h,I_w, k) 維的輸出矩陣 O,其中 O 包含了 CP 在所有圖像塊 P(x, y) 上運行的結果。

学界|在有池化层、1步幅的CNN上减少冗余计算,一种广泛适用的架构转换方法

圖 2:通過本文的方法,從網絡 CP 中生成網絡 CI。CI 結果和在圖像 I 的每個圖像塊上獨立運行 CP 得到的結果相同。但 CI 運行速度更快,因為其避免了重疊圖像塊上的冗餘計算。

圖 3 展示了池化的主要問題:不同的圖像塊 P(x, y) :即使它們本身是直接相鄰的,如 P(x, y) 和 P(x+1, y),也需要不同的池化,因此無法共享池化輸出。

学界|在有池化层、1步幅的CNN上减少冗余计算,一种广泛适用的架构转换方法

圖 3:圖像不同位置的圖像塊 P(紅線表示)。第一個圖像塊 P(x, y) 需要的圖像塊 2x2 池化(藍色)和第二個圖像塊 P(x + 1, y) 所需的(綠色)不同。但圖像塊 P(x + 2, y) 則可以再使用第一個池化(藍色)。P(x, y) 和 P(x + 2, y) 的重疊部分結果相同,因此可以共享(黃色部分)。藍色圖像塊和綠色圖像塊之間無法共享池化。

圖 4 展示了 2×2 池化的展開。當存在多個池化層是,直接展開相當複雜。這也許是之前研究避免池化層的一個原因。

学界|在有池化层、1步幅的CNN上减少冗余计算,一种广泛适用的架构转换方法

圖 4:左:來自 2×2 多池化(Multi-pooling)得到的 2×2 = 4 輸出圖。右:輸出 O 的最終展開。

如圖 5 所示,需要將將內部的 x 和 y 維傳遞給右邊,並將外部維度傳遞給左邊。

学界|在有池化层、1步幅的CNN上减少冗余计算,一种广泛适用的架构转换方法

圖 5:問題 (x2, x1 +1) = (x2, x1) + 2 和 (x2, x1) = (x2, x1) + 1:內部維度 x1 的步長更大。可以通過轉置(交換)兩個維度來修復此問題。然後,記憶(memory)的重新解釋(重塑)可以將其降低為一個 x 維度。

實驗

学界|在有池化层、1步幅的CNN上减少冗余计算,一种广泛适用的架构转换方法

表 1:CP 和 CI 的速度基準測試。後者的速度明顯更快,在更大圖像上尤為如此。研究者提供了基準測試的源代碼作為補充材料,以滿足復現性要求。對於 CP 而言記憶並不是一個大問題(見正文)。

論文:Fast Dense Feature Extraction with CNNs that have Pooling or Striding Layers

学界|在有池化层、1步幅的CNN上减少冗余计算,一种广泛适用的架构转换方法

論文地址:https://arxiv.org/pdf/1805.03096.pdf

近年,許多研究表明,基於卷積神經網絡提取的特徵比工程化特徵表現更好。但目前還缺少在完整圖像上高效提取局部特徵的研究。本文展示了一種當存在池化層和步幅為 1 時,對完整圖像計算基於圖像塊的局部特徵解釋器的高效算法。這是一種通用方法,可以應用於幾乎所有的現有神經網絡架構。這包含了所有的用於局部特徵提取的神經網絡,如攝影機校準、圖像塊匹配、光流估計,以及立體匹配。另外,此方法也可以應用於其他基於圖像塊的方法,如滑動窗口的物體檢測與識別。我們將一個基於 CNN 的特徵提取方法運用於整張圖像,並給出使用/未使用我們的加速方法下的速度基準測試,以及對應的(Torch)示例代碼:這表明任意 CNN 架構都可以輕鬆地用我們的方法轉換。

學界|在有池化層、1步幅的CNN上減少冗餘計算,一種廣泛適用的架構轉換方法

✄------------------------------------------------

廣告&商務合作:[email protected]


分享到:


相關文章: