iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0

前言

昨天跟各位分享了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,這樣就可以看到重建的結果了~

https://ithelp.ithome.com.tw/upload/images/20230921/2016191313lXKCu843.png

上面是原圖,下面則是重建後的圖片,其實仔細看還是有些差異

參考網站:The Keras Blog

總結

以上就是小弟我今天分享有關於用Autoencoder實現MNIST數據集圖像重建,明天將會分享Autoencoder的應用方向,那我們明天見!


上一篇
[DAY11] Autoencoder的數學基礎
下一篇
[DAY13]Autoencoder的應用
系列文
Autoencoder與GAN:生成與重建的完美結合30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言