對抗性自動編碼器系列--自動編碼器AutoEncoder的原理及實現(xiàn)-手寫數(shù)字的重建

前言

先來看看實驗:

我們使用 MNIST 手寫數(shù)字,測試通過自動編碼器和對抗性自動編碼器學(xué)習(xí)重建恢復(fù)效果。

  • 原始圖像:


    image
  • 自動編碼器重建效果


    image
  • 對抗性自動編碼器重建效果


    image

雖然這里看到,自動編碼器和對抗性自動編碼器重建出來的能力差不多,但是他們之間的差別在哪里,之后通過更多的實驗告訴大家。

大多數(shù)人類和動物學(xué)習(xí)都是無監(jiān)督學(xué)習(xí)。如果把人工智能比作一個蛋糕,那么無監(jiān)督學(xué)習(xí)就是蛋糕,監(jiān)督學(xué)習(xí)就是蛋糕上的糖衣(錦上添花),強化學(xué)習(xí)就是蛋糕上的櫻桃??(錦上添花)。

我們知道如何制作糖衣和櫻桃,但我們不知道如何制作蛋糕。

同樣,我們需要先解決無監(jiān)督學(xué)習(xí)問題,然后才能考慮實現(xiàn)真正的人工智能。

我們知道可以使用卷積神經(jīng)網(wǎng)絡(luò) (CNN) 或在某些情況下密集全連接層 (MLP — 有人喜歡稱之為多層感知器) 來執(zhí)行圖像識別。

但是,單獨的 CNN(或 MLP)不能用于執(zhí)行諸如從圖像中分離內(nèi)容和風(fēng)格(content and style)、生成真實的圖像(生成模型)、使用非常小的標記集對圖像進行分類或執(zhí)行數(shù)據(jù)壓縮等任務(wù)。

這些任務(wù)中的每一個都可能需要特別的架構(gòu)和訓(xùn)練算法。但是,如果我們能夠僅使用一種架構(gòu)來實現(xiàn)上述所有任務(wù),那不是很酷嗎?對抗性自動編碼器(一種以半監(jiān)督方式訓(xùn)練的)可以僅使用一種架構(gòu)來執(zhí)行所有這些任務(wù)甚至更多。

我們學(xué)習(xí)自動編碼器有什么用?
重建圖像本身自然是沒有任何意義的,但是能把圖像重建出來,說明模型學(xué)到了輸入圖像集的分布和特征。

  • 提取圖像特征,特征我們可以拿來做影像組學(xué)。
  • 異常檢測,圖像的分布可以拿來做異常檢測。
  • 圖像去噪,其中可以使用有噪聲的圖像生成清晰的無噪聲圖像。


    image
  • 語義散列可以使用降維來加快信息檢索速度。
  • 最近,以對抗方式訓(xùn)練的自動編碼器可以用作生成模型(我們稍后會深入探討)。

具體地, 我們將從以下幾部分來介紹:

  1. 自動編碼器重建 MNIST 手寫數(shù)字
  2. 對抗性自動編碼器重建 MNIST 手寫數(shù)字
  3. 半監(jiān)督自動編碼器重建 MNIST 手寫數(shù)字
  4. 使用自動編碼器對 MNIST 進行分類

本系列會仔細的講解自動編碼器(AutoEncoder, AE),對抗性自動編碼器(Adversarial AutoEncoder, AAE)的的原理和實戰(zhàn)。學(xué)會了基礎(chǔ),可以嘗試看看有沒有新穎的研究課題可以做。

自動編碼器介紹

image

自動編碼器(以下簡稱AE)不一定大家都有了解,但是,提到 Unet,大家都熟悉吧。把 Unet中間的跳躍連接拿掉,它就是一個自動編碼器。

只不過Unet是拿來做分割,輸出的是分割結(jié)果。自動編碼器是拿來做重建,希望輸出=輸入。因此,二者用的loss上會有區(qū)別。

來看一下相對正式的定義:

Autoencoder 是一種神經(jīng)網(wǎng)絡(luò),經(jīng)過訓(xùn)練可以產(chǎn)生與輸入非常相似的輸出(因此它基本上嘗試將其輸入復(fù)制到其輸出),并且由于它不需要任何標簽,因此可以對其進行無監(jiān)督訓(xùn)練。

它包含兩個部分: Encoder, Decoder

  1. Encoder(編碼器):它接受輸入 x(可以是圖像、詞嵌入、視頻或音頻數(shù)據(jù))并產(chǎn)生輸出 h(其中 h 通常比
    x 具有更低的維度)。

例如,編碼器輸入為: 100 x 100 的圖像 x ,輸出 100 x 1(可以是任何大?。┑妮敵?h。在這種情況下,編碼器只是壓縮圖像,使其占據(jù)較低維度的空間,在這樣做時,我們現(xiàn)在可以看到,與直接存儲圖像 x 相比,可以使用 1/100 的內(nèi)存來存儲 h(大小為 100 x 1) (雖然這會導(dǎo)致一些數(shù)據(jù)丟失)。

這里的 h 通常說的是 latent space(潛在空間,模型圖上一般用 z 表示)。(這個概念很重要,會經(jīng)常提到)

一個更形象的解釋:
讓我們想想像 WinRAR 這樣的壓縮軟件,它可用于壓縮文件以獲得占用較少空間的zip(或 rar,...)文件。編碼器就是干這個事,不斷地壓縮輸入。

  1. Decoder(解碼器):它將 Encoder h 的輸出作為輸入,并嘗試恢復(fù) Encoder 的輸入。

例如: h 現(xiàn)在的大小為 100 x 1,解碼器嘗試使用 h 恢復(fù)原始的 100 x 100 圖像。我們將訓(xùn)練 Decoder 從 h 中獲取盡可能多的信息以重構(gòu) x。

因此,Decoder 的操作類似于在 WinRAR 上執(zhí)行解壓縮。

一句話總結(jié):Encoder做降維,Decoder用來恢復(fù)。

接下來,我們使用 AE 來重建手寫數(shù)字。

自動編碼器重建手寫數(shù)字

image

image

我們設(shè)計一個具有3個全連接層的 Encoder 和 Decoder。Encoder的輸入是手寫數(shù)字,圖像尺寸為28*28,把它 reshape 成 784 個神經(jīng)元的輸入層。這里我們將latent space(z) 設(shè)置為2.

相當(dāng)于我們把一個28*28大小的圖像,壓縮到2個像素點,Decoder通過這個兩個點恢復(fù)出輸入圖像的信息。咋一看,實在有些不敢相信,2個點就能表征一個圖像,我們試試看~~~~

關(guān)于損失函數(shù)

使用的損失函數(shù)是均方誤差 (MSE),它計算輸入 (x_input) 和輸出圖像 (decoder_output) 中像素之間的距離。我們稱之為重建損失,因為我們的主要目標是在輸出端重建輸入。

loss = \frac{1}{n}\sum_{i=0}^{n}(x-x^{hat})^2

重建結(jié)果

原始圖像


image

恢復(fù)結(jié)果


image

看起來,還是能把數(shù)字重建的差不多,雖然模糊了些。有3個重建錯誤。

我們把 Encoder 的輸出給 Decoder,基本能恢復(fù)出數(shù)字的樣子來。

但,我們隨機產(chǎn)生兩個數(shù)字,傳給 Decoder 會怎么樣呢?試試看

我們把(0,0)數(shù)字作為 Decoder 的輸入,會輸出什么呢?


image

感覺像數(shù)字,又不像數(shù)字!

為什么我們不能從在隨機數(shù)中采樣,恢復(fù)出圖像呢?
這是因為我們得到的 latent space 并沒有覆蓋整個二維空間,如果我們隨機輸入的 z 不是在 latent space 中采樣的,那自然也恢復(fù)不出來。那我們怎么知道 latent space 到底是一個什么分布呢,如何從 latent space 中采樣呢?

這可以通過在生成 latent space 時將 Encoder 的輸出限制為具有某種隨機分布(例如平均值為 0.0 且標準差為 2.0 的正態(tài)分布), 這樣我們在這個正態(tài)分布中采樣2個點,就可以很好地恢復(fù)圖像。這正是對抗性自動編碼器的能力,我們將在第 2 部分研究它的實現(xiàn)。

這部分實驗代碼

loss


image

輸入圖像


image

重建結(jié)果
image

文章持續(xù)更新,可以關(guān)注微信公眾號【醫(yī)學(xué)圖像人工智能實戰(zhàn)營】獲取最新動態(tài),一個關(guān)注于醫(yī)學(xué)圖像處理領(lǐng)域前沿科技的公眾號。堅持已實踐為主,手把手帶你做項目,打比賽,寫論文。凡原創(chuàng)文章皆提供理論講解,實驗代碼,實驗數(shù)據(jù)。只有實踐才能成長的更快,關(guān)注我們,一起學(xué)習(xí)進步~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容