卷積自編碼

chen_h發表於2019-02-16

作者:chen_h
微訊號 & QQ:862251340
微信公眾號:coderpai
我的部落格:請點選這裡

這篇教程是翻譯Paolo Galeone寫的卷積自編碼分析教程,作者已經授權翻譯,這是原文

卷積操作符會對輸入訊號進行濾波操作,以便提取其內容的一部分。在傳統的方法中,自編碼沒有考慮到訊號可以被看做是和其他訊號的和。相反,卷積自編碼就是使用卷積操作來做訊號的疊加之和。他們對一組簡單的輸入訊號進行編碼,然後對這些訊號再進行重新建模。

卷積

圖 1. 輸入的維度是 4*4*1的,卷積核的維度是 3*3*1的,所以輸出的特徵圖是 2*2*1的

在一般連續狀態,卷積被定義為兩個函式(訊號)被反轉和移位之後的乘積的積分:

作為結果,卷積操作會產生一個新的函式(訊號)。卷積滿足交換操作,因此:

在一般的 n 維空間輸入,自編碼可以被用來訓練解碼(編碼)。實際上,自編碼通常用於對二維的,有限和離散輸入訊號進行特徵提取,比如數字影象。

在二維離散空間,卷積操作可以被定義如下:

因為影象的範圍有限,所以該公式可以變為:

其中:

  • O(i, j) 表示輸出畫素,位置是 (i, j)

  • 2k+1 是表示矩形奇數卷積核的一條邊

  • F 表示卷積核

  • I 表示輸入影象

對於圖1所示,單個卷積核操作在輸入影象 I 的每個位置 (i, j) 進行卷積操作。

圖2:利用一個手工製作的卷積核對圖片進行卷積操作,從而提取輸入影象的邊緣

從圖2可以很容易的看出,卷積操作的結果取決於卷積核的值。根據不同的卷積核設定,每個卷積核可以用於不同的影象處理任務,比如去噪,模糊處理等等....

離散二維卷積操作有兩個附加引數:水平和垂直移動步數。它們是在執行單個卷積步驟之後,沿著影象 I 的各個維度跳過的畫素的數量。通常,水平和垂直移動步數是相等的,它們被標記為 S

對於一個正方形的影象 Iw = Ih (這是為了簡單描述,如果要擴充到一般的矩陣影象,非常方便),以步數 2k+1 ,進行二維的離散卷積操作之後,我們可以得到如下的影象 O

到目前為止,我們已經利用了單個卷積核對影象進行灰度級(單通道)操作的情況。如果輸入影象具有多個通道,即 D 個通道,那麼卷積運算元沿著每一個通道都要進行操作。

一般規則下,一個卷積核的輸出通道數必須和輸入影象的通道數一樣。所以可以概括為,離散二維的卷積是將訊號進行堆疊處理。

各個維度上的卷積

長方體完全可以由三元組 (W, H, D) 來表示,其中:

  • W≥1 表示長度

  • H≥1 表示高度

  • D≥1 表示深度

很明顯,一個灰度影象可以看做是深度 D = 1 的長方體,而RGB影象可以看做是深度 D = 3 的長方體。

一個卷積核也可以看做是一個具有深度 D 的卷積核。特別地,我們可以將影象和濾波器視為單通道影象/濾波器的集合(與順序無關)。

如果我們考慮影象的深度,那麼以前的卷積公式可以概括為:

在影象上進行卷積之後,得到的結果稱為啟用圖(activation map)。啟用圖是深度 D = 1 的長方體。

可能聽起來很奇怪,在一個三維影象上的卷積得到的結果是一個二維的結果。實際上,對於具有深度 D 的輸入訊號,卷積核執行精確的 D 個離散的二維卷積操作。所產生的D個二維的啟用圖,之後將這D個啟用圖進行處理,從而得到一個二維的卷積結果。以這種方式,所得到的啟用圖 O 的每個單位 (i, j) 包含的資訊是提取該位置所有資訊的結果。

直觀地來說,可以將該操作認為是將輸入的RGB通道轉換成一個單通道進行輸出。

卷積自編碼

卷積自編碼(CAE)從不同的角度來定義濾波器的任務:而不像平時我們遇到的那些工程上的卷積濾波器,它們的作用就是讓模型學習到最佳濾波器,從而使得重構誤差最小。然後,這些訓練好的濾波器就可以被使用到任何其他的計算機視覺任務。

目前利用卷積核進行無監督學習的最先進工具就是卷積自編碼(CAE)。一旦這些卷積核被訓練學習之後,它們將被應用到任何的輸入資料去進行特徵提取。然後,這些特徵就可以被用於任何的任務,例如分類問題。

CAE是卷積神經網路(CNN)的一種型別:CNN和CAE之間最主要的區別在於前者是進行端到端的學習濾波器,並且將提取的特徵進行組合從而用來分類。事實上,CNN通常被稱為是一種監督學習。相反,後者通常被用來訓練從輸入資料中提取特徵,從而重構輸入資料。

由於它們的卷積性質,不管輸入資料的維度是多大,CAE產生的啟用圖的數量都是相同的。因此,CAE完全忽略了二維影象本身的結構,而是作為了一個通用特徵提取器。事實上,在自編碼(AE)中,影象必須被展開成單個向量,並且網路對輸入向量的神經元個數有一定的約束。換句話說,AE迫使每個特徵是全域性的(即,跨越整個視野),所以它的引數中是存在冗餘的,而CAE不是。

編碼器

很容易理解,單個卷積濾波器不能學會提取影象的各種各樣的模式。為此,每個卷積層是由 n 個(超引數)卷積核組成的,每個卷積核的深度是 D ,其中 D 表示輸入資料的通道數。

因此,每個具有深度 D 的輸入資料

和一組 n 個卷積核

之間進行的卷積操作,從而產生一組 n 個啟用圖,或者等價的特徵圖。當然,最後產生的特徵圖的通道數還是 n ,具體如下:

為了提高網路的泛化能力,每個卷積都會被非線性函式 a 啟用,以這種方式訓練,得到的網路可以學習輸入資料的一些非線性特性:

其中,bm^(1) 表示第 m 個特徵圖的偏差,引入術語 zm 是對 AE 中保持相同的變數名稱。

所產生的啟用圖是對輸入資料 I 進行的一個重新編碼,使其可以在低維空間表示。重構好之後的資料維度並不是原來 O 的維度,但是引數的數量是從Om 中學習來的,換句話說,這些引數就是 CAE 需要學習的引數。

由於我們的目標是從所產生的特徵圖中對輸入資料 I 進行重構。因此我們需要一個解碼操作。卷積自編碼是一個完全的卷積網路,因此我們的解碼操作可以進行再次卷積。

細心的讀者可能認為卷積操作減少了輸出的空間範圍,因此不可能使用卷積來重建具有相同輸入空間範圍的資訊。

這是完全正確的,但是我們可以使用輸入填充來解決這個問題。如果我們用零向輸入資料 I 進行填充,則經過第一個卷積之後的結果具有比輸入資料 I 大的空間範圍,經過第二個卷積之後就可以產生具有和原始空間 I 相同的空間範圍了。

因此,我們想要輸入填充的零是這樣的:

從公式1可以看出,我們想要對 I 填充 2(2k+1)-2 個零(每一個邊填充 (2k+1) -1 個),以這種方式,卷積編碼將產生資料的寬度和高度等於:

解碼器

所產生的 n 個特徵圖 zm = 1, ..., n 將被用作解碼器的輸入,以便從該壓縮的資訊中重建輸入影象 I 。

事實上,解碼卷積的超引數是由編碼框架確定的:

  • 由於卷積跨越每個特徵圖,並且產生具有 (2k+1, 2k+1, n) 的維度,因此經過濾波器 F(2) 之後產生相同的空間範圍 I 。

  • 需要學習的濾波器的數量:D個,因為我需要重構具有深度 D 的輸入影象。

因此,重構的影象 I_ 是特徵圖的維度 Z = {zi = 1}^n 和該卷積濾波器 F(2) 之間的進行卷積的結果。

根據前面計算的零進行填充,那麼導致解碼卷積之後產生的維度是:

我們的目標是使得輸入的維度等於輸出的維度,然後可以用任何的損失函式來進行計算,例如 MSE:

下一篇,我們來講怎麼利用 TensorFlow 來實現CAE。


CoderPai 是一個專注於演算法實戰的平臺,從基礎的演算法到人工智慧演算法都有設計。如果你對演算法實戰感興趣,請快快關注我們吧。加入AI實戰微信群,AI實戰QQ群,ACM演算法微信群,ACM演算法QQ群。詳情請關注 “CoderPai” 微訊號(coderpai)。



相關文章