2

Keras文档为权重正则化和偏差正则化引入了单独的类。这些可以是添加自定义正则化器的子类。Keras 文档中的一个示例:

def my_regularizer(x):
    return 1e-3 * tf.reduce_sum(tf.square(x))

其中 x 可以是内核权重或偏差权重。但是,我想使用包含层权重和层偏差的函数来规范我的层。有没有办法将这两者合并到一个函数中?

例如,我想作为正则化器:

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

谢谢,

4

2 回答 2

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))

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

于 2021-03-17T16:31:08.080 回答
1

你可以打电话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'])
于 2019-01-28T19:31:10.130 回答