前言
先來看看實驗:
我們使用 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)扎酷、生成真實的圖像(生成模型)、使用非常小的標(biāo)記集對圖像進(jìn)行分類或執(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)練的自動編碼器可以用作生成模型(我們稍后會深入探討)独令。
具體地, 我們將從以下幾部分來介紹:
- 自動編碼器重建 MNIST 手寫數(shù)字
- 對抗性自動編碼器重建 MNIST 手寫數(shù)字
- 半監(jiān)督自動編碼器重建 MNIST 手寫數(shù)字
- 使用自動編碼器對 MNIST 進(jìn)行分類
本系列會仔細(xì)的講解自動編碼器(AutoEncoder, AE)好芭,對抗性自動編碼器(Adversarial AutoEncoder, AAE)的的原理和實戰(zhàn)燃箭。學(xué)會了基礎(chǔ),可以嘗試看看有沒有新穎的研究課題可以做舍败。
自動編碼器介紹
自動編碼器(以下簡稱AE)不一定大家都有了解招狸,但是敬拓,提到 Unet,大家都熟悉吧。把 Unet中間的跳躍連接拿掉裙戏,它就是一個自動編碼器乘凸。
只不過Unet是拿來做分割,輸出的是分割結(jié)果累榜。自動編碼器是拿來做重建翰意,希望輸出=輸入。因此信柿,二者用的loss上會有區(qū)別冀偶。
來看一下相對正式的定義:
Autoencoder 是一種神經(jīng)網(wǎng)絡(luò),經(jīng)過訓(xùn)練可以產(chǎn)生與輸入非常相似的輸出(因此它基本上嘗試將其輸入復(fù)制到其輸出)渔嚷,并且由于它不需要任何標(biāo)簽进鸠,因此可以對其進(jìn)行無監(jiān)督訓(xùn)練。
它包含兩個部分: Encoder形病, Decoder
- 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银亲,...)文件。編碼器就是干這個事唐瀑,不斷地壓縮輸入群凶。
- 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ù)字
我們設(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) 中像素之間的距離。我們稱之為重建損失膳灶,因為我們的主要目標(biāo)是在輸出端重建輸入咱士。
重建結(jié)果
原始圖像
恢復(fù)結(jié)果
看起來,還是能把數(shù)字重建的差不多袖瞻,雖然模糊了些司致。有3個重建錯誤拆吆。
我們把 Encoder 的輸出給 Decoder聋迎,基本能恢復(fù)出數(shù)字的樣子來。
但枣耀,我們隨機產(chǎn)生兩個數(shù)字霉晕,傳給 Decoder 會怎么樣呢?試試看
我們把(0捞奕,0)數(shù)字作為 Decoder 的輸入牺堰,會輸出什么呢?
感覺像數(shù)字颅围,又不像數(shù)字伟葫!
為什么我們不能從在隨機數(shù)中采樣,恢復(fù)出圖像呢院促?
這是因為我們得到的 latent space 并沒有覆蓋整個二維空間筏养,如果我們隨機輸入的 z 不是在 latent space 中采樣的斧抱,那自然也恢復(fù)不出來。那我們怎么知道 latent space 到底是一個什么分布呢渐溶,如何從 latent space 中采樣呢辉浦?
這可以通過在生成 latent space 時將 Encoder 的輸出限制為具有某種隨機分布(例如平均值為 0.0 且標(biāo)準(zhǔn)差為 2.0 的正態(tài)分布), 這樣我們在這個正態(tài)分布中采樣2個點,就可以很好地恢復(fù)圖像茎辐。這正是對抗性自動編碼器的能力宪郊,我們將在第 2 部分研究它的實現(xiàn)。
這部分實驗代碼
- 文中內(nèi)容參考
- 原作者 Tensorflow 代碼
- Tina 姐的代碼 GitHub上提供了詳細(xì)的代碼說明拖陆。
- 我的 pytorch 代碼訓(xùn)練結(jié)果
loss
輸入圖像
重建結(jié)果
文章持續(xù)更新弛槐,可以關(guān)注微信公眾號【醫(yī)學(xué)圖像人工智能實戰(zhàn)營】獲取最新動態(tài),一個關(guān)注于醫(yī)學(xué)圖像處理領(lǐng)域前沿科技的公眾號依啰。堅持已實踐為主丐黄,手把手帶你做項目,打比賽孔飒,寫論文灌闺。凡原創(chuàng)文章皆提供理論講解,實驗代碼坏瞄,實驗數(shù)據(jù)桂对。只有實踐才能成長的更快,關(guān)注我們鸠匀,一起學(xué)習(xí)進(jìn)步~