在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的输入
谢谢
答案 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
,它将同时返回weights
和bias
。之后,您可以按如下所示在模型损失函数中手动添加该正则化损失:
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'])