添加自定义正则化-包括有关层偏差项的信息

时间:2019-01-28 16:40:14

标签: keras keras-layer regularized

在keras.regularizers中,可以选择添加一个自定义的正则化器。 keras手册中的示例:

def l1_reg(weight_matrix):
    return 0.01 * K.sum(K.abs(weight_matrix))

但是我想使用包含图层权重和图层偏差的函数对图层进行正则化(图层激活中的b矢量:z = Wx + b)

例如,我想拥有正则化器:

def l1_special_reg(weight_matrix,bias_vector):
    return 0.01 * K.sum(K.abs(weight_matrix)-K.abs(bias_vector))

但是我找不到在哪里可以定义将偏差向量添加为keras.regularizers的输入

谢谢

2 个答案:

答案 0 :(得分:1)

在 TensorFlow 2 中,这可以通过 model.add_loss() 函数实现。假设您有某个层的权重和偏置张量:

w, b = layer.trainable_weights()

然后您可以通过向 model 对象添加正则化函数损失项来正则化该层,如下所示:

def l1_special_reg(weight_matrix, bias_vector):
    return 0.01 * K.sum(K.abs(weight_matrix)-K.abs(bias_vector))

model.add_loss(l1_special_reg(w, b))

当然,您可以对每一层独立执行此操作。

答案 1 :(得分:0)

您可以调用layer[idx].trainable_weights,它将同时返回weightsbias。之后,您可以按如下所示在模型损失函数中手动添加该正则化损失:

model.layers[-1].trainable_weights

[<tf.Variable 'dense_2/kernel:0' shape=(100, 10) dtype=float32_ref>,
 <tf.Variable 'dense_2/bias:0' shape=(10,) dtype=float32_ref>]

带有损失函数的完整示例:

# define model
def l1_reg(weight_matrix):
    return 0.01 * K.sum(K.abs(weight_matrix))

wts = model.layers[-1].trainable_weights # -1 for last dense layer.
reg_loss = l1_reg(wts[0]) + l1_reg(wts[1])

def custom_loss(reg_loss):
    def orig_loss(y_true, y_pred):
        return K.categorical_crossentropy(y_true, y_pred) + reg_loss
    return orig_loss

model.compile(loss=custom_loss(reg_loss),
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])