在 Keras 中实现一个自定义损失函数,术语类似于 l1 正则化



我正在创建自己的损失函数(我想在 Keras 中用于急切执行(。 我想添加一个类似于 l1 损失函数的术语。

这就是我现在使用的损失函数

def loss(model, x, y, x_dev, y_dev, variables):
y_ = model(x)
y_dev_ = model(x_dev)
y_temp = 1.5
return loss_mae(y_true=y, y_pred=y_)+y_temp*
K.mean(tf.convert_to_tensor(variables))

import keras.backend as K
def loss_mae(y_true, y_pred):
return K.mean(K.abs(y_pred-y_true))

我的想法是在我的损失函数中添加一个常数(y_temp(,然后我想将其乘以可训练变量(以实现类似于 L1 正则化项(。

我尝试传递给loss()函数model.trainable_variables但这不起作用,我得到了一个

TypeError: can't multiply sequence by non-int of type 'numpy.float32'

有人有什么建议吗?

你收到这个错误的原因是因为在Python中你的表达式y_temp*variables意思是"variablesy_temp时间并将它们合并为一个sequence"。

换句话说,2 * [1, 2, 3]不是[4, 5, 6],而是[1, 2, 3, 1, 2, 3]。显然,在这种情况下使用整数以外的任何东西都没有意义。

如果我理解正确,您正在尝试执行逐元素乘法。要实现这一点,你应该使用列表理解,类似于[x * 1.5 for x in [1, 2, 3]]

顺便说一下,您还可以查看类似问题的答案: Python 不能将序列乘以类型为"float"的非 int,以及如何将列表中的每个元素乘以一个数字?

最新更新