介绍
- 自编码器(autoencoder, AE)是一类在半监督学习和非监督学习中使用的人工神经网络(准确地来说自编码器是一个自监督的算法,并不是一个无监督算法),其核心的作用是能够学习到输入数据的深层表示。自编码器包含编码器(encoder)和解码器(decoder)两部分。
- 自编码器的相关模型:收缩自编码器(undercomplete autoencoder)、正则自编码器(regularized autoencoder)和变分自编码器(Variational AutoEncoder, VAE),其中前两者是判别模型、后者是生成模型。降噪自编码器(Denoising Autoencoders,DAE)、栈式自编码器(Stacked Autoencoders,SAE)、 稀疏编码器
- 应用:
- 数据去噪:对训练数据增加噪声并训练自编码器使其能恢复原有。这些限制条件防止自编码器机械地将输入复制到输出,并强制它学习数据的高效表示。可以参考论文栈式去燥自编码器
- 非线性降维:自编码的降维操作是一个有损的操作,解压缩的输出与原来的输入相比是退化的。此外用于降维主要技术还有:PCA、t-SNE等。
- 生成数据:自编码器还可以随机生成与训练数据类似的数据,这被称作生成模型(generative model)。比如,可以用人脸图片训练一个自编码器,它可以生成新的图片。
实验
- 使用keras构建一个自编码器(仅使用全连接层),使用MNIST数据集测试。查看编码和解码过程,以及数据可视化。
- 代码
import numpy as np
from keras.datasets import mnist
from keras.models import Model
from keras.layers import Dense, Input
import matplotlib.pyplot as plt
# 加载数据集 x_train(6000, 28, 28), y_train(60000, )
(x_train, y_train),(x_test, y_test) = mnist.load_data()
print(x_train.shape, y_train.shape, x_test.shape, y_test.shape)
# 转浮点 + 归一化
x_train = x_train.astype('float32')/255.0
x_test = x_test.astype('float32')/255.
# reshape数据形状,适用于Dense层的input
x_train = x_train.reshape(x_train.shape[0], 784)
x_test = x_test.reshape(-1, 784)
输出:
# 定义模型参数
encoding_dim = 2 # encode的最终维度, 2维目的是方便可视化
# 定义输入层
input_img = Input(shape=(784, ))
# 定义编码层
encoded = Dense(units=128, activation='relu')(input_img)
encoded = Dense(units=64, activation='relu')(encoded)
encoded = Dense(units=32, activation='relu')(encoded)
encoded_out = Dense(units=encoding_dim)(encoded)
# 定义解码层
decoded = Dense(units=32, activation='relu')(encoded_out)
decoded = Dense(units=64, activation='relu')(decoded)
decoded = Dense(units=128, activation='relu')(decoded)
decoded_out = Dense(units=784, activation='relu')(decoded)
# 构建自动编码器
autoencoder = Model(inputs = input_img, outputs=decoded_out) # 注意是inputs而不是input、
# 构建编码器
encoder = Model(inputs=input_img, outputs=encoded_out)
# 输出模型信息
print(autoencoder.summary())
输出:
# 编译模型
autoencoder.compile(optimizer='adam', loss='mse') # 优化器和损失函数
# 训练
autoencoder.fit(
x = x_train,
y = x_train, # 将原图与解码后的图作对比计算损失值
epochs = 10,
batch_size = 512,
shuffle = True # 每个训练epoch后,数据会打乱
)
# 打印结果
encoded_imgs = encoder.predict(x_test)
print(encoded_imgs.shape