自编码器-变分自编码器-python案例

自编码器-案例

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

下面是一个简单的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散度损失项,因此在训练过程中需要仔细调整损失函数的权重或其他参数,以获得最佳效果。

生成新样本时,需要先从高斯分布中采样一个潜在变量,再通过解码器将其映射回数据空间中进行图像生成,但生成的结果有时会存在一些不连续的情况,需要注意调整采样和解码器的参数。

小结

总体来说,自编码器和变分自编码器是非常有用的深度学习模型,在图像处理、语音分析等领域都有广泛应用。在实际应用中,需要根据具体问题和数据进行合理设计和调整,才能取得最佳效果。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高山莫衣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值