目录
问题描述:
从图像的潜在空间中采样,并创建全新图像或编辑现有图像,这是目前最流行也是最成 功的创造性人工智能应用。在图像生成该领域中两种主要技术分别是变分自编码器(VAE, variational autoencoder)和生成式对抗网络(GAN,generative adversarial network)。
GAN 和 VAE 是两种不同的策略,每种策略都有各自的特点。VAE 非常适合用于学习具有良好结构的潜在空间,其中特定方向表示数据中有意义的变化轴。GAN 生成的图像可能非常逼真,但它的潜在空间可能没有良好结构,也没有足够的连续性
代码展示:
VAE代码段
#vae编码器网络
from tensorflow import keras
from tensorflow.keras import layers
latent_dim = 2
encoder_inputs = keras.Input(shape=(28, 28, 1))
x = layers.Conv2D(32, 3, activation="relu", strides=2, padding="same")(encoder_inputs)
x = layers.Conv2D(64, 3, activation="relu", strides=2, padding="same")(x)
x = layers.Flatten()(x)
x = layers.Dense(16, activation="relu")(x)
z_mean = layers.Dense(latent_dim, name="z_mean")(x)
z_log_var = layers.Dense(latent_dim, name="z_log_var")(x)
encoder = keras.Model(encoder_inputs, [z_mean, z_log_var], name="encoder")
encoder.summary()
#潜在空间采样函数
import tensorflow as tf
class Sampler(layers.Layer):
def call(self,z_mean,z_log_var):
batch_size = tf.shape(z_mean)[0]
z_size = tf.shape(z_mean)[1]
epsilon = tf.random.normal(shape=(batch_size,z_size))
return z_mean + tf.exp(0.5* z_log_var) *epsilon
# VAE 解码器网络 将潜在空间点映射为图像
latent_inputs = keras.Input(shape=(latent_dim,))
x = layers.Dense(7*7*64,activation='relu')(latent_inputs)
x = layers.Reshape((7,7,64))(x)
x =layers.Conv2DTranspose(64,3,activation='relu',strides=2,padding='same')(x)
x =layers.Conv2DTranspose(32,3,activation='relu',strides=2,padding='same')(x)
decoder_outputs = layers.Conv2D(1,3,activation='sigmoid',padding='same')(x)
decoder = keras.Model(latent_inputs,decoder_outputs,name='decoder')
decoder.summary()
# 用于计算 VAE 损失的自定义层
class VAE(keras.Model):
def __init__(self,encoder,decoder,**kwargs):
super().__init__(**kwargs)
self.encoder = encoder
self.decoder = decoder
self.sampler = Sampler()
self.total_loss_tracker = keras.metrics.Mean(name='total_loss')
self.reconstruction_loss_t

最低0.47元/天 解锁文章

8302

被折叠的 条评论
为什么被折叠?



