如何在使用张量流作为后端时计算keras中的kl偏差?我按如下方式计算L1损失:
def l1_loss(y_true, y_pred):
return K.sum(K.abs(y_pred - y_true), axis=-1)
答案 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。