Python 自定义损失函数-Keras-

Python 自定义损失函数-Keras-,python,tensorflow,keras,autoencoder,Python,Tensorflow,Keras,Autoencoder,我试图实现一个混合模型,其中一部分是一个变分自动编码器,另一部分利用潜在空间并对输入的属性进行预测。我想联合训练这两个模特。以下是我的模型: # build encoder model inputs = Input(shape=input_shape, name='encoder_input') x = Dense(intermediate_dim1, activation='relu')(inputs) x1 = Dense(intermediate_dim2, activation='rel

我试图实现一个混合模型,其中一部分是一个变分自动编码器,另一部分利用潜在空间并对输入的属性进行预测。我想联合训练这两个模特。以下是我的模型:

# build encoder model
inputs = Input(shape=input_shape, name='encoder_input')
x = Dense(intermediate_dim1, activation='relu')(inputs)
x1 = Dense(intermediate_dim2, activation='relu')(x)
x2 = Dense(intermediate_dim3, activation='relu')(x1)
z_mean = Dense(latent_dim, name='z_mean')(x2)
z_log_var = Dense(latent_dim, name='z_log_var')(x2)

# 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')
这是一个完整的模型,它具有编码器的输入,并且只有预测模型的输出

#build full model
vaeOutputs = decoder(encoder(inputs)[2])
predOutputs = predModel(encoder(inputs)[0])
vaePred = Model(inputs, [vaeOutputs,predOutputs], name='vae_fullimage')
vaePred.summary()
现在我很难定义损失函数并训练模型:

这是我的尝试:

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    help_ = "Load h5 model trained weights"
    parser.add_argument("-w", "--weights", help=help_)
    help_ = "Use mse loss instead of binary cross entropy (default)"
    parser.add_argument("-m",
                        "--mse",
                        help=help_, action='store_true')
    #args = parser.parse_args()
    args = parser.parse_known_args()[0]
    models = (encoder, decoder)
    def custom_loss(y_true, y_pred):
            kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var)
            kl_loss = K.sum(kl_loss, axis=-1)
            kl_loss *= -0.5

            reconstruction_loss = binary_crossentropy(y_true[0], y_pred[0])
            reconstruction_loss*= original_dim

            #y_pred = predOutputs

            prediction_loss =K.square(y_pred[1] - y_true[1])

            total_loss =  K.mean(prediction_loss, axis= -1) + K.mean (reconstruction_loss) + K.mean(kl_loss)
            return total_loss

    optimizer =  keras.optimizers.Adam(learning_rate=0.001)
    vaePred.compile(optimizer, custom_loss)
    vaePred.summary()

    if args.weights:
        vaePred.load_weights(args.weights)
    else:
        # train the autoencoder
        history =vaePred.fit(x=x_train, y=[x_train,property_train],
                epochs=epochs,
                callbacks=callbacks,
                batch_size=batch_size,
                validation_data=(x_test, [x_test,property_test]))

似乎您正在培训自动编码器(AE)(一种试图预测自身的生成模型)。如果是完美的,则AE的输出应等于输入。因此,您应该将y_true更改为输入

更改:

prediction_loss = mse(y_true, predOutputs)
将是:

prediction_loss = mse(inputs, predOutputs)

注意:我没有运行或测试任何这段代码。这似乎是来自Keras的示例代码。

我定义了一个自定义损失(y_true,y_pred),并且只使用pred输出作为整个模型的输出。模型的一部分是变分自动编码器(VAE)这需要重建输入,另一部分则试图利用VAE的潜在空间来预测一些属性。我更新了代码。它现在运行没有错误,但它有一个跳跃的损失,当然…部分代码是AE。好吧,很高兴它现在适合你了……这不是你的问题吗?这是一个习惯,有一个问题,所以张贴…你现在已经编辑了原来的问题,我试图回答。你应该关闭/删除该问题,然后问下一个具体问题。跳跃性丢失是一个调整/架构的问题…第一步是延长运行时间或降低学习速度…没有人会为您这样做。好的,谢谢。是的,我明白。我想也许有人能发现代码有问题。它给出了非常奇怪的结果。但是,我认为我应该做更多的研究。非常感谢。
prediction_loss = mse(y_true, predOutputs)
prediction_loss = mse(inputs, predOutputs)