python - Keras 自定义损失函数不返回任何内容

标签 python machine-learning keras autoencoder

我正在尝试编写变分自动编码器的实现,但是我在损失函数方面面临一些困难:

 def vae_loss(sigma, mu):
        def loss(y_true, y_pred):
            recon = K.sum(K.binary_crossentropy(y_true, y_pred), axis=-1)
            kl = 0.5 * K.sum(K.exp(sigma) + K.square(mu) - 1. - sigma, axis=-1)
            return recon + kl
        return loss

二元交叉熵部分工作正常,但每当我仅返回散度项 kl 进行测试时,我都会收到以下错误: ValueError:“尝试将‘x’转换为张量但失败。错误:不支持任何值。”。

我期待关于我做错了什么的可能提示。您将在下面找到我的完整代码。感谢您的宝贵时间!

import numpy as np
from keras import Model
from keras.layers import Input, Dense, Lambda
import keras.backend as K
from keras.datasets import mnist
from matplotlib import pyplot as plt

class VAE(object):

    def __init__(self, n_latent, batch_size):

        self.encoder, self.encoder_input, self.mu, self.sigma = self.create_encoder(n_latent, batch_size)
        self.decoder, self.decoder_input, self.decoder_output = self.create_decoder(n_latent, batch_size)
        pipeline = self.decoder(self.encoder.outputs[0])

        def vae_loss(sigma, mu):
            def loss(y_true, y_pred):
                recon = K.sum(K.binary_crossentropy(y_true, y_pred), axis=-1)
                kl = 0.5 * K.sum(K.exp(sigma) + K.square(mu) - 1. - sigma, axis=-1)
                return recon + kl
            return loss

        self.VAE = Model(self.encoder_input, pipeline)
        self.VAE.compile(optimizer="adadelta", loss=vae_loss(self.sigma, self.mu))

    def create_encoder(self, n_latent, batch_size):

        input_layer = Input(shape=(784,))
        #net = Dense(512, activation="relu")(input_layer)
        mu = Dense(n_latent, activation="linear")(input_layer)
        print(mu)
        sigma = Dense(n_latent, activation="linear")(input_layer)

        def sample_z(args):
            mu, log_sigma = args
            eps = K.random_normal(shape=(K.shape(input_layer)[0], n_latent), mean=0., stddev=1.)
            K.print_tensor(K.shape(eps))
            return mu + K.exp(log_sigma / 2) * eps

        sample_z = Lambda(sample_z)([mu, sigma])

        model = Model(inputs=input_layer, outputs=[sample_z, mu, sigma])
        return model, input_layer,  mu, sigma

    def create_decoder(self, n_latent, batch_size):

        input_layer = Input(shape=(n_latent,))
        #net = Dense(512, activation="relu")(input_layer)
        reconstruct = Dense(784, activation="linear")(input_layer)

        model = Model(inputs=input_layer, outputs=reconstruct)
        return model, input_layer, reconstruct

最佳答案

我假设当您在反向传播期间“测试”/调试训练阶段时会出现错误(如果我错了,请告诉我)。

如果是这样,问题在于您要求 Keras 优化整个网络 (model.VAE.fit(...)),同时使用损失 (kl) >) 仅覆盖编码器部分。解码器的梯度保持未定义(没有像 recon 那样的损失覆盖它),导致优化错误。

出于调试目的,如果您尝试编译并仅适合具有此截断损失(kl)的编码器,或者如果您提出一个虚拟(可微分)损失覆盖,则错误将会消失还有解码器(例如 K.sum(y_pred - y_pred, axis=-1) + kl)。

关于python - Keras 自定义损失函数不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50061187/

相关文章:

python - Pandas - 根据具有重复名称的重复键值对列 reshape 数据框列

java - 用于保存感知器数据的自定义类 - 可能未正确填充

python - Keras Sklearn RandomizedSearchCV GPU OOM 错误

python - 将 InputLayer 添加到现有 Keras 模型以与 Android Tensor Flow Library 一起使用

python - 如何从文本文档中查找常用短语

python - 使用开始日期和结束日期进行左连接

python - 在不影响用户的情况下重新启动 Web 服务器?

MATLAB - 需要从文本列文件创建元胞数组

machine-learning - 协同过滤添加新用户和项目

machine-learning - Keras,自定义图像数据集,带百分比的二进制结果