这是VAE的损失函数,我有点受其困扰。最后一行是生成误差,因为无法在形状为[?,2]和[?,784]的两个张量之间进行加法运算,这是完全有效的,因为kl_loss在潜矢量的均值和标准偏差之间,而重建损失是二进制交叉熵。 T
def vae_loss(original_image,reconstructed_image):
# E P(X|Z)
reconstruction_loss = K.sum(original_image*(K.log(reconstructed_image))+ (1-original_image)*K.log(1-reconstructed_image),axis=1)
kl_loss = 0.5*K.sum(K.exp(log_stddev) + K.square(mean) -1 - log_stddev,axis=1)
return kl_loss+reconstruction_loss
在这里,我通过以下函数给潜在向量建模
def create_latent_vector(args):
mean,log_stddev = args
epsilon = K.random_normal(shape = (batch_size,latent_vector_dimension), mean=0,stddev = 1.0)
return mean + K.exp(log_stddev*0.5)*epsilon
批处理大小为32,而latent_vector_dimension为2。发生尺寸错误绝对有效,但我无法解决。如何在大小[?,2]的kl_loss和大小为784的construction_loss之间匹配大小?顺便说一下,数据是简单的。
答案 0 :(得分:0)
在您的kl_loss
中,潜在代码中的每个随机变量都有一个术语,只需按最后一个轴求和即可得到形状[?]
的损失,即每批元素的损失。
就您的reconstruction_loss
而言,它应该已经是[?]
而不是[?, 784]
的形状,因为您已经沿着我认为是扁平像素轴的方向求和了。