关于Keras变分自编码器获取瓶颈层Z变量的技术咨询
解答:获取VAE解码器输入端的瓶颈层数据
没错,训练完成后你确实需要用训练好的编码器对输入数据进行编码,才能得到送入解码器的瓶颈层数据(也就是你代码里的z变量)。结合你的代码细节,具体说明如下:
1. 直接用训练好的encoder生成z
你的encoder模型定义的输出是[z_mean, z_log_var, z],其中第三个输出就是通过重参数化技巧得到的采样隐向量——这正是解码器的输入。训练完成后,只需要给encoder传入你的输入数据,就能得到对应的z:
# 拿测试集数据举例,x_test是你的输入样本 z_mean, z_log_var, z = encoder.predict(x_test)
得到z之后,就可以直接送入decoder生成重构结果:
reconstructed_images = decoder.predict(z)
2. 可选:用z_mean代替z(更稳定的解码)
如果你不需要解码时的随机性,也可以直接使用z_mean作为解码器的输入。因为z是从以z_mean为均值、由z_log_var推导的方差的正态分布中采样得到的,用z_mean解码会得到分布均值对应的输出,结果更稳定:
reconstructed_images = decoder.predict(z_mean)
3. 对应你代码中的逻辑
你的VAE训练时,是通过encoder(inputs)[2]获取z再传入解码器的,这和训练后用encoder.predict获取z的逻辑完全一致——区别只是训练时是在计算图内完成前向传播,而预测时是对外部输入数据进行编码生成隐向量。
内容的提问来源于stack exchange,提问作者Domen Preložnik
相关产品推荐
相关产品推荐

