使用Tensorflow的深度自編碼器!

點擊上方關注,All in AI中國

使用Tensorflow的深度自編碼器!

在本教程中,我們將探索一種名為深度自編碼器的無監督學習神經網絡。

因此,自動、編碼器是用於在輸出層再現輸入的深度神經網絡,即輸出層中的神經元的數量與輸入層中的神經元的數量完全相同。可以看下下面的圖像。

使用Tensorflow的深度自編碼器!

該圖像表示典型的深度自編碼器的結構。自編碼器體系結構的目標是在輸出層創建輸入的表示,使得兩者儘可能接近(相似)。但是,自編碼器的實際使用是用於確定具有最低數據丟失量的輸入數據的壓縮版本。

我的意思是:您一定聽說過一個術語,開發機器學習項目稱為主成分分析。PCA (principal Component Analysis)即主成成分分析的概念是找到用於訓練模型的最佳和相關參數,其中數據集具有大量參數。

自編碼器以類似的方式工作,架構的編碼器部分將輸入數據分解為壓縮版本,確保重要數據不會丟失,但數據的整體大小會顯著減小。這個概念稱為降維。

這個概念的缺點是,數據壓縮是一個黑盒子,即我們無法確定其壓縮版本中的數據結構。請記住,假設我們有一個包含5個參數的數據集,可以在這些數據上訓練一個自編碼器。編碼器不會省略某些參數以獲得更好的表示,但它將參數融合在一起以創建壓縮版本但參數比較少(從5開始將參數數量減少到3)。

因此,自編碼器有兩個部分,即編碼器和解碼器。

使用Tensorflow的深度自編碼器!

編碼器壓縮輸入數據,並且解碼器反過來產生數據的未壓縮版本以儘可能準確地創建輸入的重建。

我們將使用Tensorflow的圖層API創建自編碼器神經網絡並在mnist數據集上對其進行測試。所以,讓我們開始!!

首先,我們導入相關的庫並讀入mnist數據集。如果數據集存在於本地計算機上,那麼它將很好,否則將通過運行以下命令自動下載。

使用Tensorflow的深度自編碼器!

接下來,我們為方便起見創建一些常量,並事先聲明我們的激活函數。mnist數據集中的圖像大小為28x28像素,即784像素,我們將其壓縮為196像素。您可以隨時更深入地進一步縮小像素大小。但是,壓縮太多可能會導致自動編碼器丟失信息。

使用Tensorflow的深度自編碼器!

現在,我們為每個圖層的權重和偏差創建變量。然後,我們使用先前聲明的激活函數創建圖層。

使用Tensorflow的深度自編碼器!

通常不使用tf.variance_scaling_initializer()。但是,我們在這裡使用它是因為我們正在處理不斷變化的輸入大小。因此,佔位符張量形狀(佔位符用於輸入批處理)根據輸入大小的形狀調整自身,從而阻止我們遇到任何維度錯誤。通過簡單地將先前隱藏層作為輸入饋送到激活函數(ReLu)中來創建隱藏層,其具有相關權重和偏差。

我們將使用RMSE損失函數用於此神經網絡,並將其傳遞給Adam優化器。您可以隨時使用這些來獲得有趣的結果。

使用Tensorflow的深度自編碼器!

現在,我們定義了epochs的數量和批處理大小並運行會話。我們使用mnist中的實用程序函數來獲取每個新批處理:mnist.train.next_batch()。此外,我們將在每個時期之後輸出訓練損失以監測其訓練。

使用Tensorflow的深度自編碼器!

最後,我們將編寫一個小的繪圖函數來繪製原始圖像和重建圖,以查看我們的模型的工作情況。

使用Tensorflow的深度自編碼器!

使用Tensorflow的深度自編碼器!

最終輸出

在這裡,我們可以看到重建並不是完美的,但非常接近原始圖像。注意,2的重構看起來像是3,這是由於壓縮時信息丟失造成的。

我們可以通過超參數優化來改進自動編碼器模型,並且還可以通過在GPU加速器上進行訓練來改進它。

好的,這是Tensorflow上從頭開始構建的深度(或堆疊)自編碼器模型。有關完整代碼,請單擊https://github.com/Tathagatd96/Deep-Autoencoder-using-Tensorflow。

作者:Tathagat Dasgupta

使用Tensorflow的深度自編碼器!


分享到:


相關文章: