本笔记记录自编码器做FashionMnist数据集训练,关于autoencoder的原理,请自行百度。
import os
import time
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import datasets, layers, optimizers, Sequential, metrics, Input,losses
from PIL import Image
from matplotlib import pyplot as plt
import numpy as np
from tensorflow.keras.models import Model
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
#tf.random.set_seed(12345)
tf.__version__
#加载fashion mnist数据集
(x_train, _), (x_test, _) = datasets.fashion_mnist.load_data()
#图片像素数据范围限值到[0,1]
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
print (x_train.shape)
print (x_test.shape)
h_dim = 64
class Autoencoder(Model):
def __init__(self, h_dim):
super(Autoencoder, self).__init__()
self.h_dim = h_dim
#encoder层,[b, 28, 28] => [b, 784] => [b, h_dim]
self.encoder = tf.keras.Sequential([
layers.Flatten(),
layers.Dense(256, activation='relu'),
layers.Dense(h_dim, activation='relu'),
])
#decoder层,[b, h_dim] => [b,784] => [b, 28, 28]
self.decoder = tf.keras.Sequential([
layers.Dense(784, activation='sigmoid'),
#恢复成28x28的图片
layers.Reshape((28, 28))
])
def call(self, x):
encoded = self.encoder(x)
decoded = self.decoder(encoded)
return decoded
model = Autoencoder(h_dim)
model.compile(optimizer='adam', loss=losses.MeanSquaredError())
model.fit(x_train, x_train,
epochs=10,
shuffle=True,
validation_data=(x_test, x_test))
encoded_imgs = model.encoder(x_test).numpy()
decoded_imgs = model.decoder(encoded_imgs).numpy()
n = 10
plt.figure(figsize=(20, 4))
for i in range(n):
#绘制原始图像
ax = plt.subplot(2, n, i + 1)
plt.imshow(x_test[i])
plt.title("original")
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])
plt.title("reconstructed")
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
plt.show()
运行结果: