毫升|使用 TensorFlow 2.0 的自动编码器

原文:https://www . geesforgeks . org/ml-auto encoder-with-tensorflow-2-0/

本教程通过训练自动编码器,演示了如何在 TensorFlow 2.0 中使用图形模式执行生成手写数字图像。 自动编码器是用神经网络和/或卷积神经网络实现的数据压缩和解压缩算法。数据被压缩到比初始输入更低维度的瓶颈。解压缩使用中间表示再次生成相同的输入图像。让我们使用 TensorFlow 2.0 编写一个好的自动编码器,默认情况下,TensorFlow 2.0 渴望理解该算法的机制。自动编码器被认为是更高级的创成式模型(如 GANs 和 CVAEs)的良好先决条件。 首先,根据可用硬件下载 TensorFlow 2.0。如果你正在使用谷歌可乐,请跟随这个 IPython 笔记本或这个可乐演示。确保为 GPU 安装提供了适当版本的 CUDA 和 CUDNN。访问 TensorFlow 页面上的官方下载说明,点击此处代码:导入库

Python 3

# Install TensorFlow 2.0 by using the following command
# For CPU installation
# pip install -q tensorflow == 2.0
# For GPU installation (CUDA and CuDNN must be available)
# pip install -q tensorflow-gpu == 2.0

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import tensorflow as tf
print(tf.__version__)

确认适当的 TF 下载后,导入其他依赖项进行数据扩充,并定义如下所示的自定义函数。标准缩放器通过转换列来缩放数据。当使用 tf 时,get_random_block_from_data 函数很有用。渐变带 执行自动渐变(自动微分)获得渐变。

Python 3

import numpy as np
import sklearn.preprocessing as prep
import tensorflow.keras.layers as layers

def standard_scale(X_train, X_test):
    preprocessor = prep.StandardScaler().fit(X_train)
    X_train = preprocessor.transform(X_train)
    X_test = preprocessor.transform(X_test)
    return X_train, X_test

def get_random_block_from_data(data, batch_size):
    start_index = np.random.randint(0, len(data) - batch_size)
    return data[start_index:(start_index + batch_size)]

自动编码器可能具有有损中间表示,也称为压缩表示。这种降维在存在无损图像数据压缩的大量用例中是有用的。因此,我们可以说自动编码器的编码器部分对数据的密集表示进行编码。这里我们将使用 TensorFlow 子类化 API 为编码器和解码器定义自定义层。

Python 3

class Encoder(tf.keras.layers.Layer):
    '''Encodes a digit from the MNIST dataset'''

    def __init__(self,
                n_dims,
                name ='encoder',
                **kwargs):
        super(Encoder, self).__init__(name = name, **kwargs)
        self.n_dims = n_dims
        self.n_layers = 1
        self.encode_layer = layers.Dense(n_dims, activation ='relu')

    @tf.function       
    def call(self, inputs):
        return self.encode_layer(inputs)

class Decoder(tf.keras.layers.Layer):
    '''Decodes a digit from the MNIST dataset'''

    def __init__(self,
                n_dims,
                name ='decoder',
                **kwargs):
        super(Decoder, self).__init__(name = name, **kwargs)
        self.n_dims = n_dims
        self.n_layers = len(n_dims)
        self.decode_middle = layers.Dense(n_dims[0], activation ='relu')
        self.recon_layer = layers.Dense(n_dims[1], activation ='sigmoid')

    @tf.function       
    def call(self, inputs):
        x = self.decode_middle(inputs)
        return self.recon_layer(x)

然后我们扩展 来定义一个自定义模型,该模型利用我们之前定义的自定义层来形成自动编码器模型。当数据可用于模型对象时,调用函数被覆盖,这是前向传递。请注意 @tf.function 函数装饰器。它确保函数的执行发生在一个图形中,这加快了我们的执行速度。

Python 3

class Autoencoder(tf.keras.Model):
    '''Vanilla Autoencoder for MNIST digits'''

    def __init__(self,
                 n_dims =[200, 392, 784],
                 name ='autoencoder',
                 **kwargs):
        super(Autoencoder, self).__init__(name = name, **kwargs)
        self.n_dims = n_dims
        self.encoder = Encoder(n_dims[0])
        self.decoder = Decoder([n_dims[1], n_dims[2]])

    @tf.function       
    def call(self, inputs):
        x = self.encoder(inputs)
        return self.decoder(x)

下面的代码块准备数据集,并在训练自动编码器之前准备好要输入函数预处理流水线的数据。

Python 3

mnist = tf.keras.datasets.mnist

(X_train, _), (X_test, _) = mnist.load_data()
X_train = tf.cast(np.reshape(
        X_train, (X_train.shape[0],
                  X_train.shape[1] * X_train.shape[2])), tf.float64)
X_test = tf.cast(
        np.reshape(X_test,
                   (X_test.shape[0],
                    X_test.shape[1] * X_test.shape[2])), tf.float64)

X_train, X_test = standard_scale(X_train, X_test)

TensorFlow 的最佳实践是使用 tf.data.Dataset 从数据集快速获取混洗批次的张量切片进行训练。下面的代码块演示了 tf.data 的使用,并定义了用于训练 AutoEncoder 模型的超参数。

Python 3

train_data = tf.data.Dataset.from_tensor_slices(
        X_train).batch(128).shuffle(buffer_size = 1024)
test_data = tf.data.Dataset.from_tensor_slices(
        X_test).batch(128).shuffle(buffer_size = 512)

n_samples = int(len(X_train) + len(X_test))
training_epochs = 20
batch_size = 128
display_step = 1

optimizer = tf.optimizers.Adam(learning_rate = 0.01)
mse_loss = tf.keras.losses.MeanSquaredError()
loss_metric = tf.keras.metrics.Mean()

我们已经完成了训练自动编码器模型的所有先决条件!我们剩下要做的就是定义一个 AutoEncoder 对象,并在调用 model 之前用优化器和 loss 编译模型。瞧啊。您可以看到损耗降低,自动编码器性能提高!

Python 3

ae = Autoencoder([200, 392, 784])
ae.compile(optimizer = tf.optimizers.Adam(0.01),
           loss ='categorical_crossentropy')
ae.fit(X_train, X_train, batch_size = 64, epochs = 5)

你可以在这里查看 IPython 笔记本,在这里查看我提交给 TensorFlow 的 colab 演示。跟着我上 GitHub