keras中的KL分歧(tensorflow后端)

时间:2017-04-24 23:12:14

标签: tensorflow keras

如何在使用张量流作为后端时计算keras中的kl偏差?我按如下方式计算L1损失:

def l1_loss(y_true, y_pred):
    return K.sum(K.abs(y_pred - y_true), axis=-1)

2 个答案:

答案 0 :(得分:4)

Keras已经实现了KL-divergence,因为可以看到here,代码只是:

def kullback_leibler_divergence(y_true, y_pred):
    y_true = K.clip(y_true, K.epsilon(), 1)
    y_pred = K.clip(y_pred, K.epsilon(), 1)
    return K.sum(y_true * K.log(y_true / y_pred), axis=-1)

所以只需使用kld,KLD或kullback_leibler_divergence作为损失。

答案 1 :(得分:0)

您可以简单地使用tf.keras.losses.kullback_leibler_divergence函数。

如果要将其用作活动正则化器,则可以创建一个简单的正则化函数:

import keras # if using keras
# from tensorflow import keras # if using tf.keras
kullback_leibler_divergence = keras.losses.kullback_leibler_divergence
K = keras.backend

def kl_divergence_regularizer(inputs):
    means = K.mean(inputs, axis=0)
    return 0.01 * (kullback_leibler_divergence(0.05, means)
                 + kullback_leibler_divergence(1 - 0.05, 1 - means))

在此示例中,0.01是正则化权重,而0.05是稀疏度目标。然后像这样使用它:

keras.layers.Dense(32, activation="sigmoid",
                   activity_regularizer=kl_divergence_regularizer)

例如,这将是稀疏自动编码器的编码层。

请注意,kullback_leibler_divergence期望所有的类概率,即使在二进制分类的情况下(仅给出正的类概率是不够的)。这就是为什么我们在上面的函数中计算0.05和1-0.05的KLD。