基于MNIST數(shù)據(jù)集上在Pytorch中去噪自動編碼器的應(yīng)用
使用Pytorch構(gòu)建深度學(xué)習模型系列有多少人跟著學(xué)姐跟下來的?今天的這篇Denoising Autoencoder已經(jīng)是倒數(shù)第二篇了,前面沒有看的同學(xué)趕緊補習一下功課。

系列往期傳送門:
寫干貨的時候?qū)W姐的廢話是最少的,所以你們也一定要像我一樣認真!

01??去噪自編碼器(Denoising Autoencoder)
名詞解釋:降噪自編碼器是自編碼器的擴展。
就像一個標準的自動編碼器一樣,它由一個編碼器組成,將數(shù)據(jù)壓縮為潛在代碼,提取最相關(guān)的特征,以及一個解碼器,對數(shù)據(jù)進行解壓縮并重建原始輸入。
不同的一點就是:去噪自動編碼器將噪聲圖像作為輸入,輸出層的目標是沒有噪聲的原始輸入。
這樣的編碼器很有用:
第一,它降低了過度擬合的風險并防止自動編碼器學(xué)習簡單的恒等函數(shù)。
第二, 自編碼器的編碼空間包含更強大的信息,可以重建圖像。換言之就是,添加到輸入中的噪聲充當正則化器。?
在本教程案例中,被認為破壞圖像的技術(shù)被稱為高斯噪聲。
02 用Pytorch實現(xiàn)步驟
去噪自動編碼器應(yīng)用于MNIST數(shù)據(jù)集,本系列之前的大部分文章都是這樣。
導(dǎo)入庫和數(shù)據(jù)集
現(xiàn)在定義編碼器和解碼器類,它們各自包含3個卷積層和2個全連接層。
之后初始化編碼器和解碼器對象、損失、優(yōu)化器和設(shè)備,用于在深度學(xué)習模型中使用CUDA。
最終展示最基本的部分,將噪聲圖像傳遞給模型。在訓(xùn)練之前,定義了一個函數(shù)來將噪聲添加到圖像中。
轉(zhuǎn)換圖像有兩個步驟:
torch.randn_like?來創(chuàng)建一個與輸入量大小相同的噪聲張量。
torch.clip(min=0.,max=1.)?將范圍限制在 0 和 1 之間。
定義兩個不同的函數(shù)來訓(xùn)練和評估模型:
如果還想看看去噪自編碼器是如何學(xué)習在每個epoch中重建圖像的。通過可視化原始輸入、噪聲輸入和重建圖像,是可以實現(xiàn)的。
現(xiàn)在就使用之前定義的函數(shù)訓(xùn)練和評估自動編碼器:


在30個epoch之后,去噪自編碼器似乎重建了與輸入中觀察到的圖像相似的圖像。
不過仍然存在一些缺陷,但相對于第一個 epoch 來說仍然是一個改進,在第一個epoch中,自編碼器仍然沒有捕獲最相關(guān)的信息來構(gòu)建重建。
另一種評估去噪自編碼器性能的方法是通過潛在代碼生成新圖像:

有些重構(gòu)有意義,比如對應(yīng)于0、5、6的那些,其他的就沒有意義了,比如位置(-1,-1)的重構(gòu)。可能是因為潛在空間是不規(guī)則的,這意味著潛在代碼中的接近點可以在可見單元上產(chǎn)生非常不同且毫無意義的模式。
下面我們將去噪自動編碼器學(xué)習到的潛在代碼可視化,通過十位數(shù)的類別進行著色:
我們可以使用plotly.express庫獲得編碼空間的著色后的可視化效果:

應(yīng)用t-SNE可以獲得更好的表示,這是一種將高維輸入轉(zhuǎn)換為二維或三維數(shù)據(jù)的降維方法。在這種情況下,將分量數(shù)固定為2,接下來只需要做一個二維圖:

這樣我們可以為每個數(shù)字可視化不同的集群,除了一些屬于錯誤類別的點。
03?總結(jié)
看完這篇想必大家已經(jīng)學(xué)會了使用卷積層實現(xiàn)去噪自動編碼器。你掌握了標準的自動編碼器時,應(yīng)用它時候就非常容易。還有許多其他版本的自動編碼器可以嘗試,例如變分自動編碼器和生成加法網(wǎng)絡(luò)。后面學(xué)姐都會慢慢講到!所以一定要關(guān)注學(xué)姐哦!

有什么錯誤評論區(qū)指出我們交流一下
代碼:
https://github.com/eugeniaring/Pytorch-tutorial/blob/main/denAE.ipynb
參考文檔:
https://ai.plainenglish.io/denoising-autoencoder-in-pytorch-on-mnist-dataset-a76b8824e57e
每天18:30分更新
關(guān)注+星標+在看
不迷路看好文