如何在一个正则化函数中正则化一层的内核权重偏置权重?

问题描述 投票:2回答:1

Keras文件 为权重正则化和偏置正则化引入了单独的类。这些类可以作为子类来添加一个自定义的正则化器。这是Keras文档中的一个例子,其中x可以是内核权重,也可以是偏置权重。

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

谢谢你

keras tensorflow2.0 keras-layer regularized
1个回答
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'])
© www.soinside.com 2019 - 2024. All rights reserved.