昨天跟各位分享了Autoencoder的相關數學,而今天將會分享如何用Autoencoder實現MNIST數據集圖像重建,那我們廢話不多說,正文開始!
MNIST是Tensorflow內建的手寫數字數據集,因此不需要從網路上下載!
先載入所需的套件
import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
from tensorflow.keras.datasets import mnist
import matplotlib.pyplot as plt
然後我們需要載入MNIST數據集,然後再進行前處理
(x_train, _), (x_test, _) = mnist.load_data()
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))
x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))
MNIST數據集的圖片為黑白圖,因此顏色深度為0到255,
我們將測試集和訓練集的數據轉為浮點數,並且將像素值縮到0到1的範圍內,然後將兩個數據集從28*28重塑成784
接下來我們要設定模型的基本參數
encoding_dim = 128
inputt = tf.keras.Input(shape=(784,))
這裡我們設定一個維度是128的潛在空間,然後創建一個輸入層,輸入形狀為784—也就是我們數據集的形狀
接下來就是構件模型了~
encoded = tf.keras.layers.Dense(encoding_dim, activation='relu')(inputt)
decoded = tf.keras.layers.Dense(784, activation='sigmoid')(encoded)
autoencoder = tf.keras.Model(inputt, decoded)
encoder = tf.keras.Model(inputt, encoded)
encoded_input = tf.keras.Input(shape=(encoding_dim,))
decoder_layer = autoencoder.layers[-1]
decoder = tf.keras.Model(encoded_input, decoder_layer(encoded_input))
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
我們先建立了一個全連接層(Dense layer),該層將輸入圖像壓縮到128的維度,並且使用了ReLU激活函數。然後再建立了另一個密集層,該層將壓縮後的資料解碼回原始圖像的大小(784個像素)。激活函數為sigmoid。接下來我們創建一個單獨是編碼器以及解碼器的模型就可以了!
最後的部分是編譯的動作,我們使用Adam 優化器且損失為二元交叉熵
接下是訓練模型以及預測
autoencoder.fit(x_train, x_train,epochs=50,batch_size=256,shuffle=True,validation_data=(x_test, x_test))
encoded_imgs = encoder.predict(x_test)
decoded_imgs = decoder.predict(encoded_imgs)
這樣就訓練的部分就完結了!接下來我們來將重建的圖片以及原圖做比對
n = 2
plt.figure(figsize=(4, 4))
for i in range(n):
ax = plt.subplot(2, n, i + 1)
plt.imshow(x_test[i].reshape(28, 28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
ax = plt.subplot(2, n, i + 1 + n)
plt.imshow(decoded_imgs[i].reshape(28, 28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
plt.show()
在這邊我重建兩張圖片,並且讓他們形狀從784轉變為原本的28*28,這樣就可以看到重建的結果了~
上面是原圖,下面則是重建後的圖片,其實仔細看還是有些差異
參考網站:The Keras Blog
以上就是小弟我今天分享有關於用Autoencoder實現MNIST數據集圖像重建,明天將會分享Autoencoder的應用方向,那我們明天見!