我想编写一个自定义损失函数,对喀拉拉山的梯度施加约束。例如l2正则化。
def Custom_loss(model,X,y):
def loss(y_true,y_pred):
return K.categorical_crossentropy(y_true, y_pred) + l2(get_gradients(model,X,y)
return loss
get_gradients的代码是:
def get_gradients(model, inputs, outputs):
grads = model.optimizer.get_gradients(model.total_loss, model.trainable_weights)
symb_inputs = (model._feed_inputs + model._feed_targets + model._feed_sample_weights)
f = K.function(symb_inputs, grads)
x, y, sample_weight = model._standardize_user_data(inputs, outputs)
output_grad = f(x + y + sample_weight)
return output_grad
但是它输出错误
InvalidArgumentError(请参阅上面的回溯):您必须使用dtype float和shape [?]输入占位符张量'dense_1_sample_weights'的值。 [[节点:deny_1_sample_weights = Placeholderdtype = DT_FLOAT,shape = [?],_ device =“ / job:localhost /副本:0 / task:0 / device:CPU:0”]]
当我计算损失函数之外的梯度时,它可以正常运行。 为什么我不能计算损失函数中的梯度?如果可以,应该如何更改代码?谢谢。