VAE は生成モデルで、正式名は variational autoencoder、中国語訳は変分オートエンコーダーです。これは、画像、音声、テキストなどの新しいデータを生成するために使用できる教師なし学習アルゴリズムです。通常のオートエンコーダと比較して、VAE はより柔軟で強力であり、より複雑で現実的なデータを生成できます。
Python は、最も広く使用されているプログラミング言語の 1 つであり、深層学習の主要ツールの 1 つです。 Python には、TensorFlow、PyTorch、Keras など、多くの優れた機械学習および深層学習フレームワークがあり、そのすべてに VAE が実装されています。
この記事では、Python コード例を使用して、TensorFlow を使用して VAE アルゴリズムを実装し、新しい手書き数字画像を生成する方法を紹介します。
VAE は、データから潜在的な特徴を抽出し、これらの特徴を使用して新しいデータを生成できる教師なし学習手法です。 VAE は、潜在変数の確率分布を考慮してデータの分布を学習します。元のデータを潜在空間にマッピングし、デコーダを通じて潜在空間を再構築データに変換します。
VAE のモデル構造には、エンコーダーとデコーダーの 2 つの部分が含まれています。エンコーダーは元のデータを潜在変数空間に圧縮し、デコーダーは潜在変数を元のデータ空間にマップし直します。エンコーダとデコーダの間には、潜在変数のサンプリングが微分可能であることを保証するための再パラメータ化層もあります。
VAE の損失関数は 2 つの部分で構成されており、1 つの部分は元のデータとデコーダによって生成されたデータの間の距離である再構成誤差であり、もう 1 つの部分は使用される正則化項です。潜在変数の分布を制限します。
MNIST データセットを使用して VAE モデルをトレーニングし、新しい手書きの数字画像を生成します。 MNIST データセットには手書きの数字画像のセットが含まれており、各画像は 28×28 のグレースケール画像です。
TensorFlow が提供する API を使用して、MNIST データセットをロードし、画像をベクトル形式に変換できます。コードは次のとおりです。
import tensorflow as tf import numpy as np # 加载MNIST数据集 mnist = tf.keras.datasets.mnist # 加载训练集和测试集 (x_train, y_train), (x_test, y_test) = mnist.load_data() # 将图像转换为向量形式 x_train = x_train.astype(np.float32) / 255. x_test = x_test.astype(np.float32) / 255. x_train = x_train.reshape((-1, 28 * 28)) x_test = x_test.reshape((-1, 28 * 28))
TensorFlow を使用して VAE モデルを実装できます。エンコーダとデコーダは両方とも多層ニューラル ネットワークであり、再パラメータ化層はランダム層です。
VAE モデルの実装コードは次のとおりです。
import tensorflow_probability as tfp # 定义编码器 encoder_inputs = tf.keras.layers.Input(shape=(784,)) x = tf.keras.layers.Dense(256, activation='relu')(encoder_inputs) x = tf.keras.layers.Dense(128, activation='relu')(x) mean = tf.keras.layers.Dense(10)(x) logvar = tf.keras.layers.Dense(10)(x) # 定义重参数化层 def sampling(args): mean, logvar = args epsilon = tfp.distributions.Normal(0., 1.).sample(tf.shape(mean)) return mean + tf.exp(logvar / 2) * epsilon z = tf.keras.layers.Lambda(sampling)([mean, logvar]) # 定义解码器 decoder_inputs = tf.keras.layers.Input(shape=(10,)) x = tf.keras.layers.Dense(128, activation='relu')(decoder_inputs) x = tf.keras.layers.Dense(256, activation='relu')(x) decoder_outputs = tf.keras.layers.Dense(784, activation='sigmoid')(x) # 构建模型 vae = tf.keras.models.Model(encoder_inputs, decoder_outputs) # 定义损失函数 reconstruction = -tf.reduce_sum(encoder_inputs * tf.math.log(1e-10 + decoder_outputs) + (1 - encoder_inputs) * tf.math.log(1e-10 + 1 - decoder_outputs), axis=1) kl_divergence = -0.5 * tf.reduce_sum(1 + logvar - tf.square(mean) - tf.exp(logvar), axis=-1) vae_loss = tf.reduce_mean(reconstruction + kl_divergence) vae.add_loss(vae_loss) vae.compile(optimizer='rmsprop') vae.summary()
コードを記述するときは、次の点に注意する必要があります。複雑なパラメータ化操作を実装するラムダ層
vae.fit(x_train, x_train, epochs=50, batch_size=128, validation_data=(x_test, x_test))
import matplotlib.pyplot as plt # 随机生成潜在变量 z = np.random.normal(size=(1, 10)) # 将潜在变量解码为图像 generated = vae.predict(z) # 将图像转换为灰度图像 generated = generated.reshape((28, 28)) plt.imshow(generated, cmap='gray') plt.show()
以上がPython での VAE アルゴリズムの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。