Keras 变分自动编码器示例 - 潜在输入的使用
Keras variational autoencoder example - usage of latent input
我是 Keras 的新手,一直在努力理解变量 z
在其官方 github 的变分自动编码器示例中的用法。我不明白为什么不使用 z
而不是变量 latent_inputs
。我 运行 代码似乎可以工作,但我不明白 z
是否在幕后使用以及 Keras 中负责它的机制是什么。
这是相关的代码片段:
# VAE model = encoder + decoder
# build encoder model
inputs = Input(shape=input_shape, name='encoder_input')
x = Dense(intermediate_dim, activation='relu')(inputs)
z_mean = Dense(latent_dim, name='z_mean')(x)
z_log_var = Dense(latent_dim, name='z_log_var')(x)
# use reparameterization trick to push the sampling out as input
# note that "output_shape" isn't necessary with the TensorFlow backend
z = Lambda(sampling, output_shape=(latent_dim,), name='z')([z_mean, z_log_var])
# instantiate encoder model
encoder = Model(inputs, [z_mean, z_log_var, z], name='encoder')
encoder.summary()
plot_model(encoder, to_file='vae_mlp_encoder.png', show_shapes=True)
# build decoder model
latent_inputs = Input(shape=(latent_dim,), name='z_sampling')
x = Dense(intermediate_dim, activation='relu')(latent_inputs)
outputs = Dense(original_dim, activation='sigmoid')(x)
# instantiate decoder model
decoder = Model(latent_inputs, outputs, name='decoder')
decoder.summary()
plot_model(decoder, to_file='vae_mlp_decoder.png', show_shapes=True)
# instantiate VAE model
outputs = decoder(encoder(inputs)[2])
vae = Model(inputs, outputs, name='vae_mlp')
您的 encoder
被定义为接受输入 inputs
并给出输出 [z_mean, z_log_var, z]
的模型。然后,您单独定义解码器以获取一些输入,此处称为 latent_inputs
,并输出 outputs
。最后,您的整体模型在以下行中定义:
outputs = decoder(encoder(inputs)[2])
这意味着您将在 inputs
上进行 运行 encoder
,这会产生 [z_mean, z_log_var, z]
,然后是其中的第三个元素(称之为 result[2]
) 作为输入参数传递给 decoder
。换句话说,当您实现您的网络时,您将 latent_inputs
设置为等于编码器的第三个输出,或 [z_mean, z_log_var, z][2] = z
。您可以将其视为(可能不是有效代码):
encoder_outputs = encoder(inputs) # [z_mean, z_log_var, z]
outputs = decoder(latent_inputs=encoder_outputs[2]) # latent_inputs = z
他们只是分别定义了编码器和解码器,这样就可以单独使用了:
给定一些 inputs
,encoder
计算它们的潜在向量/较低的表示 z_mean, z_log_var, z
(您可以单独使用 encoder
,例如存储那些低维表示,或者为了更容易比较)。
给定这样一个低维表示latent_inputs
,decoder
returns解码信息outputs
(例如,如果你需要重用存储的较低的表示法)。
到 train/use 完整的 VAE,两个操作都可以按照它们实际执行的方式链接起来:outputs = decoder(encoder(inputs)[2])
(decoder
的 latent_inputs
接收 z
encoder
).
的输出
我是 Keras 的新手,一直在努力理解变量 z
在其官方 github 的变分自动编码器示例中的用法。我不明白为什么不使用 z
而不是变量 latent_inputs
。我 运行 代码似乎可以工作,但我不明白 z
是否在幕后使用以及 Keras 中负责它的机制是什么。
这是相关的代码片段:
# VAE model = encoder + decoder
# build encoder model
inputs = Input(shape=input_shape, name='encoder_input')
x = Dense(intermediate_dim, activation='relu')(inputs)
z_mean = Dense(latent_dim, name='z_mean')(x)
z_log_var = Dense(latent_dim, name='z_log_var')(x)
# use reparameterization trick to push the sampling out as input
# note that "output_shape" isn't necessary with the TensorFlow backend
z = Lambda(sampling, output_shape=(latent_dim,), name='z')([z_mean, z_log_var])
# instantiate encoder model
encoder = Model(inputs, [z_mean, z_log_var, z], name='encoder')
encoder.summary()
plot_model(encoder, to_file='vae_mlp_encoder.png', show_shapes=True)
# build decoder model
latent_inputs = Input(shape=(latent_dim,), name='z_sampling')
x = Dense(intermediate_dim, activation='relu')(latent_inputs)
outputs = Dense(original_dim, activation='sigmoid')(x)
# instantiate decoder model
decoder = Model(latent_inputs, outputs, name='decoder')
decoder.summary()
plot_model(decoder, to_file='vae_mlp_decoder.png', show_shapes=True)
# instantiate VAE model
outputs = decoder(encoder(inputs)[2])
vae = Model(inputs, outputs, name='vae_mlp')
您的 encoder
被定义为接受输入 inputs
并给出输出 [z_mean, z_log_var, z]
的模型。然后,您单独定义解码器以获取一些输入,此处称为 latent_inputs
,并输出 outputs
。最后,您的整体模型在以下行中定义:
outputs = decoder(encoder(inputs)[2])
这意味着您将在 inputs
上进行 运行 encoder
,这会产生 [z_mean, z_log_var, z]
,然后是其中的第三个元素(称之为 result[2]
) 作为输入参数传递给 decoder
。换句话说,当您实现您的网络时,您将 latent_inputs
设置为等于编码器的第三个输出,或 [z_mean, z_log_var, z][2] = z
。您可以将其视为(可能不是有效代码):
encoder_outputs = encoder(inputs) # [z_mean, z_log_var, z]
outputs = decoder(latent_inputs=encoder_outputs[2]) # latent_inputs = z
他们只是分别定义了编码器和解码器,这样就可以单独使用了:
给定一些
inputs
,encoder
计算它们的潜在向量/较低的表示z_mean, z_log_var, z
(您可以单独使用encoder
,例如存储那些低维表示,或者为了更容易比较)。给定这样一个低维表示
latent_inputs
,decoder
returns解码信息outputs
(例如,如果你需要重用存储的较低的表示法)。
到 train/use 完整的 VAE,两个操作都可以按照它们实际执行的方式链接起来:outputs = decoder(encoder(inputs)[2])
(decoder
的 latent_inputs
接收 z
encoder
).