关于人工智能:自编码器变分自编码器python案例

41次阅读

共计 4013 个字符,预计需要花费 11 分钟才能阅读完成。

@TOC

自编码器 - 案例

自编码器是一种无监督学习的神经网络模型,用于将数据进行压缩和重建。它由一个编码器和一个解码器组成,其中编码器将原始数据映射到低维空间中的编码表示,而解码器则将编码表示映射回原始数据空间。自编码器能够用于降维、去噪声、图像压缩等工作。

上面是一个简略的 Python 例子,应用自编码器对 MNIST 手写数字数据集进行压缩和重建:

import numpy as np
from keras.datasets import mnist
from keras.models import Model
from 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 plt

n = 10
plt.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 np
from keras.datasets import mnist
from keras.models import Model
from keras.layers import Input, Dense, Lambda
from keras.losses import binary_crossentropy
from 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 多平台公布

正文完
 0