@TOC
自编码器-案例
自编码器是一种无监督学习的神经网络模型,用于将数据进行压缩和重建。它由一个编码器和一个解码器组成,其中编码器将原始数据映射到低维空间中的编码表示,而解码器则将编码表示映射回原始数据空间。自编码器能够用于降维、去噪声、图像压缩等工作。
上面是一个简略的Python例子,应用自编码器对MNIST手写数字数据集进行压缩和重建:
import numpy as npfrom keras.datasets import mnistfrom keras.models import Modelfrom keras.layers import Input, Dense# 加载数据集(x_train, _), (x_test, _) = mnist.load_data()# 数据预处理x_train = x_train.astype('float32') / 255.x_test = x_test.astype('float32') / 255.x_train = np.reshape(x_train, (len(x_train), np.prod(x_train.shape[1:])))x_test = np.reshape(x_test, (len(x_test), np.prod(x_test.shape[1:])))# 定义编码器input_img = Input(shape=(784,))encoded = Dense(32, activation='relu')(input_img)# 定义解码器decoded = Dense(784, activation='sigmoid')(encoded)# 定义整个自编码器模型autoencoder = Model(input_img, decoded)# 编译自编码器模型autoencoder.compile(optimizer='adam', loss='binary_crossentropy')# 训练自编码器模型autoencoder.fit(x_train, x_train, epochs=50, batch_size=256, shuffle=True, validation_data=(x_test, x_test))# 对测试集进行重建decoded_imgs = autoencoder.predict(x_test)# 显示重建后果import matplotlib.pyplot as pltn = 10plt.figure(figsize=(20, 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()
变分自编码器-案例
变分自编码器是一种基于概率的自编码器,它应用潜在空间中的高斯分布来实现更加精密的压缩和解压缩。与一般的自编码器不同,它不仅学习如何对数据进行编码和解码,还会学习如何生成新的样本。
上面是一个简略的Python例子,应用变分自编码器对MNIST手写数字数据集进行压缩和重建:
import numpy as npfrom keras.datasets import mnistfrom keras.models import Modelfrom keras.layers import Input, Dense, Lambdafrom keras.losses import binary_crossentropyfrom keras.utils import plot_model# 加载数据集(x_train, _), (x_test, _) = mnist.load_data()# 数据预处理x_train = x_train.astype('float32') / 255.x_test = x_test.astype('float32') / 255.x_train = np.reshape(x_train, (len(x_train), np.prod(x_train.shape[1:])))x_test = np.reshape(x_test, (len(x_test), np.prod(x_test.shape[1:])))# 定义编码器input_img = Input(shape=(784,))hidden = Dense(256, activation='relu')(input_img)# 计算潜在变量的均值和方差z_mean = Dense(2)(hidden)z_log_var = Dense(2)(hidden)# 采样函数def sampling(args): z_mean, z_log_var = args epsilon = K.random_normal(shape=K.shape(z_mean)) return z_mean + K.exp(0.5 * z_logvar) * epsilon
定义潜在空间采样层
z = Lambda(sampling)([z_mean, z_log_var])
定义解码器
decoder_hidden = Dense(256, activation='relu') decoder_out = Dense(784, activation='sigmoid')
解码器的输出是采样后的潜在变量
decoded_hidden = decoder_hidden(z) decoded_out = decoder_out(decoded_hidden)
定义整个变分自编码器模型
vae = Model(input_img, decoded_out)
定义VAE的损失函数
def vae_loss(x, decoded): xent_loss = binary_crossentropy(x, decoded) kl_loss = -0.5 * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1) return xent_loss + kl_loss
编译VAE模型
vae.compile(optimizer='adam', loss=vae_loss)
训练VAE模型
vae.fit(x_train, x_train, epochs=50, batch_size=128, shuffle=True, validation_data=(x_test, x_test))
对测试集进行重建和生成新的样本
decoded_imgs = vae.predict(x_test) n = 10 plt.figure(figsize=(20, 4)) for i in range(n): # 原始图像 ax = plt.subplot(3, 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(3, 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)# 生成的图像z_sample = np.array([[np.random.normal(), np.random.normal()]])generated_img = decoder_out(decoder_hidden(z_sample)).numpy()ax = plt.subplot(3, n, i + 1 + 2*n)plt.imshow(generated_img.reshape(28, 28))plt.gray()ax.get_xaxis().set_visible(False)ax.get_yaxis().set_visible(False)plt.show()
自编码器和变分自编码器是深度学习中利用宽泛的无监督学习模型。自编码器通过将数据压缩成低维示意并重建原始数据来实现降维和去噪声等工作,而变分自编码器则应用潜在空间中的高斯分布进行更加精密的压缩和解压缩,并能够生成新的样本。
自编码器要点
对于自编码器,须要留神以下几点:
编码器和解码器的层数、节点数和激活函数等参数都须要依据具体问题进行调整,以获得最佳的压缩和重建成果。
自编码器通常会有过拟合问题,须要应用正则化办法或其余技术进行优化。
自编码器只能解决与训练数据类似的数据,如果测试数据与训练数据差别较大,可能会导致较差的压缩和重建成果。
变分自编码器要点
对于变分自编码器,须要特地留神以下几点:
变分自编码器相比于自编码器,设计和训练过程更加简单,须要了解高斯分布采样函数的作用和意义。
因为变分自编码器蕴含了KL散度损失项,因而在训练过程中须要认真调整损失函数的权重或其余参数,以获得最佳成果。
生成新样本时,须要先从高斯分布中采样一个潜在变量,再通过解码器将其映射回数据空间中进行图像生成,但生成的后果有时会存在一些不间断的状况,须要留神调整采样和解码器的参数。
小结
总体来说,自编码器和变分自编码器是十分有用的深度学习模型,在图像处理、语音剖析等畛域都有广泛应用。在理论利用中,须要依据具体问题和数据进行正当设计和调整,能力获得最佳成果。
本文由mdnice多平台公布