Keras上實現AutoEncoder自編碼器

marsjhao發表於2020-04-06

一、自編碼器簡介

無監督特徵學習(Unsupervised Feature Learning)是一種仿人腦的對特徵逐層抽象提取的過程,學習過程中有兩點:一是無監督學習,即對訓練資料不需要進行標籤化標註,這種學習是對資料內容的組織形式的學習,提取的是頻繁出現的特徵;二是逐層抽象,特徵是需要不斷抽象的。

自編碼器(AutoEncoder),即可以使用自身的高階特徵自我編碼,自編碼器其實也是一種神經網路,其輸入和輸出是一致的,藉助了稀疏編碼的思想,目標是使用稀疏的高階特徵重新組合來重構自己。


二、完整程式碼

import numpy as np
np.random.seed(1337)  # for reproducibility

from keras.datasets import mnist
from keras.models import Model #泛型模型
from keras.layers import Dense, Input
import matplotlib.pyplot as plt

# X shape (60,000 28x28), y shape (10,000, )
(x_train, _), (x_test, y_test) = mnist.load_data()

# 資料預處理
x_train = x_train.astype('float32') / 255. - 0.5       # minmax_normalized
x_test = x_test.astype('float32') / 255. - 0.5         # minmax_normalized
x_train = x_train.reshape((x_train.shape[0], -1))
x_test = x_test.reshape((x_test.shape[0], -1))
print(x_train.shape)
print(x_test.shape)

# 壓縮特徵維度至2維
encoding_dim = 2

# this is our input placeholder
input_img = Input(shape=(784,))

# 編碼層
encoded = Dense(128, activation='relu')(input_img)
encoded = Dense(64, activation='relu')(encoded)
encoded = Dense(10, activation='relu')(encoded)
encoder_output = Dense(encoding_dim)(encoded)

# 解碼層
decoded = Dense(10, activation='relu')(encoder_output)
decoded = Dense(64, activation='relu')(decoded)
decoded = Dense(128, activation='relu')(decoded)
decoded = Dense(784, activation='tanh')(decoded)

# 構建自編碼模型
autoencoder = Model(inputs=input_img, outputs=decoded)

# 構建編碼模型
encoder = Model(inputs=input_img, outputs=encoder_output)

# compile autoencoder
autoencoder.compile(optimizer='adam', loss='mse')

# training
autoencoder.fit(x_train, x_train, epochs=20, batch_size=256, shuffle=True)

# plotting
encoded_imgs = encoder.predict(x_test)
plt.scatter(encoded_imgs[:, 0], encoded_imgs[:, 1], c=y_test, s=3)
plt.colorbar()
plt.show()

三、程式解讀

自編碼,簡單來說就是把輸入資料進行一個壓縮和解壓縮的過程。原來有很多特徵,壓縮成幾個來代表原來的資料,解壓之後恢復成原來的維度,再和原資料進行比較。它是一種非監督演算法,只需要輸入資料,解壓縮之後的結果與原資料本身進行比較。程式的主要功能是把 datasets.mnist 資料的 28*28=784 維的資料,壓縮成 2 維的資料,然後在一個二維空間中視覺化出分類的效果。

首先,匯入資料並進行資料預處理,本例使用Model模組的Keras的泛化模型來進行模型搭建,便於我們從模型中間匯出資料並進行視覺化。進行模型搭建的時候,注意要進行逐層特徵提取,最終壓縮至2維,解碼的過程要跟編碼過程一致相反。隨後對Autoencoder和encoder分別建模,編譯、訓練。將編碼模型的預測結果通過Matplotlib視覺化出來,就可以看到原資料的二維編碼結果在二維平面上的聚類效果,還是很明顯的。


最後看到視覺化的結果,自編碼模型可以把這幾個數字給區分開來,我們可以用自編碼這個過程來作為一個特徵壓縮的方法,和PCA的功能一樣,效果要比它好一些,因為它是非線性的結構。



相關文章