📜  ML |具有TensorFlow 2.0的自动编码器(1)

📅  最后修改于: 2023-12-03 15:17:40.013000             🧑  作者: Mango

ML | 具有TensorFlow 2.0的自动编码器

自动编码器是一种无监督学习算法,可以用于特征提取和降维。它由一个编码器和一个解码器组成,编码器将输入数据转换为潜在空间表示,解码器将这个潜在空间表示转换为重构数据,从而使得重构数据尽可能地接近原始数据。

TensorFlow 2.0是一种强大的机器学习框架,支持自动编码器的实现。本文将介绍如何使用TensorFlow 2.0实现一个基本的自动编码器,并训练它对MNIST数据集进行特征提取和降维。

准备工作

首先导入必要的Python库和MNIST数据集:

import tensorflow as tf
import matplotlib.pyplot as plt

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train = x_train.reshape(x_train.shape[0], 784).astype('float32') / 255.0
x_test = x_test.reshape(x_test.shape[0], 784).astype('float32') / 255.0

这里将MNIST数据集中的图像reshape为一维向量,并将其归一化到0-1的范围内。

接下来,定义编码器和解码器网络的结构:

encoding_dim = 32

encoder = tf.keras.Sequential([
    tf.keras.layers.Dense(256, activation='relu'),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(encoding_dim, activation='relu')
])

decoder = tf.keras.Sequential([
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(256, activation='relu'),
    tf.keras.layers.Dense(784, activation='sigmoid')
])

这里使用了一个3层的全连接神经网络作为编码器,其中潜在空间的维度为32。解码器也是一个3层的全连接神经网络,其输出维度和输入数据的维度相同。

定义自动编码器模型

使用Functional API来定义完整的自动编码器模型:

inputs = tf.keras.Input(shape=(784,))
code = encoder(inputs)
outputs = decoder(code)

autoencoder = tf.keras.Model(inputs=inputs, outputs=outputs)

这里的encoderdecoder都可以通过调用autoencoder.get_layer()方法获取。

训练自动编码器模型

现在,定义自动编码器模型的损失函数和优化器,并进行模型的训练:

autoencoder.compile(loss='binary_crossentropy', optimizer='adam')
autoencoder.fit(x_train, x_train,
                epochs=50,
                batch_size=256,
                shuffle=True,
                validation_data=(x_test, x_test))

这里使用了binary_crossentropy作为损失函数,adam作为优化器。训练50个epoch,并使用256批次的数据进行训练。

评估自动编码器模型

最后,评估自动编码器模型在测试集上的重构精度,并使用编码器来提取特征向量:

decoded_imgs = autoencoder.predict(x_test)
encoded_imgs = encoder.predict(x_test)

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()

plt.figure(figsize=(6, 6))
plt.scatter(encoded_imgs[:, 0], encoded_imgs[:, 1], c=y_test)
plt.colorbar()
plt.show()

这里将重构的图像和原始图像进行可视化对比,并且使用编码器将测试集中的图像转换为二维向量,并使用散点图进行可视化,其中颜色表示不同的数字类别。

至此,一个简单的基于TensorFlow 2.0的自动编码器模型已经建立起来,可以用于特征提取和降维。